@appstorys/react-web 1.0.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/dist/index.d.mts +711 -0
- package/dist/index.d.ts +711 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +100 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/web/storage.ts","../src/core/store.ts","../src/core/getDeviceInfo.ts","../src/core/verifyAccount.ts","../src/core/identifyWidgetPositions.ts","../src/core/CaptureService.ts","../src/core/screenCapture.ts","../src/index.ts","../src/types/index.ts","../src/components/Banner/index.tsx","../src/hooks/useCampaigns.ts","../src/core/variantResolver.ts","../src/core/trackEvent.ts","../src/core/offlineQueue.ts","../src/core/campaignHelpers.ts","../src/components/Pip/index.tsx","../src/components/Floater/index.tsx","../src/core/trackScreen.ts","../src/core/setUserProperties.ts","../src/core/personalization.ts","../src/core/fetchAllCampaigns.ts","../src/core/reconcileUser.ts","../src/core/exitIntent.ts","../src/core/visibilityManager.ts","../src/core/userManagement.ts","../src/dev/showWidgetDebug.ts","../src/components/Story/index.tsx","../src/components/Story/StoryThumbnail.tsx","../src/components/Story/StoryGroupItem.tsx","../src/components/Story/StoryList.tsx","../src/components/Story/StoryOverlay.tsx","../src/components/common/InteractiveElements/PollSticker.tsx","../src/components/common/InteractiveElements/QuizSticker.tsx","../src/components/common/InteractiveElements/CountdownSticker.tsx","../src/components/common/InteractiveElements/PromoCodeSticker.tsx","../src/components/common/InteractiveElements/ReactionSticker.tsx","../src/components/common/InteractiveElements/RatingSticker.tsx","../src/components/common/InteractiveElements/QuestionSticker.tsx","../src/components/common/InteractiveElements/ImageQuizSticker.tsx","../src/components/common/InteractiveElements/ShopableSticker.tsx","../src/components/common/InteractiveElements/ShopableModal.tsx","../src/components/common/InteractiveElements/InteractiveItem.tsx","../src/utils/styleUtils.ts","../src/components/common/InteractiveElements/InteractiveOverlay.tsx","../src/components/common/CommonElements/PlayPauseButton.tsx","../src/components/common/CommonElements/Cta.tsx","../src/components/common/CommonElements/CrossButton.tsx","../src/components/common/CommonElements/SoundButton.tsx","../src/components/common/CommonElements/ShareButton.tsx","../src/components/Widget/index.tsx","../src/components/Tooltip/index.tsx","../src/components/BottomSheet/index.tsx","../src/components/Csat/index.tsx","../src/components/Survey/index.tsx"],"sourcesContent":["export class WebStorage {\n static async getItem(key: string): Promise<string | null> {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n }\n\n static async setItem(key: string, value: string): Promise<void> {\n try {\n localStorage.setItem(key, value);\n } catch {\n // Fallback for private mode or full storage\n }\n }\n\n static async removeItem(key: string): Promise<void> {\n try {\n localStorage.removeItem(key);\n } catch {}\n }\n}\n","import { create } from 'zustand';\nimport { AppStorysStore, Campaign, Attributes } from '../types';\nimport { WebStorage } from '../adapters/web/storage';\n\nexport interface AppStorysActions {\n setUserId: (userId: string) => void;\n setAppId: (appId: string) => void;\n setAccountId: (accountId: string) => void;\n setCurrentScreen: (screen: string) => void;\n saveCampaigns: (campaigns: Campaign[]) => void;\n saveAllCampaigns: (campaigns: Campaign[]) => void;\n setCampaignVersion: (version: number) => void;\n setTrackedEvents: (events: string[]) => void;\n setTrackedEventMetadata: (metadata: Record<string, Attributes[]>) => void;\n setAttributes: (attributes: Attributes) => void;\n setVisibility: (visible: boolean) => void;\n setIsAnonymousUser: (isAnonymous: boolean) => void;\n setVariantMappings: (mappings: Record<string, string>) => void;\n setPersonalizationData: (data: Record<string, string>) => void;\n setScreenCaptureEnabled: (enabled: boolean) => void;\n setBaseUrl: (baseUrl?: string) => void;\n setTrackingUrl: (trackingUrl?: string) => void;\n}\n\nconst useAppStorysStore = create<AppStorysStore & AppStorysActions>((set) => ({\n userId: '',\n appId: '',\n accountId: '',\n currentScreen: '',\n campaigns: [],\n allCampaigns: [],\n campaignVersion: 2,\n trackedEvents: [],\n trackedEventMetadata: {},\n isVisible: true,\n isAnonymousUser: false,\n variantMappings: {},\n personalizationData: {},\n screenCaptureEnabled: false,\n baseUrl: undefined,\n trackingUrl: undefined,\n \n saveCampaigns: (campaigns: Campaign[]) => set({ campaigns }),\n saveAllCampaigns: (campaigns: Campaign[]) => set({ allCampaigns: campaigns }),\n setCampaignVersion: (version: number) => set({ campaignVersion: version }),\n setUserId: (userId: string) => set({ userId }),\n setAppId: (appId: string) => set({ appId }),\n setAccountId: (accountId: string) => set({ accountId }),\n setCurrentScreen: (currentScreen: string) => set({ currentScreen }),\n setAttributes: (attributes: Attributes) => set({ attributes }),\n setTrackedEvents: (trackedEvents: string[]) => set({ trackedEvents }),\n setTrackedEventMetadata: (trackedEventMetadata: Record<string, Attributes[]>) => set({ trackedEventMetadata }),\n setVisibility: (isVisible: boolean) => set({ isVisible }),\n setIsAnonymousUser: (isAnonymousUser: boolean) => set({ isAnonymousUser }),\n setVariantMappings: (variantMappings: Record<string, string>) => set({ variantMappings }),\n setPersonalizationData: (personalizationData: Record<string, string>) => set({ personalizationData }),\n setScreenCaptureEnabled: (enabled: boolean) => set({ screenCaptureEnabled: enabled }),\n setBaseUrl: (baseUrl?: string) => set({ baseUrl }),\n setTrackingUrl: (trackingUrl?: string) => set({ trackingUrl }),\n}));\n\nexport function getAppId() {\n return useAppStorysStore.getState().appId;\n}\n\nexport function getUserId() {\n return useAppStorysStore.getState().userId;\n}\n\nexport async function getAccessToken() {\n return WebStorage.getItem('access_token');\n}\n\nexport function getVariantId(campaignId?: string) {\n if (!campaignId) return undefined;\n const id = String(campaignId || '').trim();\n if (!id) return undefined;\n return useAppStorysStore.getState().variantMappings?.[id];\n}\n\nexport function getCampaigns() {\n return useAppStorysStore.getState().campaigns;\n}\n\nexport function getAllCampaigns() {\n return useAppStorysStore.getState().allCampaigns;\n}\n\nexport function getCampaignVersion() {\n return useAppStorysStore.getState().campaignVersion;\n}\n\nexport default useAppStorysStore;\n","export default async function getDeviceInfo() {\n try {\n const deviceInfo: Record<string, any> = {\n browser: navigator.userAgent,\n language: navigator.language,\n platform: 'web',\n screen_width_px: window.innerWidth,\n screen_height_px: window.innerHeight,\n screen_density: window.devicePixelRatio,\n orientation: window.innerWidth < window.innerHeight ? \"portrait\" : \"landscape\",\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n };\n\n return deviceInfo;\n } catch (error) {\n console.error(\"Error fetching device info:\", error);\n return {};\n }\n}\n","import { WebStorage } from '../adapters/web/storage';\nimport getDeviceInfo from './getDeviceInfo';\nimport useAppStorysStore from './store';\n\nconst DEVICE_INFO_SENT_KEY = 'device_info_sent';\n\nexport default async function verifyAccount(accountId: string, appId: string, userId: string): Promise<boolean> {\n try {\n const requestBody: any = {\n account_id: accountId,\n app_id: appId,\n user_id: userId\n };\n\n const deviceInfoAlreadySent = await WebStorage.getItem(DEVICE_INFO_SENT_KEY);\n\n if (!deviceInfoAlreadySent) {\n // This is the very first initialization after app install\n const deviceInfo = await getDeviceInfo();\n requestBody.attributes = {\n ...deviceInfo\n };\n console.log('First time verification - including device info in attributes');\n } else {\n console.log('Device info already sent previously - skipping');\n }\n\n const state = useAppStorysStore.getState();\n const baseUrl = state.baseUrl || 'https://users.appstorys.co';\n\n const response = await fetch(`${baseUrl}/${accountId}/validate-account`, {\n method: 'POST',\n body: JSON.stringify(requestBody),\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n });\n\n console.log('Verify account body', requestBody);\n console.log('Verifying account', response.status, response.statusText);\n\n if (response.ok) {\n const data = await response.json();\n console.log('Account verified', data);\n const { access_token, refresh_token } = data;\n\n if (access_token && refresh_token) {\n await WebStorage.setItem('access_token', access_token);\n await WebStorage.setItem('refresh_token', refresh_token);\n\n // Mark device info as sent if it was included in this request\n if (requestBody.attributes) {\n await WebStorage.setItem(DEVICE_INFO_SENT_KEY, 'true');\n console.log('Device info sent flag set');\n }\n\n return true;\n }\n }\n return false;\n } catch (error) {\n console.error('Error when verifying AppStorys account', error);\n return false;\n }\n}\n","import { getAccessToken } from './store';\n\nexport default async function identifyWidgetPositions(screenName: string, positionList?: string[]) {\n if (!positionList || positionList.length === 0) {\n console.info('AppStorys: identifyWidgetPositions called with empty positionList; skipping');\n return;\n }\n\n const accessToken = await getAccessToken();\n if (!accessToken) {\n console.error('AppStorys: identifyWidgetPositions - access token not found');\n return;\n }\n\n try {\n const endpoint = 'https://backend.appstorys.co/api/v2/appinfo/identify-positions/';\n console.info('AppStorys: identifyWidgetPositions payload', { screen_name: screenName, position_list: positionList });\n const resp = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n },\n body: JSON.stringify({\n screen_name: screenName,\n position_list: positionList,\n }),\n });\n\n if (!resp.ok) {\n console.error('AppStorys: identifyWidgetPositions failed', resp.status, await resp.text());\n } else {\n console.info('AppStorys: identifyWidgetPositions OK');\n }\n } catch (err) {\n console.error('AppStorys: identifyWidgetPositions error', err);\n }\n}\n","import { getAccessToken, getUserId } from './store';\nimport verifyAccount from './verifyAccount';\nimport identifyWidgetPositions from './identifyWidgetPositions';\nimport useAppStorysStore from './store';\n\ntype LayoutFrame = {\n x: number;\n y: number;\n width: number;\n height: number;\n screenWidth?: number;\n screenHeight?: number;\n};\n\ntype LayoutInfo = { id: string; frame: LayoutFrame };\n\nconst layoutData: Record<string, LayoutInfo[]> = {};\n\nfunction normalizeWidgetId(id?: string) {\n if (!id) return id;\n return id.startsWith('widget_') ? id : `widget_${id}`;\n}\n\nfunction extractPositionsFromCampaigns(): string[] {\n try {\n const all = useAppStorysStore.getState().allCampaigns || [];\n const positions: string[] = [];\n\n all.forEach((c: any) => {\n if (c && c.position && typeof c.position === 'string') {\n positions.push(String(c.position));\n }\n\n try {\n if (c && c.campaign_type === 'WID' && c.details) {\n const d = c.details;\n if (typeof d === 'object') {\n if (d.id && typeof d.id === 'string') positions.push(String(d.id));\n if (d.variants && typeof d.variants === 'object') {\n Object.values(d.variants).forEach((v: any) => { if (v && v.id && typeof v.id === 'string') positions.push(String(v.id)); });\n }\n }\n }\n } catch (e) {\n // ignore per-campaign extraction errors\n }\n });\n\n return positions.filter((v): v is string => !!v).map((p) => normalizeWidgetId(String(p))!).filter((v): v is string => !!v);\n } catch (e) {\n return [];\n }\n}\nfunction mapServerPositionsToDOM(screenName: string) {\n try {\n const positions = extractPositionsFromCampaigns();\n if (!positions || positions.length === 0) return [];\n\n const mapped: string[] = [];\n\n positions.forEach((pos) => {\n const key = pos.replace(/^widget_/, '');\n // try multiple selectors to find the matching element\n const selectors = [\n `[data-as-id=\"${key}\"]`,\n `#${key}`,\n `.${key}`,\n `[data-widget=\"${key}\"]`,\n ];\n\n let el: Element | null = null;\n for (const sel of selectors) {\n el = document.querySelector(sel);\n if (el) break;\n }\n\n if (el) {\n const rect = el.getBoundingClientRect();\n const frame: LayoutFrame = {\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n screenWidth: window.innerWidth,\n screenHeight: window.innerHeight,\n };\n\n // store using the raw key (no widget_ prefix) so children JSON matches collected ids\n CaptureService.addLayoutInfo(screenName, key, frame);\n mapped.push(key);\n } else {\n // not found in DOM; skip\n }\n });\n\n console.info('AppStorys: mapServerPositionsToDOM mapped', mapped.length, 'server positions to DOM elements', mapped);\n return mapped;\n } catch (e) {\n console.warn('AppStorys: mapServerPositionsToDOM error', e);\n return [];\n }\n}\n\nfunction ensureList(screenName: string) {\n if (!layoutData[screenName]) layoutData[screenName] = [];\n return layoutData[screenName];\n}\n\n/**\n * Build a fresh FormData for the identify-elements request.\n */\nfunction buildFormData(\n screenName: string,\n userId: string,\n children: string,\n blob: Blob\n): FormData {\n const form = new FormData();\n \n // Sanitize screenName for filename\n const safeScreenName = screenName.replace(/[^a-z0-9]/gi, '_');\n const filename = `screenshot_${userId}_${safeScreenName}_${Date.now()}.png`;\n\n const file = new File([blob], filename, { type: 'image/png' });\n\n form.append('screenName', screenName);\n form.append('user_id', userId);\n form.append('children', children);\n form.append('screenshot', file);\n\n // Diagnostic logging\n try {\n console.groupCollapsed('AppStorys: FormData Payload Diagnostic');\n console.info(' screenName:', screenName);\n console.info(' user_id:', userId);\n console.info(' children:', JSON.parse(children));\n console.info(' screenshot:', file.name, `(${file.size} bytes)`);\n console.groupEnd();\n } catch (e) {\n console.warn('AppStorys: Could not run FormData diagnostics', e);\n }\n\n return form;\n}\n\nexport default class CaptureService {\n static setup(screenName: string, enabled: boolean) {\n const s = useAppStorysStore.getState();\n s.setScreenCaptureEnabled(enabled);\n s.setCurrentScreen(screenName);\n }\n\n /**\n * Manually add layout information for an element.\n */\n static addLayoutInfo(screenName: string, id: string, frame: LayoutFrame) {\n const list = ensureList(screenName);\n const idx = list.findIndex(l => l.id === id);\n \n // Auto-fill screen dimensions if missing\n const enrichedFrame: LayoutFrame = {\n ...frame,\n screenWidth: frame.screenWidth || window.innerWidth,\n screenHeight: frame.screenHeight || window.innerHeight,\n };\n\n const info = { id, frame: enrichedFrame };\n if (idx >= 0) list[idx] = info; else list.push(info);\n }\n\n /**\n * Automatically collect all elements marked with [data-as-id].\n */\n static collectElements(screenName: string) {\n this.clearLayoutData(screenName);\n const elements = document.querySelectorAll('[data-as-id]');\n const screenWidth = window.innerWidth;\n const screenHeight = window.innerHeight;\n const foundIds: string[] = [];\n\n elements.forEach((el) => {\n const id = el.getAttribute('data-as-id');\n if (id) {\n foundIds.push(id);\n const rect = el.getBoundingClientRect();\n this.addLayoutInfo(screenName, id, {\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n screenWidth,\n screenHeight\n });\n }\n });\n\n console.info(`AppStorys: Identified ${elements.length} elements:`, foundIds);\n }\n\n static clearLayoutData(screenName: string) {\n layoutData[screenName] = [];\n }\n\n static getLayoutData(screenName: string) {\n return layoutData[screenName] || [];\n }\n\n static async takeScreenshot(screenName: string, positionList?: string[]) {\n try {\n if (!screenName) {\n console.error('AppStorys: Screen name is required');\n return false;\n }\n\n console.info('AppStorys: Starting takeScreenshot for', screenName);\n\n const s = useAppStorysStore.getState();\n s.setCurrentScreen(screenName);\n\n // ── Step 0: Auto-collect elements before capture ──────────────────\n this.collectElements(screenName);\n\n // Also try to map server-declared widget positions to DOM elements\n try {\n const mapped = mapServerPositionsToDOM(screenName);\n if (mapped && mapped.length > 0) console.info('AppStorys: mapServerPositionsToDOM added', mapped.length, 'elements');\n } catch (e) {\n /* ignore */\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // ── Step 1: Capture ────────────────────────────────────────────────\n const win: any = window as any;\n let blob: Blob | null = null;\n\n if (typeof win.html2canvas !== 'function') {\n try {\n await new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js';\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load html2canvas'));\n document.head.appendChild(script);\n });\n } catch (loadErr) {\n console.warn('AppStorys: html2canvas load error', loadErr);\n }\n }\n\n if (typeof win.html2canvas === 'function') {\n try {\n const canvas = await win.html2canvas(document.documentElement, {\n useCORS: true,\n allowTaint: true,\n logging: false,\n scale: window.devicePixelRatio || 1,\n });\n blob = await new Promise<Blob | null>(resolve =>\n canvas.toBlob((b: Blob | null) => resolve(b), 'image/png')\n );\n } catch (err) {\n console.warn('AppStorys: html2canvas capture failed (falling back to getDisplayMedia)', err);\n blob = null;\n }\n }\n\n if (!blob && navigator.mediaDevices && (navigator.mediaDevices as any).getDisplayMedia) {\n try {\n const stream = await (navigator.mediaDevices as any).getDisplayMedia({ video: true });\n const video = document.createElement('video');\n video.srcObject = stream;\n await video.play();\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth || window.innerWidth;\n canvas.height = video.videoHeight || window.innerHeight;\n const ctx = canvas.getContext('2d');\n if (ctx) ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n blob = await new Promise<Blob | null>(resolve =>\n canvas.toBlob((b: Blob | null) => resolve(b), 'image/png')\n );\n video.pause();\n stream.getTracks().forEach((t: MediaStreamTrack) => t.stop());\n } catch (err) {\n console.warn('AppStorys: getDisplayMedia capture failed', err);\n }\n }\n\n if (!blob) {\n console.warn('AppStorys: Capture failed — no blob generated');\n return false;\n }\n\n // ── Step 2: Auth ──────────────────────────────────────────────────\n let accessToken = await getAccessToken();\n const userId = getUserId();\n\n if (!userId) {\n console.warn('AppStorys: No userId');\n return false;\n }\n\n if (!accessToken) {\n const state = useAppStorysStore.getState();\n if (state.accountId && state.appId && state.userId) {\n const refreshed = await verifyAccount(state.accountId, state.appId, state.userId);\n if (refreshed) accessToken = await getAccessToken();\n }\n }\n\n if (!accessToken) {\n console.warn('AppStorys: No token available');\n return false;\n }\n\n // ── Step 3: Send ───────────────────────────────────────────────────\n const endpoint = 'https://backend.appstorys.co/api/v1/appinfo/identify-elements/';\n const children = JSON.stringify(this.getLayoutData(screenName) || []);\n \n const body = buildFormData(screenName, userId, children, blob);\n \n console.info('AppStorys: Sending identify-elements with payload size:', children.length);\n\n let resp = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Accept': 'application/json'\n },\n body: body,\n });\n\n if (resp.status === 401) {\n console.warn('AppStorys: 401 response — retrying once');\n const state = useAppStorysStore.getState();\n if (state.accountId && state.appId && state.userId) {\n const refreshed = await verifyAccount(state.accountId, state.appId, state.userId);\n if (refreshed) {\n const newToken = await getAccessToken();\n if (newToken) {\n resp = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${newToken}`,\n 'Accept': 'application/json'\n },\n body: buildFormData(screenName, userId, children, blob),\n });\n }\n }\n }\n }\n\n if (!resp.ok) {\n const text = await resp.text();\n console.error('AppStorys: identify-elements failed', resp.status, text);\n return false;\n }\n\n console.info('AppStorys: identify-elements success ✓');\n\n // After identify-elements succeeds, call identifyWidgetPositions.\n // If caller didn't provide a `positionList`, derive it from collected layout data.\n try {\n let positionsToSend = positionList;\n let normalized: string[] = [];\n if (!positionsToSend || positionsToSend.length === 0) {\n const data = this.getLayoutData(screenName) || [];\n normalized = data.map(d => normalizeWidgetId(d.id)).filter((v): v is string => !!v);\n } else {\n normalized = positionsToSend.map(id => normalizeWidgetId(id)).filter((v): v is string => !!v);\n }\n\n // Merge with server-declared positions (dedupe)\n const serverPositions = extractPositionsFromCampaigns();\n const combined = Array.from(new Set<string>([...normalized, ...serverPositions]));\n console.info('AppStorys: identifyWidgetPositions will send', combined.length, 'positions (collected + server)', combined);\n await identifyWidgetPositions(screenName, combined);\n } catch (e) {\n console.warn('AppStorys: identifyWidgetPositions failed', e);\n }\n\n return true;\n } catch (err) {\n console.error('AppStorys: takeScreenshot error', err);\n return false;\n }\n }\n}\n\nexport type { LayoutFrame, LayoutInfo };\n\n// Dev helper: force a positions POST for the current screen\n;(function attachDevHelpers() {\n try {\n const win: any = window as any;\n win.AppStorysForceIdentifyPositions = async (screenName?: string) => {\n const s = useAppStorysStore.getState();\n const name = screenName || s.currentScreen;\n if (!name) {\n console.warn('AppStorys: AppStorysForceIdentifyPositions - no screen name available');\n return;\n }\n const data = CaptureService.getLayoutData(name) || [];\n const positions = data.map(d => normalizeWidgetId(d.id)).filter((v): v is string => !!v);\n console.info('AppStorys: AppStorysForceIdentifyPositions sending', positions.length, 'positions for', name, positions);\n try {\n await identifyWidgetPositions(name, positions);\n console.info('AppStorys: AppStorysForceIdentifyPositions completed');\n } catch (err) {\n console.error('AppStorys: AppStorysForceIdentifyPositions error', err);\n }\n };\n } catch (e) {\n /* ignore */\n }\n})();\n","import useAppStorysStore from './store';\nimport CaptureService from './CaptureService';\n\nfunction injectStyles() {\n if (document.getElementById('appstorys-capture-styles')) return;\n const style = document.createElement('style');\n style.id = 'appstorys-capture-styles';\n style.innerHTML = `\n @keyframes appstorys-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n .appstorys-spinner {\n width: 20px;\n height: 20px;\n border: 3px solid rgba(255,255,255,0.3);\n border-top: 3px solid #fff;\n border-radius: 50%;\n animation: appstorys-spin 0.8s linear infinite;\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction createButton(): HTMLButtonElement {\n injectStyles();\n const btn = document.createElement('button');\n btn.id = 'appstorys-screen-capture-btn';\n btn.title = 'Capture screen';\n Object.assign(btn.style, {\n position: 'fixed',\n left: '16px',\n bottom: '16px',\n width: '100px',\n height: '56px',\n borderRadius: '28px',\n background: '#ff6a00',\n color: '#fff',\n border: 'none',\n boxShadow: '0 6px 18px rgba(0,0,0,0.2)',\n zIndex: '2147483647',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '14px',\n fontWeight: '600',\n fontFamily: 'sans-serif',\n transition: 'all 0.2s ease'\n } as CSSStyleDeclaration);\n btn.innerText = 'Capture';\n return btn;\n}\n\nexport function mountScreenCaptureButton() {\n try {\n const state = useAppStorysStore.getState();\n const win: any = window as any;\n const debugForce = Boolean(win.__APPSTORYS_DEBUG_CAPTURE);\n console.info('AppStorys: mountScreenCaptureButton called, screenCaptureEnabled=', state.screenCaptureEnabled, 'debugForce=', debugForce);\n \n if (!state.screenCaptureEnabled && !debugForce) {\n return null;\n }\n\n if (document.getElementById('appstorys-screen-capture-btn')) return null;\n\n const btn = createButton();\n\n btn.addEventListener('click', async () => {\n btn.disabled = true;\n const originalText = btn.innerText;\n btn.innerHTML = '<div class=\"appstorys-spinner\"></div>';\n \n const s = useAppStorysStore.getState();\n const screenName = s.currentScreen || (typeof window !== 'undefined' ? window.location.pathname : '');\n \n try {\n await CaptureService.takeScreenshot(screenName);\n } catch (err) {\n console.error('CaptureService error', err);\n }\n \n btn.disabled = false;\n btn.innerText = originalText;\n btn.animate([{ transform: 'scale(1.0)' }, { transform: 'scale(1.05)' }, { transform: 'scale(1.0)' }], { duration: 300 });\n });\n\n document.body.appendChild(btn);\n console.info('AppStorys: screen capture button mounted');\n return btn;\n } catch (err) {\n console.error('mountScreenCaptureButton error', err);\n return null;\n }\n}\n\n// Expose a helper for dev to mount manually from console\ntry {\n (window as any).AppStorysMountCapture = function() {\n try {\n return mountScreenCaptureButton();\n } catch (e) {\n console.error('AppStorysMountCapture failed', e);\n return null;\n }\n };\n} catch (e) {\n // ignore\n}\n\n// Expose a helper to inspect store state from the console\ntry {\n (window as any).AppStorysDebugState = function() {\n try {\n const s = useAppStorysStore.getState();\n console.info('AppStorys store state:', s);\n return s;\n } catch (e) {\n console.error('AppStorysDebugState failed', e);\n return null;\n }\n };\n} catch (e) {\n // ignore\n}\n\n// Expose a helper to debug token\ntry {\n (window as any).AppStorysDebugToken = function() {\n try {\n const token = localStorage.getItem('access_token') || '';\n const len = token.length;\n const masked = token ? token.slice(0, 20) + '...' + token.slice(-10) : '(none)';\n console.info('Token length:', len, 'masked:', masked);\n if (token && token.includes('.')) {\n try {\n const parts = token.split('.');\n if (parts.length === 3) {\n const payload = JSON.parse(atob(parts[1]));\n console.info('Token payload:', payload);\n if (payload.exp) {\n const exp = new Date(payload.exp * 1000);\n const now = new Date();\n console.info('Token expires:', exp.toISOString(), 'Expired:', now > exp);\n }\n }\n } catch (e) {\n console.warn('Could not decode JWT:', e);\n }\n }\n return token ? 'Token present' : 'No token';\n } catch (e) {\n console.error('AppStorysDebugToken failed', e);\n return null;\n }\n };\n} catch (e) {\n // ignore\n}\n","import { SdkState, InitializationOptions, Attributes } from './types';\nimport { Banner } from './components/Banner';\nimport { Pip } from './components/Pip';\nimport Floater from './components/Floater';\nimport trackEvent from './core/trackEvent';\nimport trackScreen from './core/trackScreen';\nimport verifyAccount from './core/verifyAccount';\nimport setUserProperties from './core/setUserProperties';\nimport { personalizeText } from './core/personalization';\nimport fetchAllCampaigns from './core/fetchAllCampaigns';\nimport useAppStorysStore from './core/store';\nimport { getAccessToken } from './core/store';\nimport { revealCampaignFromLink } from './core/campaignHelpers';\nimport reconcileAnonymousUser from './core/reconcileUser';\nimport { exitIntentManager } from './core/exitIntent';\nimport { visibilityManager } from './core/visibilityManager';\nimport { getOrCreateAnonymousUserId, getStoredAnonymousUserId, clearAnonymousUserId } from './core/userManagement';\nimport './dev/showWidgetDebug';\n\nclass AppStorys {\n private state: SdkState = SdkState.uninitialized;\n private navigateToScreen?: (screen: string) => void;\n\n public async initialize(options: InitializationOptions) {\n const { appId, accountId, userId } = options;\n this.navigateToScreen = options.navigateToScreen;\n\n if (this.state === SdkState.initializing) return;\n\n if (this.state === SdkState.initialized) {\n const state = useAppStorysStore.getState();\n if (state.appId === appId && state.accountId === accountId && state.userId === userId) {\n return;\n }\n }\n\n this.state = SdkState.initializing;\n\n try {\n let finalUserId: string;\n let isAnonymous: boolean;\n\n if (!userId || userId.trim() === '') {\n finalUserId = await getOrCreateAnonymousUserId();\n isAnonymous = true;\n } else {\n const storedAnonymousUserId = await getStoredAnonymousUserId();\n if (storedAnonymousUserId && storedAnonymousUserId !== userId) {\n // Reconcile will happen after verification, matching RN logic\n console.log('AppStorys: Found previous anonymous user, will reconcile after verification.');\n }\n finalUserId = userId;\n isAnonymous = false;\n }\n\n const success = await verifyAccount(accountId, appId, finalUserId);\n if (!success) {\n this.state = SdkState.error;\n return;\n }\n\n // Step 1.5: Reconcile if we moved from anonymous to identified\n if (!isAnonymous) {\n const storedAnonymousUserId = await getStoredAnonymousUserId();\n if (storedAnonymousUserId && storedAnonymousUserId !== finalUserId) {\n await reconcileAnonymousUser(storedAnonymousUserId, finalUserId);\n await clearAnonymousUserId();\n }\n }\n\n // Fire a non-blocking call to track-user-res so it appears in the browser Network tab\n try {\n const accessToken = await getAccessToken();\n const usersBase = options.baseUrl || 'https://users.appstorys.co';\n // Fire-and-handle response to update store flags (do not block init)\n fetch(`${usersBase}/v2/${accountId}/track-user-res`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {}),\n },\n body: JSON.stringify({\n user_id: finalUserId,\n screenName: (typeof window !== 'undefined' && window.location && window.location.pathname) ? window.location.pathname : '',\n silentUpdate: true,\n }),\n })\n .then(async (resp) => {\n if (!resp.ok) return;\n try {\n const data = await resp.json();\n const s = useAppStorysStore.getState();\n if (typeof data.screen_capture_enabled !== 'undefined') {\n const val = Boolean(data.screen_capture_enabled);\n console.info('AppStorys: track-user-res returned screen_capture_enabled=', val);\n s.setScreenCaptureEnabled(val);\n }\n } catch (e) {\n /* ignore */\n }\n })\n .catch((err) => console.warn('track-user-res (init) failed', err));\n } catch (err) {\n console.warn('track-user-res (init) setup failed', err);\n }\n\n const { campaigns, version } = await fetchAllCampaigns(accountId);\n\n const state = useAppStorysStore.getState();\n state.setAppId(appId);\n state.setAccountId(accountId);\n state.setUserId(finalUserId);\n state.setIsAnonymousUser(isAnonymous);\n state.setBaseUrl(options.baseUrl);\n state.setTrackingUrl(options.trackingUrl);\n state.saveAllCampaigns(campaigns);\n state.setCampaignVersion(version);\n\n // After campaigns and store are populated, mount screen-capture button if enabled\n try {\n const s = useAppStorysStore.getState();\n if (s.screenCaptureEnabled) {\n const scModule = await import('./core/screenCapture');\n scModule.mountScreenCaptureButton();\n }\n } catch (err) {\n // mounting failure shouldn't block initialization\n console.warn('Failed to mount screen capture button', err);\n }\n\n // Initialize Exit Intent / Back Press listeners\n exitIntentManager.setup();\n\n // Initialize Visibility listeners\n visibilityManager.setup();\n\n this.state = SdkState.initialized;\n } catch (e) {\n this.state = SdkState.error;\n console.error('AppStorys initialization failed:', e);\n }\n }\n\n public async trackScreen(screenName: string) {\n await this.ensureInitialized();\n return trackScreen(screenName);\n }\n\n public async trackEvent(event: string, campaignId?: string, metadata?: Attributes) {\n await this.ensureInitialized();\n return trackEvent(event, campaignId, metadata);\n }\n\n public async setUserProperties(attributes: Attributes) {\n await this.ensureInitialized();\n return setUserProperties(attributes);\n }\n\n public handleLink(link: string | any) {\n if (!link) return;\n\n if (typeof link === 'string') {\n // First try reveal flow: if link references a campaign id, reveal it\n try {\n if (!link.startsWith('http')) {\n const revealed = revealCampaignFromLink(link);\n if (revealed) return;\n }\n } catch (err) {\n // ignore helper errors and fallback to normal behavior\n console.warn('revealCampaignFromLink error', err);\n }\n\n if (link.startsWith('http')) {\n window.open(link, '_blank');\n } else {\n this.navigateToScreen?.(link);\n }\n } else if (typeof link === 'object' && link.value) {\n try {\n const revealed = revealCampaignFromLink(link.value);\n if (revealed) return;\n } catch (err) {\n // ignore\n }\n this.navigateToScreen?.(link.value);\n }\n }\n\n /**\n * Gets the visibility status of the SDK.\n * @returns boolean indicating whether the SDK is considered visible.\n */\n public get visibility(): boolean {\n return useAppStorysStore.getState().isVisible;\n }\n\n /**\n * Manually sets the visibility status of the SDK.\n * Useful for host apps that want to pause/resume SDK activities programmatically.\n * @param isVisible - boolean indicating visibility status.\n */\n public set visibility(isVisible: boolean) {\n visibilityManager.updateVisibility(isVisible);\n }\n\n private async ensureInitialized() {\n if (this.state === SdkState.initialized) return;\n\n const startTime = Date.now();\n while ((this.state as SdkState) !== SdkState.initialized) {\n if (this.state === SdkState.error) throw new Error('AppStorys SDK error');\n if (Date.now() - startTime > 10000) throw new Error('AppStorys SDK initialization timeout');\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n }\n public personalizeText(text: string): string {\n return personalizeText(text);\n }\n}\n\nimport { Story } from './components/Story';\nimport { Widget } from './components/Widget';\nimport Tooltip from './components/Tooltip';\nimport { BottomSheet } from './components/BottomSheet';\nimport Csat from './components/Csat';\nimport Survey from './components/Survey';\n\nconst instance = new AppStorys();\nexport { instance as AppStorys, Banner, Story, Pip, Widget, Floater, Tooltip, BottomSheet, Csat, Survey, personalizeText };\nexport * from './types';\n\n","export type CampaignType = 'BAN' | 'FLT' | 'PIP' | 'SUR' | 'CSAT' | 'WID' | 'MOD' | 'BTS' | 'SCRT' | 'STR' | 'TLTP' | 'TTP';\n\n\nexport interface CrossButtonConfig {\n color: {\n cross: string;\n fill: string;\n stroke: string;\n };\n enabled: boolean;\n image: string;\n margin: {\n bottom: number;\n left: number;\n right: number;\n top: number;\n };\n selectedStyle?: string;\n size: number;\n}\n\nexport interface StorySlideCtaBorderRadius {\n topLeft?: number;\n topRight?: number;\n bottomLeft?: number;\n bottomRight?: number;\n}\n\nexport interface TriggerEventConfig {\n key?: string;\n operator?: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte';\n value?: string;\n back_press?: boolean;\n}\n\nexport interface TriggerEventObject {\n event: string;\n event_config: TriggerEventConfig[];\n}\n\nexport type TriggerEvent = string | TriggerEventObject;\n\nexport interface BaseCampaign {\n id: string;\n campaign_type: CampaignType;\n trigger_event?: TriggerEvent;\n position?: string;\n screen?: string;\n details: any;\n}\n\nexport interface CampaignBanner extends BaseCampaign {\n campaign_type: 'BAN';\n details: {\n id: string;\n image: string | null;\n lottie_data: string | null;\n width: null | number;\n height: null | number;\n link: null | string;\n styling: {\n bottomLeftRadius?: string;\n bottomRightRadius?: string;\n topLeftRadius?: string;\n topRightRadius?: string;\n marginBottom?: string;\n marginLeft?: string;\n marginRight?: string;\n crossButton?: CrossButtonConfig;\n [key: string]: any;\n };\n };\n}\n\nexport interface Attributes {\n [key: string]: any;\n}\n\nexport enum SdkState {\n uninitialized = 'uninitialized',\n initializing = 'initializing',\n initialized = 'initialized',\n error = 'error'\n}\n\nexport interface AppStorysStore {\n userId: string;\n appId: string;\n accountId: string;\n currentScreen: string;\n campaigns: Campaign[];\n allCampaigns: Campaign[];\n campaignVersion: number;\n trackedEvents: string[];\n trackedEventMetadata: Record<string, Attributes[]>;\n attributes?: Attributes;\n isVisible: boolean;\n isAnonymousUser: boolean;\n variantMappings: Record<string, string>;\n personalizationData: Record<string, string>;\n screenCaptureEnabled?: boolean;\n baseUrl?: string;\n trackingUrl?: string;\n}\n\nexport interface StorySlideCtaContainer {\n alignment?: string;\n backgroundColor?: string;\n borderColor?: string;\n borderWidth?: number;\n ctaFullWidth?: boolean;\n ctaWidth?: number;\n height?: number;\n}\n\nexport interface StorySlideCtaText {\n color?: string;\n fontDecoration?: string[];\n fontFamily?: string;\n fontSize?: number;\n}\n\nexport interface StorySlideCta {\n container?: StorySlideCtaContainer;\n cornerRadius?: StorySlideCtaBorderRadius;\n margin?: {\n bottom?: number;\n left?: number;\n right?: number;\n top?: number;\n };\n text?: StorySlideCtaText;\n}\n\nexport interface StorySlideStyling {\n cta?: StorySlideCta;\n meta?: {\n editorSource?: string;\n };\n pc_redirect_type?: string;\n rdrType?: string;\n}\n\nexport interface StorySlide {\n button_text?: string;\n content?: any;\n id: string;\n image: string | null;\n interactions?: any[];\n link: string | null;\n order: number;\n parent: string;\n personalizationData?: any;\n styling?: StorySlideStyling;\n video: string | null;\n}\n\nexport interface StoryGroupStyling {\n cornerRadius?: {\n bottomLeft?: number;\n bottomRight?: number;\n topLeft?: number;\n topRight?: number;\n };\n crossButton?: CrossButtonConfig;\n name?: {\n font?: string;\n fontFamily?: string;\n size?: number;\n };\n ringWidth?: number;\n share?: {\n color?: {\n cross?: string;\n fill?: string;\n stroke?: string;\n };\n enabled?: boolean;\n image?: string;\n margin?: {\n right?: number;\n top?: number;\n };\n selectedStyle?: string;\n size?: number;\n };\n size?: number;\n slideShowTime?: number;\n soundToggle?: {\n defaultSound?: string;\n enabled?: boolean;\n mute?: any;\n unmute?: any;\n };\n storyGroupText?: string;\n}\n\nexport interface Story {\n cohorts: any;\n id: string;\n name: string;\n nameColor: string;\n order: number;\n ringColor: string;\n slides: StorySlide[];\n styling?: StoryGroupStyling;\n thumbnail: string;\n}\n\nexport interface CampaignStory extends BaseCampaign {\n campaign_type: 'STR';\n details: Story[];\n}\n\nexport interface WidgetImage {\n cohorts: any;\n id: string;\n image: string;\n link: string;\n order: number;\n}\n\nexport interface CampaignWidget extends BaseCampaign {\n campaign_type: 'WID';\n details: {\n height: number;\n id: string;\n styling: {\n borderRadius: number;\n bottomLeftRadius: number;\n bottomMargin: number;\n bottomRightRadius: number;\n leftMargin: number;\n rightMargin: number;\n topLeftRadius: number;\n topMargin: number;\n topRightRadius: number;\n type: string;\n };\n widget_images: WidgetImage[];\n width: number;\n type?: string;\n };\n}\n\nexport interface TooltipStyling {\n appearance?: {\n arrowStyle?: { height?: number; width?: number };\n backdropOpacity?: number;\n colors?: { arrow?: string; backdrop?: string; tooltip?: string };\n cornerRadius?: { bottomLeft?: number; bottomRight?: number; topLeft?: number; topRight?: number };\n highlight?: { padding?: number; radius?: number };\n padding?: { bottom?: number; left?: number; right?: number; top?: number };\n };\n cta?: {\n container?: {\n alignment?: string;\n backgroundColor?: string;\n borderColor?: string;\n borderWidth?: number;\n ctaFullWidth?: boolean;\n ctaWidth?: number;\n height?: number;\n };\n cornerRadius?: { bottomLeft?: number; bottomRight?: number; topLeft?: number; topRight?: number };\n margin?: { bottom?: number; left?: number; right?: number; top?: number };\n text?: { color?: string; fontDecoration?: string[]; fontFamily?: string; fontSize?: number };\n };\n subTitle?: {\n color?: string;\n fontDecoration?: string[];\n fontFamily?: string;\n fontSize?: number;\n margin?: { bottom?: number; left?: number; right?: number; top?: number };\n textAlign?: string;\n };\n title?: {\n color?: string;\n fontDecoration?: string[];\n fontFamily?: string;\n fontSize?: number;\n margin?: { bottom?: number; left?: number; right?: number; top?: number };\n textAlign?: string;\n };\n}\n\nexport interface TooltipItem {\n _id: string;\n arrowPosition?: \"left\" | \"right\" | \"top\" | \"bottom\" | string;\n clickAction?: \"nextStep\" | \"close\" | string;\n ctaText?: string;\n enableBackdrop?: boolean;\n eventName?: string;\n link?: string;\n order?: number;\n position?: string;\n styling?: TooltipStyling;\n subtitleText?: string;\n target?: string;\n titleText?: string;\n url?: string | null;\n}\n\nexport interface CampaignTooltip extends BaseCampaign {\n campaign_type: 'TTP';\n details: {\n tooltips?: TooltipItem[];\n \n titleText?: string;\n subtitleText?: string;\n target?: string;\n styling?: TooltipStyling;\n } & Partial<TooltipItem>;\n display_trigger?: boolean;\n}\n\nexport interface BottomSheetElement {\n id: string;\n type: 'image' | 'cta' | 'body' | string;\n order: number;\n [key: string]: any;\n}\n\nexport interface CampaignBottomSheet extends BaseCampaign {\n campaign_type: 'BTS';\n details: {\n backdropColor?: string;\n backdropOpacity?: number;\n backgroundColor?: string;\n bottomsheetType?: string;\n cornerRadius?: {\n bottomLeft?: number;\n bottomRight?: number;\n topLeft?: number;\n topRight?: number;\n };\n crossButton?: CrossButtonConfig;\n elements: BottomSheetElement[];\n id: string;\n name: string;\n };\n}\n\nexport interface SurveyTextStyle {\n color?: string;\n fontDecoration?: string[];\n fontFamily?: string;\n fontSize?: number;\n textAlign?: string;\n margin?: {\n bottom?: number;\n left?: number;\n right?: number;\n top?: number;\n };\n borderwidth?: number;\n}\n\nexport interface SurveyOptionColors {\n background?: string;\n border?: string;\n text?: string;\n}\n\nexport interface SurveyOptionStyle {\n colors?: SurveyOptionColors;\n textStyle?: SurveyTextStyle;\n}\n\nexport interface SurveySlideLogicRule {\n redirectTo?: string;\n selectOption?: string[];\n}\n\nexport interface SurveySlide {\n additionalComment?: {\n enabled?: boolean;\n placeholder?: string;\n };\n id: string;\n logic?: SurveySlideLogicRule[];\n options?: Record<string, string>;\n order: number;\n parent: string;\n question?: string;\n submitButtonText?: string;\n subtitle?: string;\n title?: string;\n}\n\nexport interface SurveyThankYouButtonConfig {\n action?: string;\n enabled?: boolean;\n redirectUrl?: string;\n}\n\nexport interface SurveyCampaignDetails {\n id: string;\n name?: string;\n slides?: SurveySlide[];\n styling?: {\n appearance?: {\n backdropColor?: string;\n backdropOpacity?: number;\n backgroundColor?: string;\n cornerRadius?: {\n topLeft?: number;\n topRight?: number;\n bottomLeft?: number;\n bottomRight?: number;\n };\n displayDelay?: number;\n };\n content?: {\n isIntroductionPage?: boolean;\n isThankyouPage?: boolean;\n };\n crossButton?: CrossButtonConfig;\n cta?: StorySlideCta;\n options?: {\n additionalComments?: SurveyOptionStyle;\n bulletSpacing?: number;\n cornerRadius?: StorySlideCtaBorderRadius;\n nonSelectedOptions?: SurveyOptionStyle;\n optionListStyle?: string;\n optionsHeight?: number;\n optionsSpacing?: number;\n selectedOptions?: SurveyOptionStyle;\n };\n subtitle?: {\n textStyle?: SurveyTextStyle;\n };\n thankyouPage?: {\n cta?: StorySlideCta;\n imageStyle?: {\n height?: number;\n width?: number;\n };\n subtitle?: {\n textStyle?: SurveyTextStyle;\n };\n title?: {\n textStyle?: SurveyTextStyle;\n };\n };\n title?: {\n textStyle?: SurveyTextStyle;\n };\n };\n thankYouButtonConfig?: SurveyThankYouButtonConfig;\n thankYouButtonText?: string;\n thankYouImage?: string;\n thankYouText?: string;\n thankYouTitle?: string;\n}\n\nexport interface CampaignSurvey extends BaseCampaign {\n campaign_type: 'SUR';\n details: SurveyCampaignDetails;\n}\n\nexport interface CsatTextStyle {\n color?: string;\n fontDecoration?: string[];\n fontFamily?: string;\n fontSize?: number;\n textAlign?: string;\n}\n\nexport interface CsatSpacing {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n}\n\nexport interface CsatCampaignDetails {\n campaign?: string;\n description_text?: string;\n feedback_option?: Record<string, string>;\n height?: number;\n highStarText?: string;\n id: string;\n link?: string;\n lowStarText?: string;\n styling?: {\n appearance?: {\n backgroundColor?: string;\n borderRadius?: number;\n displayDelay?: number;\n margin?: CsatSpacing;\n padding?: CsatSpacing;\n };\n crossButton?: CrossButtonConfig;\n feedbackPage?: {\n additionalComments?: {\n borderWidth?: number;\n colors?: {\n background?: string;\n border?: string;\n text?: string;\n };\n enabled?: boolean;\n placeholder?: string;\n textStyle?: CsatTextStyle;\n };\n options?: {\n cornerRadius?: {\n topLeft?: number;\n topRight?: number;\n bottomLeft?: number;\n bottomRight?: number;\n };\n margin?: CsatSpacing;\n nonSelectedOptions?: {\n borderWidth?: number;\n colors?: {\n background?: string;\n border?: string;\n text?: string;\n };\n textStyle?: CsatTextStyle;\n };\n optionsHeight?: number;\n optionsSpacing?: number;\n selectedOptions?: {\n borderWidth?: number;\n colors?: {\n background?: string;\n border?: string;\n text?: string;\n };\n textStyle?: CsatTextStyle;\n };\n };\n submitButton?: {\n cta?: StorySlideCta;\n enabled?: boolean;\n text?: string;\n };\n };\n initialFeedback?: {\n subtitle?: {\n margin?: CsatSpacing;\n textStyle?: CsatTextStyle;\n };\n title?: {\n margin?: CsatSpacing;\n textStyle?: CsatTextStyle;\n };\n };\n rating?: {\n emoji?: string[] | Record<string, string> | string | null;\n highRatingSubtitle?: string;\n highRatingTitle?: string;\n lowRatingSubtitle?: string;\n lowRatingTitle?: string;\n number?: number | { min?: number; max?: number } | null;\n ratingType?: string;\n star?: {\n high?: {\n stylingContainer?: { background?: string; border?: string; borderWidth?: number };\n stylingStar?: { background?: string; border?: string; borderWidth?: number };\n };\n low?: {\n stylingContainer?: { background?: string; border?: string; borderWidth?: number };\n stylingStar?: { background?: string; border?: string; borderWidth?: number };\n };\n unselected?: {\n stylingContainer?: { background?: string; border?: string; borderWidth?: number };\n stylingStar?: { background?: string; border?: string; borderWidth?: number };\n };\n };\n };\n thankyouPage?: {\n doneButton?: {\n cta?: StorySlideCta;\n text?: string;\n };\n imageStyle?: {\n height?: number;\n width?: number;\n };\n subtitle?: {\n margin?: CsatSpacing;\n textStyle?: CsatTextStyle;\n };\n title?: {\n margin?: CsatSpacing;\n textStyle?: CsatTextStyle;\n };\n };\n };\n thankyouDescription?: string;\n thankyouImage?: string;\n thankyouText?: string;\n title?: string;\n width?: number;\n}\n\nexport interface CampaignCsat extends BaseCampaign {\n campaign_type: 'CSAT';\n details: CsatCampaignDetails;\n}\n\nexport type Campaign = CampaignBanner | CampaignStory | CampaignWidget | CampaignTooltip | CampaignBottomSheet | CampaignCsat | CampaignSurvey | BaseCampaign;\n\nexport interface InitializationOptions {\n appId: string;\n accountId: string;\n userId?: string;\n baseUrl?: string;\n trackingUrl?: string;\n navigateToScreen?: (screen: string) => void;\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport * as LottieModule from 'lottie-react';\nimport { CampaignBanner } from '../../types';\nimport useAppStorysStore from '../../core/store';\nimport useCampaigns from '../../hooks/useCampaigns';\nimport trackEvent from '../../core/trackEvent';\nimport { revealCampaignFromLink } from '../../core/campaignHelpers';\n\nconst Lottie =\n (LottieModule as any).default?.default ??\n (LottieModule as any).default ??\n (LottieModule as any).Lottie ??\n (LottieModule as any);\n\nexport const Banner: React.FC = () => {\n const data = useCampaigns<CampaignBanner>('BAN');\n const sdkVisible = useAppStorysStore((state) => state.isVisible);\n const [isDismissed, setIsDismissed] = useState(false);\n const [lottieData, setLottieData] = useState<any>(null);\n const [aspectRatio, setAspectRatio] = useState<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState<number>(0);\n\n useEffect(() => {\n if (data) {\n setIsDismissed(false);\n void trackEvent('viewed', data.id);\n\n // Fetch Lottie data if available\n if (data.details.lottie_data) {\n fetch(data.details.lottie_data)\n .then(res => res.json())\n .then(json => {\n setLottieData(json);\n if (json.w && json.h) {\n setAspectRatio(json.h / json.w);\n }\n })\n .catch(err => console.error('Error loading Lottie:', err));\n }\n }\n }, [data]);\n\n useEffect(() => {\n const updateWidth = () => {\n if (containerRef.current) {\n setContainerWidth(containerRef.current.offsetWidth);\n }\n };\n\n updateWidth();\n window.addEventListener('resize', updateWidth);\n return () => window.removeEventListener('resize', updateWidth);\n }, [data, isDismissed]);\n\n if (!data || isDismissed || !sdkVisible) return null;\n\n const { details } = data;\n const styling = details.styling || {};\n \n // Calculate height based on aspect ratio or fixed height\n let calculatedHeight: string | number = details.height || 'auto';\n if (aspectRatio && containerWidth) {\n calculatedHeight = containerWidth * aspectRatio;\n }\n\n const bannerStyle: React.CSSProperties = {\n position: 'fixed' as const,\n left: styling.marginLeft ? `${styling.marginLeft}px` : '10px',\n right: styling.marginRight ? `${styling.marginRight}px` : '10px',\n bottom: styling.marginBottom ? `${styling.marginBottom}px` : '10px',\n backgroundColor: 'transparent',\n borderRadius: `${styling.topRightRadius || 0}px ${styling.topLeftRadius || 0}px ${styling.bottomRightRadius || 0}px ${styling.bottomLeftRadius || 0}px`,\n overflow: 'hidden',\n zIndex: 9999,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: details.link ? 'pointer' : 'default',\n };\n\n const mediaStyle: React.CSSProperties = {\n width: '100%',\n height: typeof calculatedHeight === 'number' ? `${calculatedHeight}px` : calculatedHeight,\n display: 'block',\n objectFit: 'cover',\n };\n\n const handleClose = (e: React.MouseEvent) => {\n e.stopPropagation();\n setIsDismissed(true);\n void trackEvent('banner_closed', data.id);\n };\n\n const handleClick = () => {\n if (details.link) {\n void trackEvent('clicked', data.id);\n if (details.link.startsWith('http')) {\n window.open(details.link, '_blank');\n } else {\n // Try reveal via campaign id first\n try {\n const revealed = revealCampaignFromLink(details.link);\n if (revealed) return;\n } catch (err) {\n console.warn('revealCampaignFromLink error', err);\n }\n\n // Fallback to logging/navigation\n console.log('Internal link:', details.link);\n }\n }\n };\n\n return (\n <div ref={containerRef} style={bannerStyle} onClick={handleClick}>\n {lottieData ? (() => {\n const LottieComp = (Lottie as any).default || Lottie;\n return (\n <LottieComp \n animationData={lottieData} \n loop={true} \n autoplay={sdkVisible}\n style={mediaStyle}\n />\n );\n })() : details.image ? (\n <img src={details.image} alt=\"Campaign Banner\" style={mediaStyle} />\n ) : null}\n \n {styling.crossButton?.enabled && (\n <button \n onClick={handleClose}\n style={{\n position: 'absolute',\n top: '5px',\n right: '5px',\n background: 'rgba(0,0,0,0.3)',\n color: 'white',\n border: 'none',\n borderRadius: '50%',\n width: '24px',\n height: '24px',\n lineHeight: '22px',\n textAlign: 'center',\n cursor: 'pointer',\n padding: '0',\n fontSize: '14px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10\n }}\n >\n ✕\n </button>\n )}\n </div>\n );\n};\n","import { useMemo } from \"react\";\nimport { Campaign, TriggerEventConfig, TriggerEventObject, Attributes } from \"../types\";\nimport useAppStorysStore from \"../core/store\";\nimport { resolveCampaignVariant } from \"../core/variantResolver\";\n\nexport const BACK_PRESS_SENTINEL = '__back_press_triggered__';\n\ninterface UseCampaignsOptions {\n position?: string;\n screenContains?: string;\n}\n\nfunction normalizeScreenName(screen?: string | null): string {\n return (screen || '').trim().toLowerCase();\n}\n\nfunction isScreenMatch(campaignScreen: string | undefined, currentScreen: string): boolean {\n const normalizedCampaignScreen = normalizeScreenName(campaignScreen);\n const normalizedCurrentScreen = normalizeScreenName(currentScreen);\n return !normalizedCampaignScreen || normalizedCampaignScreen === normalizedCurrentScreen;\n}\n\nfunction compareValues(actual: string, operator: TriggerEventConfig['operator'], expected: string): boolean {\n const numActual = Number(actual);\n const numExpected = Number(expected);\n const useNumeric = !isNaN(numActual) && !isNaN(numExpected);\n\n switch (operator) {\n case 'eq': return useNumeric ? numActual === numExpected : actual === expected;\n case 'neq': return useNumeric ? numActual !== numExpected : actual !== expected;\n case 'gt': return useNumeric ? numActual > numExpected : actual > expected;\n case 'gte': return useNumeric ? numActual >= numExpected : actual >= expected;\n case 'lt': return useNumeric ? numActual < numExpected : actual < expected;\n case 'lte': return useNumeric ? numActual <= numExpected : actual <= expected;\n default: return false;\n }\n}\n\nfunction matchesEventConditions(\n event_config: TriggerEventConfig[],\n metadataList: Attributes[],\n): boolean {\n const realConditions = event_config.filter((c) => c.back_press == null);\n if (realConditions.length === 0) return true;\n\n return metadataList.some((meta) =>\n realConditions.every((condition) => {\n const actual = meta[condition.key!];\n if (actual === undefined || actual === null) return false;\n return compareValues(String(actual), condition.operator!, condition.value!);\n })\n );\n}\n\nfunction isTriggerEventSatisfied(\n campaign: Campaign,\n trackedEvents: string[],\n trackedEventMetadata: Record<string, Attributes[]>,\n): boolean {\n // Support both the typed `trigger_event` and legacy `trigger` fields from campaign JSON\n const t = campaign as any;\n const trigger_event = (t.trigger_event ?? t.trigger) as TriggerEvent | undefined;\n const id = (campaign as Campaign & { id?: string }).id;\n // If a campaign carries any trigger information, do not show it by default.\n // The presence of `trigger_event` or legacy `trigger` indicates it's intended\n // to be shown only in response to an event; hide unless that event handling\n // code explicitly adds it back to the visible campaigns list.\n if (trigger_event) return false;\n\n return true;\n}\n\n/**\n * Checks whether any currently loaded campaign is a back_press (exit intent) campaign\n * that is ready to show but not yet triggered.\n */\nexport function isBackPressCampaignReady(): boolean {\n const { campaigns, trackedEvents, trackedEventMetadata, currentScreen } = useAppStorysStore.getState();\n\n return campaigns.some((campaign) => {\n if (campaign.screen && campaign.screen !== currentScreen) return false;\n\n const te = (campaign as any).trigger_event;\n if (!te || typeof te === 'string') return false;\n\n const { event, event_config } = te as TriggerEventObject;\n if (!(event_config ?? []).some((c: TriggerEventConfig) => c.back_press === true)) return false;\n\n // Already consumed\n if (trackedEvents.includes(BACK_PRESS_SENTINEL)) return false;\n\n // The underlying event must have been tracked\n if (!trackedEvents.includes(event)) return false;\n\n // Non-back_press conditions must also pass\n const realConditions = (event_config ?? []).filter((c: TriggerEventConfig) => c.back_press == null);\n if (realConditions.length === 0) return true;\n\n const metadataList = trackedEventMetadata[event] || [];\n return matchesEventConditions(realConditions, metadataList);\n });\n}\n\nexport default function useCampaigns<T extends Campaign>(campaignType: string, options?: UseCampaignsOptions): T | undefined {\n const currentScreen = useAppStorysStore((state) => state.currentScreen);\n const campaigns = useAppStorysStore((state) => state.campaigns);\n const allCampaigns = useAppStorysStore((state) => state.allCampaigns);\n const trackedEvents = useAppStorysStore((state) => state.trackedEvents);\n const trackedEventMetadata = useAppStorysStore((state) => state.trackedEventMetadata);\n const variantMappings = useAppStorysStore((state) => state.variantMappings);\n\n return useMemo(\n () => {\n const matchCampaign = (list: Campaign[]) => list.find((campaign) =>\n isScreenMatch(campaign.screen, currentScreen) &&\n campaign.campaign_type === campaignType &&\n (options?.position ? campaign.position === options.position : true) &&\n isTriggerEventSatisfied(campaign, trackedEvents, trackedEventMetadata)\n );\n\n const fromEligible = campaigns && campaigns.length > 0 ? matchCampaign(campaigns) : undefined;\n const campaign = fromEligible ?? matchCampaign(allCampaigns || []);\n\n if (!campaign) return undefined;\n return resolveCampaignVariant(campaign) as T | undefined;\n },\n [campaigns, allCampaigns, trackedEvents, trackedEventMetadata, variantMappings, campaignType, options, currentScreen],\n );\n}\n\nexport function useCampaignsList<T extends Campaign>(campaignType: string, options?: UseCampaignsOptions): T[] {\n const currentScreen = useAppStorysStore((state) => state.currentScreen);\n const campaigns = useAppStorysStore((state) => state.campaigns);\n const allCampaigns = useAppStorysStore((state) => state.allCampaigns);\n const trackedEvents = useAppStorysStore((state) => state.trackedEvents);\n const trackedEventMetadata = useAppStorysStore((state) => state.trackedEventMetadata);\n\n return useMemo(() => {\n const list = (campaigns && campaigns.length > 0) ? campaigns : (allCampaigns || []);\n\n const filtered = list.filter((campaign) => {\n if (campaign.campaign_type !== campaignType) return false;\n if (options?.position && campaign.position !== options.position) return false;\n if (!isTriggerEventSatisfied(campaign, trackedEvents, trackedEventMetadata)) return false;\n\n // If caller passed a screenContains option, match substring (case-insensitive)\n if (options?.screenContains) {\n const needle = (options.screenContains || '').trim().toLowerCase();\n const cs = (campaign.screen || '').trim().toLowerCase();\n return cs.includes(needle);\n }\n\n // Fallback to existing screen matching logic\n return isScreenMatch(campaign.screen, currentScreen);\n });\n\n return filtered.map((c) => resolveCampaignVariant(c) as T) as T[];\n }, [campaigns, allCampaigns, trackedEvents, trackedEventMetadata, campaignType, options, currentScreen]);\n}\n","import { Campaign } from \"../types\";\nimport useAppStorysStore from \"./store\";\n\nconst getVariantId = (campaignId: string): string | undefined => {\n return useAppStorysStore.getState().variantMappings[campaignId];\n};\n\nexport function hasVariants(campaign: Campaign): boolean {\n return !!(campaign.details && typeof campaign.details === 'object' && 'variants' in campaign.details);\n}\n\nexport function resolveCampaignVariant<T extends Campaign>(campaign: T): T {\n if (!hasVariants(campaign)) {\n return campaign;\n }\n\n const variantId = getVariantId(campaign.id || '');\n \n if (!variantId) {\n return campaign;\n }\n\n const variants = (campaign.details as any)?.variants;\n \n if (!variants || typeof variants !== 'object') {\n return campaign;\n }\n\n const variantDetails = variants[variantId];\n \n if (!variantDetails) {\n return campaign;\n }\n\n // Merge base campaign details first, then overlay variant details so\n // variant-specific fields take precedence when keys overlap.\n const baseDetails = (typeof campaign.details === 'object')\n ? Object.fromEntries(Object.entries(campaign.details).filter(([key]) => key !== 'variants'))\n : {};\n\n const resolvedCampaign = {\n ...campaign,\n details: {\n ...baseDetails,\n ...variantDetails,\n },\n _variantId: variantId,\n } as T;\n \n return resolvedCampaign;\n}\n\nexport function getCampaignVariantId(campaign: Campaign): string | undefined {\n if ('_variantId' in campaign) {\n return (campaign as any)._variantId;\n }\n \n if (hasVariants(campaign)) {\n return getVariantId(campaign.id || '');\n }\n \n return undefined;\n}\n","import useAppStorysStore, { getAccessToken, getUserId, getVariantId } from \"./store\";\nimport { Attributes } from \"../types\";\nimport getDeviceInfo from \"./getDeviceInfo\";\nimport { sendOrQueue } from \"./offlineQueue\";\n\nexport default async function trackEvent(event: string, campaignId?: string, metadata?: Attributes) {\n try {\n if (!event) return;\n\n const accessToken = await getAccessToken();\n const state = useAppStorysStore.getState();\n\n const excludedEvents = [\n \"viewed\",\n \"clicked\",\n \"csat captured\",\n \"survey captured\",\n \"shared\"\n ];\n\n if (!excludedEvents.includes(event)) {\n const trackedEvents = state.trackedEvents;\n if (!trackedEvents.includes(event)) {\n state.setTrackedEvents([...trackedEvents, event]);\n } else {\n const updatedEvents = trackedEvents.filter(e => e !== event);\n updatedEvents.push(event);\n state.setTrackedEvents(updatedEvents);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n const currentMeta = state.trackedEventMetadata || {};\n const existing = currentMeta[event] || [];\n state.setTrackedEventMetadata({\n ...currentMeta,\n [event]: [...existing, metadata],\n });\n }\n }\n\n let finalMetadata: Record<string, any> = {\n ...(metadata || {}),\n };\n\n if (!excludedEvents.includes(event)) {\n const deviceInfo = await getDeviceInfo();\n finalMetadata = {\n ...finalMetadata,\n ...deviceInfo,\n };\n }\n\n // Mirror native: include variant_id when a mapping exists for the campaign id\n if (campaignId && String(campaignId).trim() !== \"\") {\n const variantId = getVariantId(campaignId);\n if (variantId) {\n finalMetadata.variant_id = variantId;\n // console.debug(`Including variant_id in analytics: ${variantId}`);\n }\n }\n\n const body: Record<string, any> = {\n user_id: getUserId(),\n event: event,\n metadata: finalMetadata,\n };\n if (campaignId) {\n body.campaign_id = campaignId;\n }\n\n const trackingUrl = state.trackingUrl || 'https://tracking.appstorys.co';\n\n if (accessToken) {\n await sendOrQueue({\n url: `${trackingUrl}/capture-event`,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken}`,\n },\n body: body,\n });\n }\n } catch (error) {\n console.error('Error in trackEvent', error);\n }\n}\n","import { WebStorage } from '../adapters/web/storage';\nimport useAppStorysStore, { getAccessToken } from './store';\nimport verifyAccount from './verifyAccount';\n\nconst OFFLINE_QUEUE_KEY = \"appstorys_offline_queue\";\n\nexport interface QueuedRequest {\n url: string;\n method: string;\n headers: Record<string, string>;\n body: any;\n retryCount?: number;\n lastAttempt?: number;\n authRetried?: boolean;\n}\n\nasync function getQueue(): Promise<QueuedRequest[]> {\n const existing = await WebStorage.getItem(OFFLINE_QUEUE_KEY);\n return existing ? JSON.parse(existing) : [];\n}\n\nasync function saveQueue(queue: QueuedRequest[]) {\n await WebStorage.setItem(OFFLINE_QUEUE_KEY, JSON.stringify(queue));\n}\n\nfunction getBackoffDelay(retryCount: number): number {\n // Exponential backoff: 30s, 1min, 2min (max 2min)\n return Math.min(30000 * Math.pow(2, retryCount), 120000);\n}\n\nfunction shouldRetryRequest(request: QueuedRequest): boolean {\n const maxRetries = 3;\n const retryCount = request.retryCount || 0;\n const lastAttempt = request.lastAttempt || 0;\n const backoffDelay = getBackoffDelay(retryCount);\n\n return retryCount < maxRetries && Date.now() - lastAttempt >= backoffDelay;\n}\n\nasync function validateCredentials(): Promise<boolean> {\n const state = useAppStorysStore.getState();\n if (!state.accountId || !state.appId) return false;\n \n return await verifyAccount(\n state.accountId,\n state.appId,\n state.userId\n );\n}\n\nasync function handleAuthError(\n request: QueuedRequest,\n onSuccess: (request: QueuedRequest) => void\n) {\n const credentialsValid = await validateCredentials();\n\n if (credentialsValid) {\n const newToken = await WebStorage.getItem('access_token');\n if (newToken) {\n request.headers = {\n ...request.headers,\n Authorization: `Bearer ${newToken}`,\n };\n }\n request.authRetried = true;\n request.lastAttempt = Date.now();\n onSuccess(request);\n }\n}\n\nasync function handleCriticalError(\n request: QueuedRequest, \n onSuccess: (request: QueuedRequest) => void\n) {\n const retryCount = (request.retryCount || 0) + 1;\n\n if (retryCount <= 3) {\n request.retryCount = retryCount;\n request.lastAttempt = Date.now();\n onSuccess(request);\n }\n}\n\nasync function addToQueue(request: QueuedRequest) {\n const queue = await getQueue();\n queue.push(request);\n await saveQueue(queue);\n}\n\nexport async function flushQueue() {\n const queue = await getQueue();\n if (queue.length === 0) return;\n\n const newQueue: QueuedRequest[] = [];\n\n for (const req of queue) {\n if (!shouldRetryRequest(req)) {\n newQueue.push(req);\n continue;\n }\n\n try {\n const res = await fetch(req.url, {\n method: req.method,\n headers: req.headers,\n body: JSON.stringify(req.body),\n });\n\n if (res.ok) continue;\n\n if (res.status === 401 || res.status === 403) {\n if (!req.authRetried) {\n await handleAuthError(req, (r) => newQueue.push(r));\n }\n } else if (res.status >= 500) {\n await handleCriticalError(req, (r) => newQueue.push(r));\n }\n } catch (err) {\n await handleCriticalError(req, (r) => newQueue.push(r));\n }\n }\n\n await saveQueue(newQueue);\n}\n\nexport async function sendOrQueue(request: QueuedRequest): Promise<Response | void> {\n if (!navigator.onLine) {\n await addToQueue(request);\n return;\n }\n\n // Auto-flush existing queue\n await flushQueue();\n\n try {\n const res = await fetch(request.url, {\n method: request.method,\n headers: request.headers,\n body: JSON.stringify(request.body),\n });\n\n if (res.ok) return res;\n\n if (res.status === 401 || res.status === 403) {\n await handleAuthError(request, addToQueue);\n } else if (res.status >= 500) {\n await handleCriticalError(request, addToQueue);\n }\n\n return res;\n } catch (err) {\n await handleCriticalError(request, addToQueue);\n return;\n }\n}\n","import useAppStorysStore from './store';\n\nexport function isTriggerDriven(campaign: any): boolean {\n return Boolean((campaign && (campaign.trigger_event ?? campaign.trigger)));\n}\n\nexport function revealCampaignFromLink(link: string): boolean {\n if (!link) return false;\n const s = useAppStorysStore.getState();\n const all = s.allCampaigns || [];\n const existing = s.campaigns || [];\n\n const normalizedLink = String(link).trim();\n\n const referenced = all.find((c: any) => {\n if (!c) return false;\n const cid = String(c.id || '').trim();\n const details = c.details || {};\n const detailsCampaign = String(details.campaign || details.id || '').trim();\n if (cid && cid === normalizedLink) return true;\n if (detailsCampaign && detailsCampaign === normalizedLink) return true;\n if (cid && normalizedLink.includes(cid)) return true;\n if (detailsCampaign && normalizedLink.includes(detailsCampaign)) return true;\n return false;\n });\n\n if (!referenced) return false;\n\n const revealed: any = { ...referenced };\n delete revealed.trigger_event;\n delete revealed.trigger;\n revealed.display_trigger = true;\n\n const idx = existing.findIndex((c: any) => String(c.id || '') === String(revealed.id || ''));\n if (idx === -1) {\n s.saveCampaigns([revealed, ...existing]);\n } else {\n const existingItem = existing[idx];\n const existingHasTrigger = Boolean((existingItem as any).trigger_event ?? (existingItem as any).trigger);\n if (existingHasTrigger) {\n const next = [...existing];\n next[idx] = revealed;\n s.saveCampaigns(next);\n }\n }\n\n return true;\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport useCampaigns from \"../../hooks/useCampaigns\";\nimport trackEvent from \"../../core/trackEvent\";\nimport useAppStorysStore from \"../../core/store\";\nimport { Campaign } from \"../../types\";\nimport { resolveCampaignVariant } from \"../../core/variantResolver\";\n\ninterface PipCampaignDetails {\n button_text?: string;\n crossButtonImage?: string | null;\n height?: number | string;\n width?: number | string;\n large_video?: string;\n small_video?: string;\n link?: string;\n maximiseImage?: string | null;\n minimiseImage?: string | null;\n muteImage?: string | null;\n position?: \"left\" | \"right\" | string;\n unmuteImage?: string | null;\n styling?: {\n appearance?: {\n defaultSound?: string;\n pipHeight?: string | number;\n pipWidth?: string | number;\n };\n crossButton?: {\n color?: {\n cross?: string;\n fill?: string;\n stroke?: string;\n };\n enabled?: boolean;\n image?: string;\n margin?: {\n bottom?: number;\n left?: number;\n right?: number;\n top?: number;\n };\n selectedStyle?: string;\n size?: number;\n };\n cta?: {\n container?: {\n backgroundColor?: string;\n borderColor?: string;\n borderWidth?: number;\n ctaWidth?: number;\n ctaFullWidth?: boolean;\n height?: number;\n };\n text?: {\n color?: string;\n fontSize?: number;\n };\n };\n expandControls?: {\n enabled?: boolean;\n maximise?: {\n color?: {\n cross?: string;\n fill?: string;\n stroke?: string;\n };\n image?: string;\n margin?: {\n bottom?: number;\n left?: number;\n right?: number;\n top?: number;\n };\n selectedStyle?: string;\n size?: number;\n };\n minimise?: {\n color?: {\n cross?: string;\n fill?: string;\n stroke?: string;\n };\n image?: string;\n margin?: {\n bottom?: number;\n left?: number;\n right?: number;\n top?: number;\n };\n selectedStyle?: string;\n size?: number;\n };\n };\n expandablePip?: string;\n isMovable?: boolean;\n pipBottomPadding?: number | string;\n pipTopPadding?: number | string;\n soundToggle?: {\n enabled?: boolean;\n defaultSound?: string;\n mute?: {\n color?: {\n cross?: string;\n fill?: string;\n stroke?: string;\n };\n image?: string;\n margin?: {\n bottom?: number;\n left?: number;\n right?: number;\n top?: number;\n };\n selectedStyle?: string;\n size?: number;\n };\n unmute?: {\n color?: {\n cross?: string;\n fill?: string;\n stroke?: string;\n };\n image?: string;\n margin?: {\n bottom?: number;\n left?: number;\n right?: number;\n top?: number;\n };\n selectedStyle?: string;\n size?: number;\n };\n };\n };\n}\n\ninterface IconConfig {\n color?: {\n cross?: string;\n fill?: string;\n stroke?: string;\n };\n image?: string;\n margin?: {\n bottom?: number;\n left?: number;\n right?: number;\n top?: number;\n };\n selectedStyle?: string;\n size?: number;\n}\n\ntype PipCampaign = Campaign & {\n campaign_type: \"PIP\";\n details: PipCampaignDetails;\n display_trigger?: boolean;\n screen?: string;\n position?: string;\n id: string;\n};\n\nconst normalizeScreen = (value?: string | null): string => (value || \"\").trim().toLowerCase();\n\nconst parseNumber = (value: unknown, fallback: number): number => {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n};\n\nfunction PipIcon({ iconType, color }: { iconType: \"close\" | \"expand\" | \"minimize\" | \"mute\" | \"unmute\"; color: string }) {\n const stroke = color || \"#FFFFFF\";\n\n if (iconType === \"close\") {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"70%\" height=\"70%\" aria-hidden>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" stroke={stroke} strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" stroke={stroke} strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n\n if (iconType === \"expand\") {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"70%\" height=\"70%\" aria-hidden>\n <polyline points=\"8,3 3,3 3,8\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <line x1=\"3\" y1=\"3\" x2=\"9\" y2=\"9\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" />\n <polyline points=\"16,21 21,21 21,16\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <line x1=\"15\" y1=\"15\" x2=\"21\" y2=\"21\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n\n if (iconType === \"minimize\") {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"70%\" height=\"70%\" aria-hidden>\n <polyline points=\"9,9 3,9 3,3\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <line x1=\"3\" y1=\"9\" x2=\"9\" y2=\"3\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" />\n <polyline points=\"15,15 21,15 21,21\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <line x1=\"15\" y1=\"21\" x2=\"21\" y2=\"15\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n\n if (iconType === \"mute\") {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"70%\" height=\"70%\" aria-hidden>\n <polygon points=\"4,10 8,10 13,6 13,18 8,14 4,14\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <line x1=\"16\" y1=\"8\" x2=\"21\" y2=\"16\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"21\" y1=\"8\" x2=\"16\" y2=\"16\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n\n return (\n <svg viewBox=\"0 0 24 24\" width=\"70%\" height=\"70%\" aria-hidden>\n <polygon points=\"4,10 8,10 13,6 13,18 8,14 4,14\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d=\"M16 10 Q18 12 16 14\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" />\n <path d=\"M18 8 Q22 12 18 16\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction IconButton({\n iconType,\n config,\n imageOverride,\n onClick,\n}: {\n iconType: \"close\" | \"expand\" | \"minimize\" | \"mute\" | \"unmute\";\n config?: IconConfig;\n imageOverride?: string | null;\n onClick: () => void;\n}) {\n const iconSize = parseNumber(config?.size, 18);\n const buttonSize = Math.max(24, iconSize + 10);\n const margin = config?.margin || {};\n\n const imageUrl = imageOverride || config?.image;\n const iconColor = config?.color?.cross || \"#FFFFFF\";\n const fillColor = config?.color?.fill || \"rgba(0,0,0,0.55)\";\n const strokeColor = config?.color?.stroke || \"rgba(255,255,255,0.35)\";\n\n return (\n <button\n data-control-button=\"true\"\n type=\"button\"\n onPointerDown={(e) => { e.preventDefault(); e.stopPropagation(); }}\n onPointerUp={(e) => { e.preventDefault(); e.stopPropagation(); }}\n onMouseDown={(e) => { e.preventDefault(); e.stopPropagation(); }}\n onTouchStart={(e) => { e.preventDefault(); e.stopPropagation(); }}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onClick(); }}\n title={config?.selectedStyle || iconType}\n style={{\n width: buttonSize,\n height: buttonSize,\n borderRadius: 999,\n pointerEvents: 'auto',\n zIndex: 10030,\n position: 'relative',\n border: `1px solid ${strokeColor}`,\n background: fillColor,\n color: iconColor,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n padding: 0,\n marginTop: parseNumber(margin.top, 0),\n marginRight: parseNumber(margin.right, 0),\n marginBottom: parseNumber(margin.bottom, 0),\n marginLeft: parseNumber(margin.left, 0),\n }}\n >\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={iconType}\n style={{ width: iconSize, height: iconSize, objectFit: \"contain\" }}\n />\n ) : (\n <PipIcon iconType={iconType} color={iconColor} />\n )}\n </button>\n );\n}\n\nconst Pip: React.FC = () => {\n const hookData = useCampaigns<PipCampaign>(\"PIP\");\n const campaigns = useAppStorysStore((state) => state.campaigns);\n const allCampaigns = useAppStorysStore((state) => state.allCampaigns);\n const currentScreen = useAppStorysStore((state) => state.currentScreen);\n const sdkVisible = useAppStorysStore((state) => state.isVisible);\n\n const [isClosed, setIsClosed] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const [isMuted, setIsMuted] = useState(true);\n const [isDragging, setIsDragging] = useState(false);\n const [dragPosition, setDragPosition] = useState<{ x: number; y: number } | null>(null);\n\n const dragOffsetRef = useRef({ x: 0, y: 0 });\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n const data = useMemo(() => {\n if (hookData) return hookData;\n\n const screen = normalizeScreen(currentScreen);\n const findFromList = (source: Campaign[]) => source.find((campaign) => {\n const item = campaign as PipCampaign;\n const isPip = item.campaign_type === \"PIP\";\n const matchesScreen = !normalizeScreen(item.screen) || normalizeScreen(item.screen) === screen;\n const hasTrigger = Boolean((item as any).trigger_event ?? (item as any).trigger);\n const displayTriggerReady = item.display_trigger !== false && !hasTrigger;\n return isPip && matchesScreen && displayTriggerReady;\n }) as PipCampaign | undefined;\n\n const found = findFromList(campaigns) ?? findFromList(allCampaigns);\n return found ? (resolveCampaignVariant(found) as PipCampaign) : undefined;\n }, [hookData, campaigns, allCampaigns, currentScreen]);\n\n // When variants are enabled, `resolveCampaignVariant` can produce a new object each render.\n // Stabilize the reference so effects don't reset state on every render.\n const stableData = useMemo(\n () => data,\n [data?.id, (data as any)?.details?.id]\n );\n\n useEffect(() => {\n if (!stableData) return;\n\n const details = (stableData as any).details || {};\n\n const defaultSoundSetting =\n details?.styling?.soundToggle?.defaultSound ||\n details?.styling?.appearance?.defaultSound ||\n \"yes\";\n\n setIsMuted(String(defaultSoundSetting).toLowerCase() !== \"yes\");\n setIsClosed(false);\n setIsExpanded(false);\n setDragPosition(null);\n\n // Match native: send only event + campaign id (no extra metadata)\n void trackEvent(\"viewed\", stableData.id);\n }, [stableData]);\n\n // Emit an `analyze` analytics event when the PIP is expanded\n // NOTE: analytics for expand are emitted where the action happens\n // (see expand handler below) to match native timing/args.\n\n useEffect(() => {\n if (videoRef.current) {\n videoRef.current.muted = isMuted;\n }\n }, [isMuted]);\n\n useEffect(() => {\n if (!isDragging) return;\n\n const onMouseMove = (event: MouseEvent) => {\n const nextX = event.clientX - dragOffsetRef.current.x;\n const nextY = event.clientY - dragOffsetRef.current.y;\n setDragPosition({ x: Math.max(0, nextX), y: Math.max(0, nextY) });\n };\n\n const onMouseUp = () => {\n setIsDragging(false);\n };\n\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n\n return () => {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, [isDragging]);\n\n if (!stableData || !stableData.details || isClosed || !sdkVisible) return null;\n\n const details = stableData.details;\n const styling = details.styling || {};\n const appearance = styling.appearance || {};\n\n const configuredWidth = parseNumber(details.width ?? appearance.pipWidth, 150);\n const configuredHeight = parseNumber(details.height ?? appearance.pipHeight, 300);\n\n // Keep mini PIP landscape rectangular like the web reference.\n const miniWidth = Math.max(configuredWidth, configuredHeight);\n const miniHeight = Math.min(configuredWidth, configuredHeight);\n\n const ctaContainer = styling.cta?.container || {};\n const ctaText = styling.cta?.text || {};\n const hasCta = Boolean(details.button_text && details.button_text.trim().length > 0);\n\n const ctaHeight = parseNumber(styling.cta?.container?.height, 42);\n const expandedExtraHeight = hasCta ? ctaHeight + 24 : 0;\n\n const bottomPadding = parseNumber(styling.pipBottomPadding, 20);\n const topPadding = parseNumber(styling.pipTopPadding, 0);\n\n const videoSource = isExpanded ? details.large_video || details.small_video : details.small_video || details.large_video;\n\n const position = (details.position || stableData.position || \"right\").toLowerCase();\n const isMovable = Boolean(styling.isMovable);\n const soundEnabled = styling.soundToggle?.enabled !== false;\n const closeEnabled = styling.crossButton?.enabled !== false;\n const expandEnabled =\n styling.expandControls?.enabled !== false &&\n String(styling.expandablePip || \"yes\").toLowerCase() === \"yes\";\n\n const closeConfig = styling.crossButton;\n const expandConfig = isExpanded ? styling.expandControls?.minimise : styling.expandControls?.maximise;\n const soundConfig = isMuted ? styling.soundToggle?.mute : styling.soundToggle?.unmute;\n\n const wrapperStyle: React.CSSProperties = {\n position: \"fixed\",\n zIndex: 10020,\n width: isExpanded ? \"100vw\" : miniWidth,\n height: isExpanded ? \"100vh\" : miniHeight,\n borderRadius: 0,\n overflow: \"hidden\",\n background: \"#000\",\n boxShadow: \"0 16px 40px rgba(0,0,0,0.35)\",\n cursor: isDragging ? \"grabbing\" : isMovable && !isExpanded ? \"grab\" : \"default\",\n transition: isDragging ? \"none\" : \"width 180ms ease, height 180ms ease, transform 180ms ease\",\n };\n\n if (dragPosition && !isExpanded) {\n wrapperStyle.left = dragPosition.x;\n wrapperStyle.top = dragPosition.y;\n } else if (isExpanded) {\n wrapperStyle.left = 0;\n wrapperStyle.top = 0;\n wrapperStyle.right = 0;\n wrapperStyle.bottom = 0;\n } else {\n if (position === \"left\") {\n wrapperStyle.left = 24;\n } else {\n wrapperStyle.right = 24;\n }\n\n if (topPadding > 0) {\n wrapperStyle.top = topPadding;\n } else {\n wrapperStyle.bottom = bottomPadding + 20;\n }\n }\n\n const onWrapperMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!isMovable || isExpanded) return;\n\n const target = event.target as HTMLElement;\n if (target.closest(\"[data-control-button='true']\")) return;\n\n const rect = event.currentTarget.getBoundingClientRect();\n dragOffsetRef.current = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n\n setDragPosition({ x: rect.left, y: rect.top });\n setIsDragging(true);\n };\n\n const handleOpenLink = () => {\n if (!details.link) return;\n // Match native: only send event + campaign id\n void trackEvent(\"clicked\", stableData.id);\n const link = String(details.link).trim();\n\n try {\n const s = useAppStorysStore.getState();\n const all = s.allCampaigns || [];\n const existing = s.campaigns || [];\n const referenced = all.find((c: any) => c.id === link);\n console.log('[Pip] clicked link=', link, 'allCount=', all.length, 'visibleCount=', existing.length, 'referenced=', !!referenced);\n if (referenced) {\n const revealed: any = { ...referenced };\n delete revealed.trigger_event;\n delete revealed.trigger;\n revealed.display_trigger = true;\n\n const idx = existing.findIndex((c: any) => c.id === revealed.id);\n if (idx === -1) {\n s.saveCampaigns([revealed, ...existing]);\n } else {\n const existingItem = existing[idx];\n const existingHasTrigger = Boolean((existingItem as any).trigger_event ?? (existingItem as any).trigger);\n if (existingHasTrigger) {\n const next = [...existing];\n next[idx] = revealed;\n s.saveCampaigns(next);\n }\n }\n return;\n }\n } catch (err) {\n // fallback to open as URL\n }\n\n window.open(details.link, \"_blank\");\n };\n\n if (!videoSource) return null;\n\n return (\n <div style={wrapperStyle} onMouseDown={onWrapperMouseDown}>\n <video\n ref={videoRef}\n src={videoSource}\n autoPlay\n loop\n playsInline\n muted={isMuted}\n style={{ width: \"100%\", height: isExpanded && hasCta ? `calc(100% - ${expandedExtraHeight}px)` : \"100%\", objectFit: isExpanded ? \"contain\" : \"cover\" }}\n onClick={handleOpenLink}\n onEnded={() => {\n if (data) void trackEvent(\"analyze\", data.id);\n }}\n />\n\n <div\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n display: \"flex\",\n gap: 8,\n zIndex: 2,\n }}\n >\n {soundEnabled && (\n <IconButton\n iconType={isMuted ? \"mute\" : \"unmute\"}\n config={soundConfig}\n imageOverride={isMuted ? details.muteImage : details.unmuteImage}\n onClick={() => setIsMuted((prev) => !prev)}\n />\n )}\n\n {expandEnabled && (\n <IconButton\n iconType={isExpanded ? \"minimize\" : \"expand\"}\n config={expandConfig}\n imageOverride={isExpanded ? details.minimiseImage : details.maximiseImage}\n onClick={() => {\n console.log('[Pip] expand button clicked - isExpanded before:', isExpanded);\n setIsExpanded((prev) => {\n const next = !prev;\n // Match native: when expanding, emit `viewed` then `analyze` with only campaign id\n if (next && stableData?.id) {\n void trackEvent('viewed', stableData.id);\n void trackEvent('analyze', stableData.id);\n }\n return next;\n });\n }}\n />\n )}\n\n {closeEnabled && (\n <IconButton\n iconType=\"close\"\n config={closeConfig}\n imageOverride={details.crossButtonImage}\n onClick={() => setIsClosed(true)}\n />\n )}\n </div>\n\n {isExpanded && hasCta && (\n <button\n data-control-button=\"true\"\n onClick={handleOpenLink}\n style={{\n position: \"absolute\",\n left: 12,\n right: 12,\n bottom: 12,\n height: ctaContainer.height || 42,\n width: ctaContainer.ctaFullWidth ? \"auto\" : ctaContainer.ctaWidth || \"auto\",\n margin: ctaContainer.ctaFullWidth ? \"0\" : \"0 auto\",\n background: ctaContainer.backgroundColor || \"#F7921C\",\n color: ctaText.color || \"#fff\",\n border: `${ctaContainer.borderWidth || 0}px solid ${ctaContainer.borderColor || \"transparent\"}`,\n borderRadius: 10,\n fontSize: ctaText.fontSize || 14,\n fontWeight: 600,\n cursor: details.link ? \"pointer\" : \"default\",\n }}\n >\n {details.button_text}\n </button>\n )}\n </div>\n );\n};\n\nexport { Pip };\nexport default Pip;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { LottiePlayer } from \"lottie-react\";\nimport useCampaigns from \"../../hooks/useCampaigns\";\nimport { hasVariants, resolveCampaignVariant } from \"../../core/variantResolver\";\nimport trackEvent from \"../../core/trackEvent\";\nimport useAppStorysStore from \"../../core/store\";\nimport { Campaign } from \"../../types\";\n\ninterface FloaterStyling {\n bottomLeftRadius?: number | string;\n bottomRightRadius?: number | string;\n topLeftRadius?: number | string;\n topRightRadius?: number | string;\n marginBottom?: number | string;\n marginLeft?: number | string;\n marginRight?: number | string;\n marginTop?: number | string;\n}\n\ninterface FloaterDetails {\n id?: string;\n image?: string;\n lottie_data?: string | Record<string, unknown>;\n link?: string;\n position?: string;\n width?: number | string;\n height?: number | string;\n styling?: FloaterStyling;\n}\n\ntype FloaterCampaign = Campaign & {\n campaign_type: \"FLT\";\n details: FloaterDetails;\n display_trigger?: boolean;\n};\n\nconst toNumber = (value: unknown, fallback = 0): number => {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n};\n\nconst normalizeScreen = (value?: string | null): string => (value || \"\").trim().toLowerCase();\n\nconst MEDIA_BUCKET_HOST = \"appstorysmediabucketdev.s3.ap-south-1.amazonaws.com\";\n\nconst resolveLottieCandidateUrls = (url: string): string[] => {\n try {\n if (typeof window === \"undefined\") return [url];\n\n const parsed = new URL(url);\n if (parsed.hostname !== MEDIA_BUCKET_HOST) return [url];\n\n const isDevServer = Boolean(window.location.port);\n const proxyUrl = `/appstorys-media${parsed.pathname}${parsed.search}`;\n\n if (isDevServer) {\n // Prefer proxy in dev (works for localhost and LAN IP access), keep source URL as fallback.\n return [proxyUrl, url];\n }\n\n return [url];\n } catch {\n return [url];\n }\n};\n\nconst isLikelyLottieJson = (value: unknown): value is Record<string, unknown> => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const candidate = value as Record<string, unknown>;\n return Array.isArray(candidate.layers) || Array.isArray(candidate.assets) || typeof candidate.v === \"string\";\n};\n\nclass FloaterLottieErrorBoundary extends React.Component<\n { onError: () => void; children: React.ReactNode },\n { hasError: boolean }\n> {\n constructor(props: { onError: () => void; children: React.ReactNode }) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch() {\n this.props.onError();\n }\n\n render() {\n if (this.state.hasError) return null;\n return this.props.children;\n }\n}\n\nconst Floater: React.FC = () => {\n const [lottieData, setLottieData] = useState<any>(null);\n const [lottieUrls, setLottieUrls] = useState<string[]>([]);\n const [lottieFailed, setLottieFailed] = useState(false);\n const [lottieLoading, setLottieLoading] = useState(false);\n const lottieContainerRef = useRef<HTMLDivElement | null>(null);\n const lottieAnimationRef = useRef<any>(null);\n const hookData = useCampaigns<FloaterCampaign>(\"FLT\");\n const campaigns = useAppStorysStore((state) => state.campaigns);\n const allCampaigns = useAppStorysStore((state) => state.allCampaigns);\n const currentScreen = useAppStorysStore((state) => state.currentScreen);\n const sdkVisible = useAppStorysStore((state) => state.isVisible);\n const viewedKeyRef = useRef<string | null>(null);\n\n const data = hookData ??\n ((): FloaterCampaign | undefined => {\n const found = [...campaigns, ...allCampaigns].find((campaign) => {\n const item = campaign as FloaterCampaign;\n if (item.campaign_type !== \"FLT\") return false;\n // Hide campaigns that are explicitly display_trigger=false or that carry a trigger\n const hasTrigger = Boolean((item as any).trigger_event ?? (item as any).trigger);\n if (item.display_trigger === false || hasTrigger) return false;\n return !normalizeScreen(item.screen) || normalizeScreen(item.screen) === normalizeScreen(currentScreen);\n }) as FloaterCampaign | undefined;\n\n if (!found) return undefined;\n try {\n return resolveCampaignVariant(found) as FloaterCampaign;\n } catch {\n return found;\n }\n })();\n\n const campaignId = data?.id;\n const mappedVariantId = useAppStorysStore((state) => (campaignId ? state.variantMappings[campaignId] : undefined));\n\n useEffect(() => {\n if (!data?.id) return;\n if (!sdkVisible) return;\n\n // If this campaign supports variants, wait until a variant mapping exists\n // so `trackEvent` can attach `variant_id` consistently.\n const needsVariant = hasVariants(data);\n if (needsVariant && !mappedVariantId) return;\n\n const viewKey = `${data.id}:${mappedVariantId || \"\"}`;\n if (viewedKeyRef.current === viewKey) return;\n viewedKeyRef.current = viewKey;\n\n void trackEvent(\"viewed\", data.id);\n }, [data?.id, mappedVariantId, sdkVisible]);\n\n useEffect(() => {\n const lottieSource = data?.details?.lottie_data;\n\n setLottieData(null);\n setLottieUrls([]);\n setLottieFailed(false);\n setLottieLoading(false);\n\n if (!lottieSource) return;\n\n if (isLikelyLottieJson(lottieSource)) {\n setLottieData(lottieSource);\n setLottieLoading(true);\n return;\n }\n\n if (typeof lottieSource !== \"string\") {\n setLottieFailed(true);\n return;\n }\n\n const candidateUrls = resolveLottieCandidateUrls(lottieSource);\n setLottieUrls(candidateUrls);\n setLottieLoading(true);\n }, [data?.details?.lottie_data]);\n\n useEffect(() => {\n if (!data?.details?.lottie_data || !lottieContainerRef.current) return;\n\n const lottie = LottiePlayer as any;\n if (!lottie || typeof lottie.loadAnimation !== \"function\") {\n setLottieFailed(true);\n setLottieLoading(false);\n return;\n }\n\n let cancelled = false;\n let activeAnimation: any = null;\n\n const cleanupCurrent = () => {\n if (activeAnimation && typeof activeAnimation.destroy === \"function\") {\n activeAnimation.destroy();\n }\n activeAnimation = null;\n lottieAnimationRef.current = null;\n };\n\n const tryLoadByPath = (paths: string[], index: number) => {\n if (cancelled) return;\n if (index >= paths.length) {\n setLottieFailed(true);\n setLottieLoading(false);\n console.error(\"[Floater] lottie load failed\", { lottieUrls: paths });\n return;\n }\n\n cleanupCurrent();\n\n const animation = lottie.loadAnimation({\n container: lottieContainerRef.current,\n renderer: \"svg\",\n loop: true,\n autoplay: true,\n path: paths[index],\n });\n\n activeAnimation = animation;\n lottieAnimationRef.current = animation;\n\n animation.addEventListener(\"DOMLoaded\", () => {\n if (cancelled) return;\n setLottieLoading(false);\n });\n\n animation.addEventListener(\"data_failed\", () => {\n if (cancelled) return;\n tryLoadByPath(paths, index + 1);\n });\n };\n\n if (lottieData) {\n cleanupCurrent();\n const animation = lottie.loadAnimation({\n container: lottieContainerRef.current,\n renderer: \"svg\",\n loop: true,\n autoplay: true,\n animationData: lottieData,\n });\n activeAnimation = animation;\n lottieAnimationRef.current = animation;\n animation.addEventListener(\"DOMLoaded\", () => {\n if (!cancelled) {\n setLottieLoading(false);\n }\n });\n animation.addEventListener(\"data_failed\", () => {\n if (!cancelled) {\n setLottieFailed(true);\n setLottieLoading(false);\n }\n });\n } else if (lottieUrls.length > 0) {\n tryLoadByPath(lottieUrls, 0);\n }\n\n return () => {\n cancelled = true;\n cleanupCurrent();\n };\n }, [data?.details?.lottie_data, lottieData, lottieUrls]);\n\n if (!data || !data.details || !sdkVisible) return null;\n const { details } = data;\n const styling = details.styling || {};\n\n const resolvedPosition =\n typeof details.position === \"string\"\n ? details.position\n : typeof data.position === \"string\"\n ? data.position\n : \"right\";\n const position = resolvedPosition.toLowerCase() === \"left\" ? \"left\" : \"right\";\n\n const positionStyle: React.CSSProperties = {\n position: \"fixed\",\n left: position === \"left\" ? toNumber(styling.marginLeft, 12) : undefined,\n right: position === \"left\" ? undefined : toNumber(styling.marginRight, 12),\n top: toNumber(styling.marginTop, 0) > 0 ? toNumber(styling.marginTop, 0) : undefined,\n bottom: toNumber(styling.marginTop, 0) > 0 ? undefined : toNumber(styling.marginBottom, 80),\n zIndex: 10040,\n display: \"flex\",\n };\n\n const floaterStyle: React.CSSProperties = {\n width: toNumber(details.width, 60),\n height: toNumber(details.height, 60),\n background: \"transparent\",\n overflow: \"hidden\",\n borderBottomLeftRadius: toNumber(styling.bottomLeftRadius, 0),\n borderBottomRightRadius: toNumber(styling.bottomRightRadius, 0),\n borderTopLeftRadius: toNumber(styling.topLeftRadius, 0),\n borderTopRightRadius: toNumber(styling.topRightRadius, 0),\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: details.link ? \"pointer\" : \"default\",\n boxShadow: \"0 8px 18px rgba(0,0,0,0.2)\",\n };\n\n const handleClick = async () => {\n if (!details.link) return;\n\n await trackEvent(\"clicked\", data.id);\n const link = String(details.link).trim();\n\n try {\n const s = useAppStorysStore.getState();\n const all = s.allCampaigns || [];\n const existing = s.campaigns || [];\n\n // Robust matching: try several candidate matchers\n const referenced = all.find((c: any) => {\n if (!c) return false;\n const cid = String(c.id || \"\").trim();\n const details = c.details || {};\n const detailsCampaign = String(details.campaign || details.id || \"\").trim();\n if (cid && cid === link) return true;\n if (detailsCampaign && detailsCampaign === link) return true;\n // allow if the link contains the id or vice-versa\n if (cid && link.includes(cid)) return true;\n if (detailsCampaign && link.includes(detailsCampaign)) return true;\n return false;\n });\n\n console.log(\"[Floater] clicked link=\", link, \"allCampaignsCount=\", all.length, \"visibleCount=\", existing.length);\n console.log(\"[Floater] all ids=\", all.map((c: any) => c.id).slice(0,50));\n console.log(\"[Floater] referenced found=\", !!referenced, referenced && (referenced.id || referenced.details?.campaign || referenced.details?.id));\n\n if (referenced) {\n const revealed: any = { ...referenced };\n // Neglect trigger for this reveal flow\n delete revealed.trigger_event;\n delete revealed.trigger;\n revealed.display_trigger = true;\n const idx = existing.findIndex((c: any) => c.id === revealed.id);\n if (idx === -1) {\n console.log('[Floater] revealing campaign (prepended)', revealed.id);\n s.saveCampaigns([revealed, ...existing]);\n } else {\n const existingItem = existing[idx];\n const existingHasTrigger = Boolean((existingItem as any).trigger_event ?? (existingItem as any).trigger);\n if (existingHasTrigger) {\n // Replace the existing triggered entry with revealed copy (neglect trigger)\n const next = [...existing];\n next[idx] = revealed;\n console.log('[Floater] replacing existing triggered campaign with revealed one', revealed.id);\n s.saveCampaigns(next);\n } else {\n console.log('[Floater] campaign already visible and not trigger-driven', revealed.id);\n }\n }\n return;\n }\n } catch (err) {\n // fallback to open as URL\n console.warn('[Floater] error while resolving referenced campaign', err);\n }\n\n try {\n window.open(details.link, \"_blank\");\n } catch (err) {\n // ignore\n }\n };\n\n const canRenderLottie = Boolean(details.lottie_data && !lottieFailed);\n const canRenderImage = Boolean(details.image);\n const canRenderLoadingPlaceholder = Boolean(details.lottie_data && lottieLoading && !lottieData && !lottieFailed);\n\n if (!canRenderLottie && !canRenderImage && !canRenderLoadingPlaceholder) return null;\n\n return (\n <div style={positionStyle}>\n <div style={floaterStyle} onClick={() => void handleClick()}>\n {canRenderLottie ? (\n <FloaterLottieErrorBoundary key={String(details.lottie_data)} onError={() => setLottieFailed(true)}>\n <div ref={lottieContainerRef} style={{ width: \"100%\", height: \"100%\", display: \"block\" }} />\n </FloaterLottieErrorBoundary>\n ) : canRenderLoadingPlaceholder ? (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.08)\",\n color: \"#333\",\n fontSize: 10,\n fontWeight: 600,\n }}\n >\n ...\n </div>\n ) : (\n <img\n src={details.image}\n alt=\"floater\"\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\", display: \"block\" }}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default Floater;\n","import useAppStorysStore, { getAccessToken, getUserId } from \"./store\";\nimport { Campaign } from \"../types\";\n\nfunction normalizeScreenName(screen?: string | null): string {\n return (screen || \"\").trim().toLowerCase();\n}\n\nfunction isScreenMatch(campaign: Campaign, screenName: string): boolean {\n const campaignScreen = normalizeScreenName(campaign.screen);\n const currentScreen = normalizeScreenName(screenName);\n return !campaignScreen || campaignScreen === currentScreen;\n}\n\nexport default async function trackScreen(screenName: string) {\n try {\n const state = useAppStorysStore.getState();\n const accessToken = await getAccessToken();\n const accountId = state.accountId;\n\n if (!accessToken || !accountId) return;\n\n state.setCurrentScreen(screenName);\n state.setTrackedEvents([]); // Reset tracked events for new screen\n\n const baseUrl = state.baseUrl || 'https://users.appstorys.co';\n\n const response = await fetch(`${baseUrl}/v2/${accountId}/track-user-res`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${accessToken}`\n },\n body: JSON.stringify({\n user_id: getUserId(),\n screenName\n }),\n });\n\n if (!response.ok) return;\n\n const data = await response.json();\n\n // Update screen-capture flag from response\n if (typeof data.screen_capture_enabled !== 'undefined') {\n state.setScreenCaptureEnabled(Boolean(data.screen_capture_enabled));\n }\n\n // Handle variants\n if (data.variants && data.variants.length > 0) {\n const variantMappings: Record<string, string> = {};\n data.variants.forEach((variant: any) => {\n variantMappings[variant.id] = variant.v_id;\n });\n state.setVariantMappings(variantMappings);\n }\n\n // Handle personalization\n if (data.personalization_data) {\n state.setPersonalizationData(data.personalization_data);\n }\n\n // Filter campaigns\n const allCampaigns = state.allCampaigns || [];\n const eligibleCampaignIds = data.eligibleCampaignList || [];\n\n const foundCampaigns = allCampaigns.filter(campaign =>\n eligibleCampaignIds.includes(campaign.id!) &&\n isScreenMatch(campaign, screenName)\n );\n\n // Fetch missing campaigns if necessary\n const foundCampaignIds = foundCampaigns.map(c => c.id!);\n const missingCampaignIds = eligibleCampaignIds.filter((id: string) => !foundCampaignIds.includes(id));\n\n let missingCampaigns: Campaign[] = [];\n if (missingCampaignIds.length > 0) {\n const fallbackResponse = await fetch(`${baseUrl}/load-campaign-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${accessToken}`\n },\n body: JSON.stringify(missingCampaignIds),\n });\n\n if (fallbackResponse.ok) {\n const fallbackData = await fallbackResponse.json();\n missingCampaigns = fallbackData.filter((campaign: Campaign) =>\n isScreenMatch(campaign, screenName)\n );\n }\n }\n\n const eligibleCampaigns = [...foundCampaigns, ...missingCampaigns];\n\n // Keep display-trigger campaigns available even when eligibility API is partial.\n const displayTriggeredCampaigns = allCampaigns.filter((campaign: Campaign & { display_trigger?: boolean }) => {\n const hasTrigger = Boolean((campaign as any).trigger_event ?? (campaign as any).trigger);\n return isScreenMatch(campaign, screenName) && campaign.display_trigger === true && !hasTrigger;\n });\n\n const mergedCampaigns = [...eligibleCampaigns];\n const seenCampaignIds = new Set(mergedCampaigns.map((campaign) => campaign.id));\n\n for (const campaign of displayTriggeredCampaigns) {\n if (!seenCampaignIds.has(campaign.id)) {\n mergedCampaigns.push(campaign);\n seenCampaignIds.add(campaign.id);\n }\n }\n\n state.saveCampaigns(mergedCampaigns);\n } catch (error) {\n console.error('Error when tracking screen:', screenName, error);\n }\n}\n","import useAppStorysStore, { getAccessToken, getUserId } from \"./store\";\nimport { Attributes } from \"../types\";\nimport getDeviceInfo from \"./getDeviceInfo\";\nimport { sendOrQueue } from \"./offlineQueue\";\n\n/**\n * Sets custom attributes for the user.\n * These properties can be used for campaign targeting and segmentation.\n * \n * @param attributes - A key-value object of user properties.\n */\nexport default async function setUserProperties(attributes: Attributes) {\n try {\n const accessToken = await getAccessToken();\n const userId = getUserId();\n const state = useAppStorysStore.getState();\n\n if (!accessToken || !userId) {\n console.warn(\"AppStorys: Missing accessToken or userId. Ensure SDK is initialized before setting user properties.\");\n return;\n }\n\n let finalMetadata: Record<string, any> = {\n ...(attributes || {}),\n };\n\n const deviceInfo = await getDeviceInfo();\n finalMetadata = {\n ...finalMetadata,\n ...deviceInfo,\n };\n\n const bodyData: any = {\n user_id: userId,\n attributes: finalMetadata\n };\n\n const baseUrl = state.baseUrl || 'https://users.appstorys.co';\n\n await sendOrQueue({\n url: `${baseUrl}/update-user-atr`,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: bodyData,\n });\n\n } catch (error) {\n console.error(\"AppStorys: Error in setUserProperties:\", error);\n }\n}\n","import useAppStorysStore from '../core/store';\n\nexport function personalizeText(text: string): string {\n if (!text || text.trim() === '') {\n return text;\n }\n\n const personalizationData = useAppStorysStore.getState().personalizationData;\n\n if (!personalizationData || Object.keys(personalizationData).length === 0) {\n return replacePlaceholdersWithFallback(text);\n }\n\n const regex = /\\{\\{([^|}\\s]+)\\s*\\|\\s*([^}]+)\\}\\}/g;\n\n return text.replace(regex, (_, variableName, fallbackValue) => {\n const trimmedVariable = variableName.trim();\n const trimmedFallback = fallbackValue.trim();\n\n return personalizationData[trimmedVariable] ?? trimmedFallback;\n });\n}\n\nfunction replacePlaceholdersWithFallback(text: string): string {\n const regex = /\\{\\{[^|}\\s]+\\s*\\|\\s*([^}]+)\\}\\}/g;\n\n return text.replace(regex, (_, fallbackValue) => {\n return fallbackValue.trim();\n });\n}\n","import { WebStorage } from '../adapters/web/storage';\nimport { Campaign } from '../types';\nimport { getAccessToken, getUserId } from './store';\nimport useAppStorysStore from './store';\n\nconst STORAGE_KEY_CAMPAIGNS = \"appstorys_campaigns_cache\";\nconst STORAGE_KEY_ETAG = \"appstorys_campaigns_etag\";\nconst STORAGE_KEY_VERSION = \"appstorys_campaigns_version\";\n\nexport interface FetchCampaignsResult {\n campaigns: Campaign[];\n version: number;\n}\n\nexport default async function fetchAllCampaigns(accountId: string, screenName?: string): Promise<FetchCampaignsResult> {\n try {\n const isLocalDev =\n typeof window !== \"undefined\" &&\n (window.location.hostname === \"localhost\" || window.location.hostname === \"127.0.0.1\");\n\n const url = isLocalDev\n ? `/appstorys-campaigns/clients/${accountId}/campaigns.json`\n : `https://dev-cdn-campaign-appstorys.s3.ap-south-1.amazonaws.com/clients/${accountId}/campaigns.json`;\n\n const cachedData = await WebStorage.getItem(STORAGE_KEY_CAMPAIGNS);\n const cachedEtag = await WebStorage.getItem(STORAGE_KEY_ETAG);\n const cachedVersion = await WebStorage.getItem(STORAGE_KEY_VERSION);\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n };\n\n // Keep ETag revalidation for non-local environments only.\n if (!isLocalDev && cachedEtag) {\n headers[\"If-None-Match\"] = cachedEtag;\n }\n\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n ...(isLocalDev ? { cache: \"no-store\" as RequestCache } : {}),\n });\n\n if (response.status === 304) {\n return {\n campaigns: cachedData ? JSON.parse(cachedData) : [],\n version: cachedVersion ? parseInt(cachedVersion) : 1,\n };\n }\n\n const newEtag = response.headers.get(\"ETag\");\n const responseData: any[] = await response.json();\n\n let version = 2;\n let campaigns: Campaign[] = responseData;\n\n // Determine an effective screen name. If caller didn't provide one, try\n // to fetch it from the users service `v2/{accountId}/track-user-res`.\n let effectiveScreenName = screenName;\n if (!effectiveScreenName) {\n try {\n const accessToken = await getAccessToken();\n const userId = getUserId();\n const usersBase = isLocalDev ? '/appstorys-users' : 'https://users.appstorys.co';\n\n const trackResp = await fetch(`${usersBase}/v2/${accountId}/track-user-res`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {}),\n },\n body: JSON.stringify({\n user_id: userId,\n screenName: (typeof window !== 'undefined' && window.location && window.location.pathname) ? window.location.pathname : '',\n silentUpdate: true,\n }),\n });\n\n if (trackResp.ok) {\n const trackData = await trackResp.json();\n console.info('AppStorys: fetchAllCampaigns track-user-res returned', trackData);\n const possibleScreen = trackData?.screenName || trackData?.screen || trackData?.currentScreen || trackData?.screen_name || trackData?.current_screen;\n if (possibleScreen) {\n effectiveScreenName = possibleScreen;\n }\n try {\n const s = useAppStorysStore.getState();\n if (typeof trackData.screen_capture_enabled !== 'undefined') {\n s.setScreenCaptureEnabled(Boolean(trackData.screen_capture_enabled));\n }\n } catch (err) {\n // ignore\n }\n }\n } catch (err) {\n console.warn('Could not fetch screen name from track-user-res:', err);\n }\n }\n\n if (responseData.length > 0 && responseData[0].version !== undefined) {\n version = responseData[0].version;\n campaigns = responseData.slice(1);\n }\n\n // If no campaigns found in the primary source, try fallback using track-user and load-campaign-data\n if ((!campaigns || campaigns.length === 0)) {\n try {\n const accessToken = await getAccessToken();\n const userId = getUserId();\n const usersBase = isLocalDev ? '/appstorys-users' : 'https://users.appstorys.co';\n\n const trackResp = await fetch(`${usersBase}/v2/${accountId}/track-user-res`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {}),\n },\n body: JSON.stringify({\n user_id: userId,\n screenName: (typeof window !== 'undefined' && window.location && window.location.pathname) ? window.location.pathname : '',\n silentUpdate: true,\n }),\n });\n\n if (trackResp.ok) {\n const trackData = await trackResp.json();\n const userIdFromResp = trackData?.user_id || trackData?.id || trackData?.userId || userId;\n\n try {\n const s = useAppStorysStore.getState();\n if (typeof trackData.screen_capture_enabled !== 'undefined') {\n s.setScreenCaptureEnabled(Boolean(trackData.screen_capture_enabled));\n }\n } catch (err) {\n // ignore\n }\n\n if (userIdFromResp) {\n const loadUrl = isLocalDev\n ? `/appstorys-users/load-campaign-data`\n : `https://users.appstorys.com/load-campaign-data`;\n\n const fallbackResponse = await fetch(loadUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {}),\n },\n body: JSON.stringify({ user_id: userIdFromResp }),\n });\n\n if (fallbackResponse.ok) {\n const fallbackData: any[] = await fallbackResponse.json();\n console.log(`Fetched ${fallbackData.length} missing campaigns from fallback`);\n console.log('Fallback campaigns:', JSON.stringify(fallbackData, null, 2));\n\n // Use fallback campaigns if available\n if (fallbackData && fallbackData.length > 0) {\n campaigns = fallbackData as Campaign[];\n }\n } else {\n console.error('Failed to fetch missing campaigns:', await fallbackResponse.text());\n }\n }\n }\n } catch (error) {\n console.error('Error fetching missing campaigns via fallback:', error);\n }\n }\n\n // Filter campaigns by effective screenName if available\n if (effectiveScreenName && campaigns && campaigns.length > 0) {\n const normalize = (s?: string | null) => (s || '').trim().toLowerCase();\n const current = normalize(effectiveScreenName);\n campaigns = campaigns.filter(campaign => !normalize(campaign.screen) || normalize(campaign.screen) === current);\n }\n\n await WebStorage.setItem(STORAGE_KEY_CAMPAIGNS, JSON.stringify(campaigns));\n await WebStorage.setItem(STORAGE_KEY_VERSION, version.toString());\n\n if (newEtag) {\n await WebStorage.setItem(STORAGE_KEY_ETAG, newEtag);\n }\n\n return { campaigns, version };\n\n } catch (error) {\n console.error(\"Error fetching campaigns:\", error);\n const cachedData = await WebStorage.getItem(STORAGE_KEY_CAMPAIGNS);\n const cachedVersion = await WebStorage.getItem(STORAGE_KEY_VERSION);\n\n return {\n campaigns: cachedData ? JSON.parse(cachedData) : [],\n version: cachedVersion ? parseInt(cachedVersion) : 1,\n };\n }\n}\n","import useAppStorysStore, { getAccessToken } from \"./store\";\n\ninterface ReconcileUserRequest {\n anonymous_user_id: string;\n identified_user_id: string;\n}\n\n/**\n * Reconciles an anonymous user with an identified user.\n * This merges the anonymous user's data with the identified user's data.\n * \n * @param anonymousUserId - The previous anonymous user ID\n * @param identifiedUserId - The new identified user ID\n * @returns Promise<boolean> - true if reconciliation was successful, false otherwise\n */\nexport default async function reconcileAnonymousUser(\n anonymousUserId: string,\n identifiedUserId: string\n): Promise<boolean> {\n try {\n const accessToken = await getAccessToken();\n const state = useAppStorysStore.getState();\n \n if (!accessToken) {\n console.error('AppStorys: Access token not found for reconciliation');\n return false;\n }\n\n const requestBody: ReconcileUserRequest = {\n anonymous_user_id: anonymousUserId,\n identified_user_id: identifiedUserId,\n };\n\n const baseUrl = state.baseUrl || 'https://users.appstorys.co';\n\n const response = await fetch(`${baseUrl}/reconcile-anonymous-user`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${accessToken}`,\n },\n body: JSON.stringify(requestBody),\n });\n\n if (response.ok) {\n return true;\n } else {\n const errorText = await response.text();\n console.error('AppStorys: Failed to reconcile anonymous user:', response.status, errorText);\n return false;\n }\n } catch (error) {\n console.error('AppStorys: Error in reconcileAnonymousUser:', error);\n return false;\n }\n}\n","import useAppStorysStore from \"./store\";\nimport { isBackPressCampaignReady, BACK_PRESS_SENTINEL } from \"../hooks/useCampaigns\";\n\n/**\n * Manages 'Exit Intent' or 'Back Press' behavior for the Web SDK.\n * This translates the mobile back button behavior to web-friendly triggers:\n * 1. Mouse leaving the viewport towards the top (classic exit intent).\n * 2. Intercepting the browser's back button via the PopState API.\n */\nclass ExitIntentManager {\n private isInitialized = false;\n\n public setup() {\n if (this.isInitialized || typeof window === 'undefined') return;\n\n // 1. Mouse Move / Exit Intent\n document.addEventListener('mouseleave', this.handleMouseLeave);\n\n // 2. Browser Back Button (PopState)\n window.addEventListener('popstate', this.handlePopState);\n \n // We should push an initial state so we can intercept the first back press\n if (window.history.state !== 'appstorys_navigation') {\n window.history.pushState('appstorys_navigation', '');\n }\n\n this.isInitialized = true;\n }\n\n public destroy() {\n if (!this.isInitialized || typeof window === 'undefined') return;\n document.removeEventListener('mouseleave', this.handleMouseLeave);\n window.removeEventListener('popstate', this.handlePopState);\n this.isInitialized = false;\n }\n\n private handleMouseLeave = (e: MouseEvent) => {\n // Only trigger if mouse leaves the TOP of the window\n if (e.clientY <= 0 && isBackPressCampaignReady()) {\n this.triggerCampaign();\n }\n };\n\n private handlePopState = () => {\n if (isBackPressCampaignReady()) {\n // Prevent default navigation\n window.history.pushState('appstorys_navigation', '');\n this.triggerCampaign();\n }\n };\n\n private triggerCampaign() {\n const state = useAppStorysStore.getState();\n const { trackedEvents } = state;\n\n if (!trackedEvents.includes(BACK_PRESS_SENTINEL)) {\n console.log('AppStorys: Exit Intent triggered. Displaying campaign.');\n state.setTrackedEvents([...trackedEvents, BACK_PRESS_SENTINEL]);\n }\n }\n}\n\nexport const exitIntentManager = new ExitIntentManager();\n","import useAppStorysStore from \"./store\";\n\n/**\n * Manages the visibility state of the SDK.\n * It listens to the browser's Page Visibility API and updates the global store.\n * This is crucial for pausing/resuming resource-heavy operations like video playback (PiP).\n */\nclass VisibilityManager {\n private isInitialized = false;\n\n public setup() {\n if (this.isInitialized || typeof document === 'undefined') return;\n\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n \n // Set initial state\n this.updateVisibility(document.visibilityState === 'visible');\n \n this.isInitialized = true;\n }\n\n public destroy() {\n if (!this.isInitialized || typeof document === 'undefined') return;\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n this.isInitialized = false;\n }\n\n private handleVisibilityChange = () => {\n this.updateVisibility(document.visibilityState === 'visible');\n };\n\n /**\n * Updates the global SDK visibility state.\n * Can be called by the visibilitychange listener or manually via the public API.\n */\n public updateVisibility(isVisible: boolean) {\n const state = useAppStorysStore.getState();\n if (state.isVisible !== isVisible) {\n console.log(`AppStorys: SDK visibility changed to ${isVisible ? 'visible' : 'hidden'}`);\n state.setVisibility(isVisible);\n }\n }\n}\n\nexport const visibilityManager = new VisibilityManager();\n","import { WebStorage } from '../adapters/web/storage';\n\nconst ANONYMOUS_USER_KEY = 'anonymous_user_id';\n\nexport async function generateAnonymousUserId(): Promise<string> {\n const currentTimeMs = Date.now();\n const browserName = navigator.userAgent.split(' ')[0].replace(/[^a-zA-Z0-9]/g, '_');\n return `${currentTimeMs}_${browserName}`;\n}\n\nexport async function getOrCreateAnonymousUserId(): Promise<string> {\n try {\n const storedUserId = await WebStorage.getItem(ANONYMOUS_USER_KEY);\n \n if (storedUserId) {\n return storedUserId;\n }\n \n const newUserId = await generateAnonymousUserId();\n await WebStorage.setItem(ANONYMOUS_USER_KEY, newUserId);\n return newUserId;\n } catch (error) {\n console.error('Error managing anonymous user ID:', error);\n return await generateAnonymousUserId();\n }\n}\n\nexport async function clearAnonymousUserId(): Promise<void> {\n try {\n await WebStorage.removeItem(ANONYMOUS_USER_KEY);\n } catch (error) {\n console.error('Error clearing anonymous user ID:', error);\n }\n}\n\nexport async function getStoredAnonymousUserId(): Promise<string | null> {\n try {\n return await WebStorage.getItem(ANONYMOUS_USER_KEY);\n } catch (error) {\n console.error('Error getting stored anonymous user ID:', error);\n return null;\n }\n}\n","// Dev helper: visually mark host elements that can receive widgets\ndeclare global {\n interface Window {\n AppStorysShowWidgetElements?: () => void;\n }\n}\n\nfunction injectStyles() {\n if (document.getElementById('appstorys-widget-debug-styles')) return;\n const style = document.createElement('style');\n style.id = 'appstorys-widget-debug-styles';\n style.innerHTML = `\n .appstorys-widget-debug-pill {\n position: absolute;\n top: 8px;\n left: 8px;\n background: #ff7a18;\n color: white;\n padding: 6px 10px;\n border-radius: 14px;\n font-weight: 700;\n font-size: 12px;\n z-index: 2147483647;\n box-shadow: 0 6px 18px rgba(0,0,0,0.12);\n pointer-events: none;\n }\n .appstorys-widget-debug-overlay {\n outline: 3px dashed rgba(255,122,24,0.85);\n outline-offset: 6px;\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction makePill(text: string) {\n const pill = document.createElement('div');\n pill.className = 'appstorys-widget-debug-pill';\n pill.textContent = text;\n return pill;\n}\n\nfunction ensureRelative(el: Element) {\n const node = el as HTMLElement;\n const computed = getComputedStyle(node);\n if (computed.position === 'static' || !computed.position) {\n node.style.position = 'relative';\n }\n}\n\nwindow.AppStorysShowWidgetElements = function showWidgetElements() {\n try {\n injectStyles();\n const matches = Array.from(document.querySelectorAll('[data-as-id], [data-widget], [data-widget-id]'));\n if (!matches.length) {\n // fallback: try obvious ids/classes used in examples\n const fallbacks = ['#hero_section', '.hero_section', '#header_container', '.header_container'];\n fallbacks.forEach(sel => {\n const el = document.querySelector(sel);\n if (el) matches.push(el);\n });\n }\n\n if (!matches.length) {\n // last resort: mark body top-left\n const pill = makePill('Widget');\n pill.style.position = 'fixed';\n pill.style.top = '12px';\n pill.style.left = '12px';\n pill.style.pointerEvents = 'auto';\n document.body.appendChild(pill);\n return;\n }\n\n matches.forEach((el, idx) => {\n const target = el as HTMLElement;\n ensureRelative(target);\n target.classList.add('appstorys-widget-debug-overlay');\n // remove existing pill if present\n const existing = target.querySelector('.appstorys-widget-debug-pill');\n if (existing) existing.remove();\n const pill = makePill('Widget ' + (idx + 1));\n target.appendChild(pill);\n });\n } catch (err) {\n // swallow errors in dev helper\n // eslint-disable-next-line no-console\n console.error('AppStorysShowWidgetElements error', err);\n }\n};\n\nexport {};\n","import React, { useState, useEffect } from 'react';\nimport { CampaignStory } from '../../types';\nimport useAppStorysStore from '../../core/store';\nimport useCampaigns from '../../hooks/useCampaigns';\nimport trackEvent from '../../core/trackEvent';\nimport { StoryList } from './StoryList';\nimport { StoryOverlay } from './StoryOverlay';\n\nexport const Story: React.FC = () => {\n const data = useCampaigns<CampaignStory>('STR');\n const sdkVisible = useAppStorysStore((state) => state.isVisible);\n const [activeStoryIndex, setActiveStoryIndex] = useState<number | null>(null);\n const [viewedStories, setViewedStories] = useState<string[]>([]);\n\n useEffect(() => {\n try {\n const saved = localStorage.getItem('app_storys_viewed_stories');\n if (saved) {\n setViewedStories(JSON.parse(saved));\n }\n } catch (e) {\n console.error('Failed to load viewed stories:', e);\n }\n }, []);\n\n useEffect(() => {\n if (data && data.details) {\n void trackEvent('story_module_viewed', data.id);\n }\n }, [data]);\n\n if (!data || !data.details || data.details.length === 0 || !sdkVisible) return null;\n\n const handleStoryClick = (index: number) => {\n setActiveStoryIndex(index);\n const story = data.details[index];\n void trackEvent('story_opened', data.id, { story_id: story.id, story_name: story.name });\n };\n\n const handleNextStory = () => {\n if (activeStoryIndex === null) return;\n if (activeStoryIndex < data.details.length - 1) {\n setActiveStoryIndex(activeStoryIndex + 1);\n } else {\n setActiveStoryIndex(null);\n }\n };\n\n const handlePrevStory = () => {\n if (activeStoryIndex === null) return;\n if (activeStoryIndex > 0) {\n setActiveStoryIndex(activeStoryIndex - 1);\n }\n };\n\n return (\n <div className=\"story-group-container\" style={{\n width: '100vw',\n position: 'relative',\n left: '50%',\n right: '50%',\n marginLeft: '-50vw',\n marginRight: '-50vw',\n boxSizing: 'border-box'\n }}>\n <StoryList \n stories={data.details} \n viewedStories={viewedStories} \n onStoryClick={handleStoryClick} \n />\n {activeStoryIndex !== null && (\n <StoryOverlay \n stories={data.details}\n activeStoryIndex={activeStoryIndex}\n dataId={data.id}\n viewedStories={viewedStories}\n setViewedStories={setViewedStories}\n onNextStory={handleNextStory}\n onPrevStory={handlePrevStory}\n onClose={() => setActiveStoryIndex(null)}\n />\n )}\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport * as LottieModule from 'lottie-react';\n\nconst Lottie =\n (LottieModule as any).default?.default ??\n (LottieModule as any).default ??\n (LottieModule as any).Lottie ??\n (LottieModule as any);\n\ninterface StoryThumbnailProps {\n src: string;\n alt?: string;\n style?: React.CSSProperties;\n size?: number;\n}\n\nexport const StoryThumbnail: React.FC<StoryThumbnailProps> = ({ src, alt, style, size }) => {\n const [lottieData, setLottieData] = useState<any>(null);\n const [lottieFailed, setLottieFailed] = useState(false);\n\n useEffect(() => {\n if (src && src.toLowerCase().endsWith('.json')) {\n fetch(src)\n .then(res => {\n if (!res.ok) throw new Error('Failed to fetch Lottie');\n return res.json();\n })\n .then(json => {\n setLottieData(json);\n setLottieFailed(false);\n })\n .catch(err => {\n console.error('AppStorys: Error loading Lottie thumbnail:', err);\n setLottieFailed(true);\n });\n } else {\n setLottieData(null);\n setLottieFailed(false);\n }\n }, [src]);\n\n const baseStyle: React.CSSProperties = {\n width: size ? `${size}px` : (style?.width || '100%'),\n height: size ? `${size}px` : (style?.height || '100%'),\n objectFit: 'cover',\n display: 'block',\n ...style\n };\n\n if (lottieData && !lottieFailed) {\n const LottieComp = (Lottie as any).default || Lottie;\n return (\n <LottieComp \n animationData={lottieData} \n loop={true} \n autoplay={true}\n style={baseStyle}\n />\n );\n }\n\n return (\n <img\n src={src}\n alt={alt || 'story thumbnail'}\n style={baseStyle}\n onError={() => setLottieFailed(true)}\n />\n );\n};\n","import React from 'react';\nimport { Story as StoryType } from '../../types';\nimport { StoryThumbnail } from './StoryThumbnail';\n\ninterface StoryGroupItemProps {\n story: StoryType;\n isViewed: boolean;\n onClick: () => void;\n}\n\nexport const StoryGroupItem: React.FC<StoryGroupItemProps> = ({ story, isViewed, onClick }) => {\n const styling = story.styling || {};\n const size = styling.size || 80;\n const ringWidth = styling.ringWidth || 3;\n const ringColor = isViewed ? '#E5E7EB' : (story.ringColor || '#FF0000');\n const nameColor = story.nameColor || '#333333';\n \n const cornerRadius = styling.cornerRadius;\n const borderRadiusStr = cornerRadius \n ? `${cornerRadius.topLeft || 0}px ${cornerRadius.topRight || 0}px ${cornerRadius.bottomRight || 0}px ${cornerRadius.bottomLeft || 0}px` \n : '50%';\n const imgBorderRadiusStr = cornerRadius \n ? `${Math.max(0, (cornerRadius.topLeft || 0) - 3)}px ${Math.max(0, (cornerRadius.topRight || 0) - 3)}px ${Math.max(0, (cornerRadius.bottomRight || 0) - 3)}px ${Math.max(0, (cornerRadius.bottomLeft || 0) - 3)}px` \n : '50%';\n\n return (\n <div\n onClick={onClick}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n cursor: 'pointer',\n flexShrink: 0\n }}\n >\n <div style={{\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: borderRadiusStr,\n border: `${ringWidth}px solid ${ringColor}`,\n padding: '3px',\n boxSizing: 'border-box',\n transition: 'transform 0.1s ease',\n overflow: 'hidden',\n backgroundColor: '#f5f5f5'\n }}>\n <StoryThumbnail\n src={story.thumbnail}\n alt={story.name}\n style={{\n borderRadius: imgBorderRadiusStr,\n }}\n />\n </div>\n <span style={{\n marginTop: '6px',\n fontSize: `${styling.name?.size || 12}px`,\n fontFamily: styling.name?.fontFamily || 'sans-serif',\n fontWeight: styling.name?.font === 'Bold' ? 'bold' : 'normal',\n color: nameColor,\n maxWidth: `${size + 10}px`,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n }}>\n {story.name}\n </span>\n </div>\n );\n};\n","import React from 'react';\nimport { Story as StoryType } from '../../types';\nimport { StoryGroupItem } from './StoryGroupItem';\n\ninterface StoryListProps {\n stories: StoryType[];\n viewedStories: string[];\n onStoryClick: (index: number) => void;\n}\n\nexport const StoryList: React.FC<StoryListProps> = ({ stories, viewedStories, onStoryClick }) => {\n return (\n <div style={{\n display: 'flex',\n gap: '18px',\n padding: '16px 20px',\n overflowX: 'auto',\n WebkitOverflowScrolling: 'touch',\n justifyContent: 'flex-start'\n }}>\n {stories.sort((a, b) => a.order - b.order).map((story, index) => (\n <StoryGroupItem\n key={story.id}\n story={story}\n isViewed={viewedStories.includes(story.id)}\n onClick={() => onStoryClick(index)}\n />\n ))}\n </div>\n );\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Story as StoryType, StorySlide } from '../../types';\nimport trackEvent from '../../core/trackEvent';\nimport useAppStorysStore, { getAccessToken } from '../../core/store';\nimport { InteractiveOverlay } from '../common/InteractiveElements/InteractiveOverlay';\nimport { StickerData } from '../common/InteractiveElements/types';\nimport PlayPauseButton from '../common/CommonElements/PlayPauseButton';\nimport Cta from '../common/CommonElements/Cta';\nimport CrossButton from '../common/CommonElements/CrossButton';\nimport { SoundButton } from '../common/CommonElements/SoundButton';\nimport ShareButton from '../common/CommonElements/ShareButton';\nimport { parseBackground } from '../../utils/styleUtils';\nimport { StoryThumbnail } from './StoryThumbnail';\n\n\ninterface StoryOverlayProps {\n stories: StoryType[];\n activeStoryIndex: number;\n dataId: string;\n viewedStories: string[];\n setViewedStories: React.Dispatch<React.SetStateAction<string[]>>;\n onNextStory: () => void;\n onPrevStory: () => void;\n onClose: () => void;\n}\n\nexport const StoryOverlay: React.FC<StoryOverlayProps> = ({\n stories,\n activeStoryIndex,\n dataId,\n viewedStories,\n setViewedStories,\n onNextStory,\n onPrevStory,\n onClose,\n}) => {\n const [activeSlideIndex, setActiveSlideIndex] = useState<number>(0);\n const [progress, setProgress] = useState<number>(0);\n const [isMuted, setIsMuted] = useState<boolean>(false);\n const [videoLoaded, setVideoLoaded] = useState<boolean>(false);\n const [isPaused, setIsPaused] = useState<boolean>(false);\n const [showShortcuts, setShowShortcuts] = useState<boolean>(false);\n const [showToast, setShowToast] = useState<string | null>(null);\n const [isDesktop, setIsDesktop] = useState(typeof window !== 'undefined' ? window.innerWidth >= 1024 : false);\n\n useEffect(() => {\n const handleResize = () => {\n setIsDesktop(window.innerWidth >= 1024);\n };\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n const progressTimerRef = useRef<any>(null);\n\n const activeVideoRef = useRef<HTMLVideoElement | null>(null);\n const clickStartTimeRef = useRef<number>(0);\n\n const currentStory = stories[activeStoryIndex];\n const currentSlide = currentStory?.slides[activeSlideIndex];\n\n const currentSlideStyling = currentSlide?.styling as any;\n const slideEditorSource = currentSlideStyling?.editorSource || currentSlideStyling?.meta?.editorSource;\n const slideIsStudio = slideEditorSource === 'studio' || slideEditorSource === 'editor';\n const slideBgImage = slideIsStudio ? currentSlideStyling?.background?.media?.mediaUrl : currentSlide?.image;\n const slideCtaText = slideIsStudio ? currentSlide?.content?.button_text : currentSlide?.button_text;\n const slideCtaLink = slideIsStudio ? currentSlide?.content?.link : currentSlide?.link;\n const slideVideo = currentSlide?.video || (slideIsStudio ? currentSlide?.content?.video?.[0]?.link : undefined);\n\n // Helper function for Native Share or Rich Toast\n const handleShare = async () => {\n const shareData = {\n title: currentStory.name,\n text: `Check out this story: ${currentStory.name}`,\n url: window.location.href,\n };\n\n if (currentSlide?.id) {\n void trackEvent('shared', dataId, { story_slide: currentSlide.id });\n }\n\n if (navigator.share) {\n try {\n await navigator.share(shareData);\n } catch (err) { }\n } else {\n if (navigator.clipboard) {\n try {\n await navigator.clipboard.writeText(window.location.href);\n setShowToast('Story link copied to clipboard!');\n setTimeout(() => setShowToast(null), 2500);\n } catch (err) { }\n }\n }\n };\n\n useEffect(() => {\n setActiveSlideIndex(0);\n setProgress(0);\n setVideoLoaded(false);\n setIsPaused(false);\n }, [activeStoryIndex]);\n\n // Setup Keyboard Shortcuts Event Listener Effect loads\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (document.activeElement?.tagName === 'INPUT' || document.activeElement?.tagName === 'TEXTAREA') return;\n\n switch (e.key) {\n case 'ArrowRight':\n handleNextSlide();\n break;\n case 'ArrowLeft':\n handlePrevSlide();\n break;\n case ' ':\n e.preventDefault();\n setIsPaused(prev => !prev);\n break;\n case 'Escape':\n onClose();\n break;\n case 's':\n case 'S':\n e.preventDefault();\n handleShare();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [activeSlideIndex, activeStoryIndex, isPaused, currentStory, onClose]);\n\n // Track slide viewed whenever activeSlideIndex changes Node layout budgets setups\n useEffect(() => {\n if (currentStory && currentSlide) {\n void trackEvent('viewed', dataId, {\n story_slide: currentSlide.id\n });\n }\n }, [activeSlideIndex, currentStory?.id, dataId]);\n\n useEffect(() => {\n if (currentStory && currentSlide) {\n const slideTime = currentStory.styling?.slideShowTime || 5;\n const isVideo = !!slideVideo;\n\n if (progressTimerRef.current) {\n clearInterval(progressTimerRef.current);\n }\n\n if (isPaused) {\n if (activeVideoRef.current) activeVideoRef.current.pause();\n return;\n } else {\n if (activeVideoRef.current) activeVideoRef.current.play().catch(() => { });\n }\n\n if (isVideo && !videoLoaded) {\n return;\n }\n\n progressTimerRef.current = setInterval(() => {\n setProgress((prev) => {\n if (prev >= 100) {\n handleNextSlide();\n return 100;\n }\n return prev + (100 / (slideTime * 10));\n });\n }, 100);\n\n return () => {\n if (progressTimerRef.current) clearInterval(progressTimerRef.current);\n };\n }\n }, [activeStoryIndex, activeSlideIndex, isPaused, videoLoaded]);\n\n if (!currentSlide) return null;\n\n const handleNextSlide = () => {\n if (activeSlideIndex < currentStory.slides.length - 1) {\n setActiveSlideIndex((prev) => prev + 1);\n setProgress(0);\n } else {\n // Mark story as viewed\n if (!viewedStories.includes(currentStory.id)) {\n const updated = [...viewedStories, currentStory.id];\n setViewedStories(updated);\n localStorage.setItem('app_storys_viewed_stories', JSON.stringify(updated));\n }\n onNextStory();\n }\n };\n\n const handlePrevSlide = () => {\n if (activeSlideIndex > 0) {\n setActiveSlideIndex((prev) => prev - 1);\n setProgress(0);\n } else {\n onPrevStory();\n }\n };\n\n const handleMouseDownNav = () => {\n clickStartTimeRef.current = Date.now();\n setIsPaused(true);\n };\n\n const handleMouseUpNav = (direction: 'next' | 'prev') => {\n setIsPaused(false);\n const duration = Date.now() - clickStartTimeRef.current;\n if (duration < 300) {\n if (direction === 'next') handleNextSlide();\n else handlePrevSlide();\n }\n };\n\n const handleVideoLoad = () => {\n setVideoLoaded(true);\n };\n\n const handleClickCTA = (slide: StorySlide) => {\n const styling = slide?.styling as any;\n const editorSource = styling?.editorSource || styling?.meta?.editorSource;\n const isStudio = editorSource === 'studio' || editorSource === 'editor';\n const link = isStudio ? slide.content?.link : slide.link;\n\n if (link) {\n void trackEvent('clicked', dataId, { story_slide: slide.id });\n if (link.startsWith('http')) {\n window.open(link, '_blank');\n } else {\n // Fallback for internal app routing or deep links\n window.location.href = link;\n }\n }\n };\n\n const toggleMute = (e: React.MouseEvent) => {\n e.stopPropagation();\n setIsMuted(!isMuted);\n };\n\n const crossConfig = currentStory?.styling?.crossButton;\n const soundConfig = currentStory?.styling?.soundToggle;\n const ctaStyling = currentSlide?.styling?.cta;\n const ctaContainer = ctaStyling?.container;\n const ctaTextStyling = ctaStyling?.text;\n\n\n\n // Responsive Styles\n const backdropStyle: React.CSSProperties = isDesktop ? {\n position: 'fixed',\n top: 0,\n left: 0,\n width: '100vw',\n height: '100vh',\n background: 'radial-gradient(circle at center, #0B1424 0%, #03070E 100%)',\n zIndex: 100000,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n overflow: 'hidden',\n color: 'white'\n } : {\n position: 'fixed',\n top: 0,\n left: 0,\n width: '100vw',\n height: '100vh',\n backgroundColor: 'rgba(0,0,0,0.95)',\n zIndex: 100000,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center'\n };\n\n const centerCardStyle: React.CSSProperties = isDesktop ? {\n position: 'relative',\n width: '380px',\n height: '680px',\n backgroundColor: '#000',\n borderRadius: '20px',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.8)',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n transition: 'all 0.3s ease',\n zIndex: 5\n } : {\n position: 'relative',\n width: '100%',\n maxWidth: '450px',\n height: '100%',\n maxHeight: '850px',\n backgroundColor: '#000',\n borderRadius: '0px',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n };\n\n const sideCardStyle: React.CSSProperties = {\n width: '240px',\n height: '420px',\n backgroundColor: '#000',\n borderRadius: '16px',\n overflow: 'hidden',\n opacity: 0.45,\n filter: 'none',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 10px 20px rgba(0,0,0,0.5)',\n border: '1px solid rgba(255, 255, 255, 0.05)',\n transform: 'scale(0.9)',\n transition: 'all 0.3s ease',\n cursor: 'pointer'\n };\n\n return (\n <div style={backdropStyle} onClick={() => !isDesktop && handleNextSlide()}>\n\n {/* Dynamic Ambient Glow Background Blur of current slide */}\n <div key={`${activeStoryIndex}-${activeSlideIndex}`} style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 0, overflow: 'hidden', pointerEvents: 'none', transition: 'all 0.6s ease-in-out' }}>\n {slideVideo ? (\n <video src={slideVideo} style={{ width: '100%', height: '100%', objectFit: 'cover', filter: 'blur(120px) saturate(1.8) opacity(0.35)' }} muted />\n ) : (\n <StoryThumbnail \n src={slideBgImage || currentStory.thumbnail} \n style={{ width: '100%', height: '100%', filter: 'blur(120px) saturate(1.8) opacity(0.35)' }} \n />\n )}\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, background: 'rgba(5, 5, 8, 0.4)' }} />\n </div>\n\n {isDesktop && (\n <>\n {/* Top Full Length Progress Bar Wrapper */}\n <div style={{\n width: '100%',\n display: 'flex',\n gap: '8px',\n padding: '12px 20px',\n boxSizing: 'border-box',\n zIndex: 10\n }}>\n {currentStory.slides.map((_, idx) => {\n let fillWidth = '0%';\n if (idx < activeSlideIndex) fillWidth = '100%';\n else if (idx === activeSlideIndex) fillWidth = `${progress}%`;\n\n return (\n <div key={idx} style={{\n flex: 1,\n height: '3px',\n backgroundColor: 'rgba(255,255,255,0.15)',\n borderRadius: '2px',\n overflow: 'hidden'\n }}>\n <div style={{\n width: fillWidth,\n height: '100%',\n backgroundColor: 'white',\n transition: idx === activeSlideIndex ? 'width 0.1s linear' : 'none'\n }} />\n </div>\n );\n })}\n </div>\n\n {/* Top Header Controls row Toolbar */}\n <div style={{\n width: '100%',\n display: 'grid',\n gridTemplateColumns: '1fr 380px 1fr',\n alignItems: 'center',\n padding: '12px 20px',\n boxSizing: 'border-box',\n zIndex: showShortcuts ? 2000 : 10\n }}>\n {/* Column 1: Empty left track boundary absolute layouts spacing layout dimension scaled framing sizes pricing layouts scaling pricing structure sets dimensional layouts budgeting format dimension heights scaling pricing structure scaled scaling space sizing */}\n <div />\n\n {/* Column 2: Clustered Central Display above active story card structure */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <StoryThumbnail \n src={currentStory.thumbnail} \n alt={currentStory.name} \n style={{ width: '36px', height: '36px', borderRadius: '50%', border: '2px solid #F97316' }} \n />\n <span style={{ color: 'white', fontWeight: 'bold', fontSize: '15px', whiteSpace: 'nowrap' }}>\n {currentStory.name}\n </span>\n </div>\n <div style={{ display: 'flex', gap: '8px' }}>\n {/* Share/Send Premium Icon */}\n <ShareButton\n config={{\n enabled: (currentStory?.styling?.share?.enabled ?? true) && !!slideCtaLink,\n image: currentStory?.styling?.share?.image ?? '',\n color: {\n cross: currentStory?.styling?.share?.color?.cross ?? '#ffffff',\n fill: currentStory?.styling?.share?.color?.fill ?? 'rgba(255,255,255,0.08)',\n stroke: currentStory?.styling?.share?.color?.stroke ?? 'transparent',\n },\n margin: { top: 0, bottom: 0, left: 0, right: 0 },\n size: currentStory?.styling?.share?.size ?? 36\n }}\n onPress={handleShare}\n style={{ position: 'relative', borderRadius: '10px' }}\n />\n\n {/* Speaker Mute/Unmute Premium Icon */}\n <SoundButton\n config={{\n size: 36,\n color: { cross: '#ffffff', fill: 'rgba(255,255,255,0.08)', stroke: 'transparent' },\n margin: { top: 0, bottom: 0, left: 0, right: 0 },\n image: isMuted ? (currentStory?.styling?.soundToggle?.mute?.image || '') : (currentStory?.styling?.soundToggle?.unmute?.image || '')\n }}\n onPress={toggleMute}\n type={isMuted ? 'mute' : 'unmute'}\n enabled={!!soundConfig?.enabled && !!slideVideo}\n style={{ position: 'relative', borderRadius: '10px' }}\n />\n\n {/* Play/Pause Premium Icon */}\n <PlayPauseButton isPaused={isPaused} onPress={() => setIsPaused(!isPaused)} />\n </div>\n </div>\n\n {/* Right Tools premium alignment setups absolute grids spacing dimension scales framework */}\n <div style={{ display: 'flex', gap: '10px', flex: 1, justifyContent: 'flex-end' }}>\n\n {/* Keyboard/Grid Shortcuts Icon with Dropout Menu List */}\n <div style={{ position: 'relative' }}>\n <button\n onClick={() => { setShowShortcuts(!showShortcuts); setIsPaused(!showShortcuts); }}\n style={{\n width: '36px',\n height: '36px',\n background: showShortcuts ? 'rgba(255,255,255,0.15)' : 'rgba(255,255,255,0.08)',\n border: showShortcuts ? '1px solid white' : '1px solid rgba(255,255,255,0.1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '10px',\n cursor: 'pointer',\n transition: 'all 0.2s',\n padding: 0,\n outline: 'none'\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect>\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect>\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect>\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect>\n </svg>\n </button>\n\n {showShortcuts && (\n <>\n <style>{`\n @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes fadeUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }\n `}</style>\n <div style={{ position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, background: 'rgba(0, 0, 0, 0.45)', zIndex: 1000, animation: 'fadeIn 0.2s ease-out forwards' }} onClick={() => { setShowShortcuts(false); setIsPaused(false); }} />\n <div style={{ position: 'absolute', top: '46px', right: 0, width: '260px', background: 'rgba(25, 25, 25, 0.98)', border: '1px solid rgba(255,255,255,0.08)', borderRadius: '16px', padding: '18px', boxShadow: '0 20px 25px -5px rgba(0,0,0,0.4), 0 10px 10px -5px rgba(0,0,0,0.4)', zIndex: 1001, animation: 'fadeUp 0.25s cubic-bezier(0.4, 0, 0.2, 1) forwards' }}>\n <div style={{ fontSize: '11px', fontWeight: 'bold', color: '#9CA3AF', letterSpacing: '1px', textTransform: 'uppercase', marginBottom: '16px', paddingBottom: '10px', borderBottom: '1px solid rgba(255,255,255,0.06)' }}>Keyboard Shortcuts</div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n\n {/* Next Story */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', gap: '4px' }}>\n <span style={{ background: 'rgba(255,255,255,0.08)', padding: '5px 8px', borderRadius: '5px', fontSize: '12px', color: 'white', border: '1px solid rgba(255,255,255,0.1)' }}>→</span>\n </div>\n <span style={{ fontSize: '13px', color: '#E5E7EB', fontWeight: '500' }}>Next slide</span>\n </div>\n\n {/* Previous Story */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', gap: '4px' }}>\n <span style={{ background: 'rgba(255,255,255,0.08)', padding: '5px 8px', borderRadius: '5px', fontSize: '12px', color: 'white', border: '1px solid rgba(255,255,255,0.1)' }}>←</span>\n </div>\n <span style={{ fontSize: '13px', color: '#E5E7EB', fontWeight: '500' }}>Previous slide</span>\n </div>\n\n {/* Play/Pause */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', gap: '4px' }}>\n <span style={{ background: 'rgba(255,255,255,0.08)', padding: '4px 10px', borderRadius: '5px', fontSize: '11px', color: '#9CA3AF', textTransform: 'lowercase', border: '1px solid rgba(255,255,255,0.1)' }}>space</span>\n </div>\n <span style={{ fontSize: '13px', color: '#E5E7EB', fontWeight: '500' }}>Play/Pause</span>\n </div>\n\n {/* Close */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', gap: '4px' }}>\n <span style={{ background: 'rgba(255,255,255,0.08)', padding: '4px 10px', borderRadius: '5px', fontSize: '11px', color: '#9CA3AF', textTransform: 'lowercase', border: '1px solid rgba(255,255,255,0.1)' }}>esc</span>\n </div>\n <span style={{ fontSize: '13px', color: '#E5E7EB', fontWeight: '500' }}>Close story</span>\n </div>\n\n {/* Share */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div style={{ display: 'flex', gap: '4px' }}>\n <span style={{ background: 'rgba(255,255,255,0.08)', padding: '5px 10px', borderRadius: '5px', fontSize: '12px', color: 'white', fontWeight: 'bold', border: '1px solid rgba(255,255,255,0.1)' }}>S</span>\n </div>\n <span style={{ fontSize: '13px', color: '#E5E7EB', fontWeight: '500' }}>Share story link</span>\n </div>\n\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* Close (X) Premium Icon */}\n <CrossButton\n config={{\n enabled: crossConfig?.enabled ?? true,\n image: crossConfig?.image ?? '',\n color: { cross: '#ffffff', fill: 'rgba(255,255,255,0.08)', stroke: 'transparent' },\n margin: { top: 0, bottom: 0, left: 0, right: 0 },\n size: 36\n }}\n onPress={onClose}\n style={{ position: 'relative', borderRadius: '10px' }}\n />\n </div>\n </div>\n </>\n )}\n\n {/* Main Container Multi-Card Display Slider Context Row Slider previews frames Carousel flex slider context Row layout frames Carousel structures structure Layout Card flex Context container framing Carousel Carousel previews Horizontal flexible flex Context rows dimensions scalable Carousel scaled frame scale layouts dimensional scalable dimensions scalable Context views sizing dimension sizing layout dimensions Context dimensional frame dimension widths scaling dimensionality scaled dims sizing dimension scales scalable layout scales Dimensional scales dimensional scale dimension scale layout sizes dimensions Scale dimension sizes scaled sizing dimensions dimension scalable layout framework dimensions Scaley dimension structure frameworks scaled scaled Context sizing dimension Scaley spacing dimensions scalable scalable framing Carousel dimension Scaley scalable dimensions dimensions structure frames structure scales scaled structures Scaley frame scalability framework frame dimension sizes dimension Scales scales scaling frameworks dimensions layout frames dimensions scales frames Scale scales templates framing scales Scaley contextual dimensional dimensions framework frame dimensions scales sizes framing scale framing dimension scale frameworks dimensions sizes scale Scale scale dimensions scaled scale dimensional dimensional scalable Context scalable sizing framework scales scalability style Context frame frame Scaley dimensions scaling styles scales scalable scaled sizing dimensions scalable dimensions scaling sizing sizing flexible dimensions framing flexibility layout dimensions dimension Scales Scale scale scalable flexible scale Scale Scale scales Scaley dimensions scaling Scaley scales scalable scales dimensions styling flexible flexible scale framing scales framework dimension height Scaley scalability flexible scale framing responsive frame responsive flexible responsive scalable Scaley scales sizes Scaley flexible responsive dimension frameworks scales Scaley dimensions scalable flexible responsive scale frameworks framing layouts scales scalable flexible scale framing scalable flexible flex row */}\n <div style={{\n display: isDesktop ? 'grid' : 'flex',\n gridTemplateColumns: isDesktop ? '1fr 380px 1fr' : 'none',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '12px', // Reduced gap dimension space scaling sizing layout\n flex: 1,\n width: '100%',\n maxWidth: '1400px',\n position: 'relative'\n }} onClick={(e) => isDesktop && e.stopPropagation()}>\n\n {isDesktop && (\n <div style={{ display: 'flex', justifyContent: 'flex-end', alignItems: 'center', gap: '12px', width: '100%', boxSizing: 'border-box' }}>\n\n {/* Previous Previews: Only show inner previous slide. Do not mix next story groups. */}\n {activeSlideIndex > 0 && (() => {\n const prevMedia = currentStory.slides[activeSlideIndex - 1];\n\n if (!prevMedia) return null;\n\n const prevStyling = prevMedia.styling as any;\n const prevEditorSource = prevStyling?.editorSource || prevStyling?.meta?.editorSource;\n const prevIsStudio = prevEditorSource === 'studio' || prevEditorSource === 'editor';\n const prevBgImage = prevIsStudio ? prevStyling?.background?.media?.mediaUrl : prevMedia.image;\n\n return (\n <div style={sideCardStyle} onClick={handlePrevSlide}>\n <StoryThumbnail src={prevBgImage || currentStory.thumbnail} />\n <div style={{ position: 'absolute', top: 0, bottom: 0, left: 0, right: 0, background: 'rgba(0,0,0,0.2)', backdropFilter: 'blur(1px)' }} />\n </div>\n );\n })()}\n\n {/* Previous Slide Arrow Navigator inside Flex Columns Alignments */}\n {activeSlideIndex > 0 && (\n <button onClick={handlePrevSlide} style={{ background: 'rgba(255,255,255,0.15)', border: '1px solid rgba(255,255,255,0.2)', color: 'white', borderRadius: '50%', width: '40px', height: '40px', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', fontSize: '18px', backdropFilter: 'blur(5px)', transition: 'background 0.2s' }} onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.25)'} onMouseLeave={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.15)'}>\n ‹\n </button>\n )}\n\n </div>\n )}\n\n\n\n {/* Story Player Container Center card box main container layout Card Center main container Center card frame dimensions container framing Context Center frames dimensions Card Center dimensions frame scales bounding framework scales Center structural bounding bounding center frameworks framing scales bound frame scale scaled structural bounded frameworks framing scale bound frames frames dimensions Scaley frameworks scaling scaled scaling bounding frameworks scalability boundary frame dimensions bound scales scaling templates framing scale boundary frame bound frames scale bound scales bounds frames frameworks frame scale Scaley frameworks bound frames layouts Center dimensions framing scales dimensions scalable dimensional scales bounding frameworks Scales bound dimensions scaled space dimensions bound frames scalable frameworks scales scaled scaled structures frame scales bounding structures scalability boundary framing scaling dimensions frame scalability scaled scaling bounding frameworks bounding scales scaled bounded bounding bound scales Scaley scaling framed bound scales scaling structures Scales scaled structures scalable bounding frames scalability boundary dimensional framework bounded space bound dimensions dimensions frameworks framing scale bound frames scales bounds framework Scaley bound dimensional frame scales bound scale frameworks scaled bounding Scale frame scalable scales layout Center layout Center structural boundary frame scale layout Center main bounding framework framing Scaley dimensions bounded Space boundary scalable scalable bounding structure scales scaled space dimension Space Space spacing dimension scaled bounded scales space boundaries scaled space Space spacing bounding bound bounded Space Space scale bound scale spacing spacing Space bound bound Space bounds frames bound scales spacing Space bounds Space space scale scalable dimensions bounding dimensions space bound Space space spacing scales bounding Scaley scales Scaling framed boundaries spacing Space bound dimensions Space Space space Space bounding space Space bound space scales bounding Space bound space scales bounds frame scales scaled bounds scaled items spaces spacing sizing frameworks spacing scale frames scale layout Center dimensions layout Center dimension frames layout Center sizing framework sizing structures Center dimensions scalable scalable frame size scale framing center layout flexible flex container main card framing scalable flexible layout scalable flexible scale Center Card bounding Center frame responsive Layout dimension frameworks scales Scaley dimensions scalable Center Flexible scaling scaled flexible Flex Card Center framing scalable Center sizing Responsive Layout scale flexible scale Center flexible flexible scales framework dimension flexible flexible row scale */}\n <div style={centerCardStyle} onClick={(e) => e.stopPropagation()}>\n\n {!isDesktop && (\n <div style={{\n position: 'absolute',\n top: '0px',\n left: '0px',\n right: '0px',\n display: 'flex',\n gap: '4px',\n padding: '10px',\n zIndex: 10\n }}>\n {currentStory.slides.map((_, idx) => {\n let fillWidth = '0%';\n if (idx < activeSlideIndex) fillWidth = '100%';\n else if (idx === activeSlideIndex) fillWidth = `${progress}%`;\n\n return (\n <div key={idx} style={{\n flex: 1,\n height: '3px',\n backgroundColor: 'rgba(255,255,255,0.3)',\n borderRadius: '2px',\n overflow: 'hidden'\n }}>\n <div style={{\n width: fillWidth,\n height: '100%',\n backgroundColor: 'white',\n transition: idx === activeSlideIndex ? 'width 0.1s linear' : 'none'\n }} />\n </div>\n );\n })}\n </div>\n )}\n\n {/* Header & Controls (Mobile) */}\n {!isDesktop && (\n <div style={{\n position: 'absolute',\n top: '20px',\n left: '10px',\n right: '10px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n zIndex: 10,\n padding: '5px'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <StoryThumbnail src={currentStory.thumbnail} alt={currentStory.name} style={{ width: '32px', height: '32px', borderRadius: '50%' }} />\n <span style={{ color: 'white', fontWeight: 'bold', fontSize: '14px', textShadow: '0 1px 3px rgba(0,0,0,0.8)' }}>\n {currentStory.name}\n </span>\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n <SoundButton\n config={{\n size: 32,\n color: { cross: '#ffffff', fill: 'rgba(255,255,255,0.08)', stroke: 'transparent' },\n margin: { top: 0, bottom: 0, left: 0, right: 0 },\n image: '' // Force common SVG icons\n }}\n onPress={toggleMute}\n type={isMuted ? 'mute' : 'unmute'}\n enabled={!!soundConfig?.enabled && !!slideVideo}\n style={{ position: 'relative', borderRadius: '10px' }}\n />\n\n <CrossButton\n config={{\n enabled: crossConfig?.enabled !== false,\n image: '', // Force common SVG icon\n color: { cross: '#ffffff', fill: 'rgba(255,255,255,0.08)', stroke: 'transparent' },\n margin: { top: 0, bottom: 0, left: 0, right: 0 },\n size: 32\n }}\n onPress={onClose}\n style={{ position: 'relative', borderRadius: '10px' }}\n />\n </div>\n </div>\n )}\n\n {/* Left / Right Nav Click Areas */}\n <div style={{ position: 'absolute', top: 0, bottom: 0, left: 0, width: '30%', zIndex: 5, cursor: 'pointer' }} onMouseDown={handleMouseDownNav} onMouseUp={() => handleMouseUpNav('prev')} onTouchStart={handleMouseDownNav} onTouchEnd={() => handleMouseUpNav('prev')} />\n <div style={{ position: 'absolute', top: 0, bottom: 0, right: 0, width: '70%', zIndex: 4, cursor: 'pointer' }} onMouseDown={handleMouseDownNav} onMouseUp={() => handleMouseUpNav('next')} onTouchStart={handleMouseDownNav} onTouchEnd={() => handleMouseUpNav('next')} />\n\n {(() => {\n const bgColor = parseBackground(currentSlideStyling?.background) || '#000000';\n\n const containerStyles: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background: slideIsStudio ? bgColor : '#000',\n position: 'relative',\n width: '100%',\n maxHeight: isDesktop ? 'none' : '100%',\n aspectRatio: '1080 / 1920',\n overflow: 'hidden',\n borderRadius: isDesktop ? '16px' : '0',\n boxShadow: isDesktop ? '0 12px 36px rgba(0,0,0,0.4)' : 'none',\n };\n\n return (\n <div style={containerStyles}>\n {slideVideo ? (\n <video ref={activeVideoRef} src={slideVideo} autoPlay playsInline muted={isMuted} onLoadedData={handleVideoLoad} style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n (slideBgImage || (!slideIsStudio && currentStory?.thumbnail)) && (\n <StoryThumbnail\n src={slideBgImage || currentStory?.thumbnail}\n alt=\"Story content\"\n style={{ width: '100%', height: '100%', objectFit: slideIsStudio ? 'contain' : 'cover' }}\n />\n )\n )}\n <InteractiveOverlay\n content={{\n ...currentSlide.content,\n // Studio payloads often keep interactive styling (including `shopable`) at slide-level styling.\n styling: {\n ...(currentSlide.content as any)?.styling,\n ...(currentSlide as any)?.styling,\n },\n interactions: currentSlide.interactions,\n }}\n elapsedTime={(progress / 100) * (currentStory.styling?.slideShowTime || 5)}\n onInteraction={async (interactionData: any) => {\n setIsPaused(true); // Instant pause on interaction\n const { type, questionId, pollId, quizId, optionId, value, stickerId } = interactionData;\n\n // Determine interaction type and ID\n let interaction_type = type?.split('_')[0] || 'interaction';\n if (interaction_type === 'quizz') interaction_type = 'quiz';\n if (type?.startsWith('image_quiz')) interaction_type = 'quiz';\n\n const interaction_id = stickerId || questionId || pollId || quizId || currentSlide.id;\n const selected = optionId || interactionData.selected_option || '';\n\n // Get data from store instantly\n const state = useAppStorysStore.getState();\n const userId = state.userId || 'anonymous';\n const trackingUrl = state.trackingUrl || 'https://tracking.appstorys.co';\n const accessToken = await getAccessToken();\n\n // Construct exact payload as per user request\n const payload = {\n user_id: userId,\n campaign_id: dataId,\n event: 'interaction',\n metadata: {\n interaction_type,\n interaction_id,\n slide_id: currentSlide.id,\n selected_option: String(selected),\n value: String(value || '')\n }\n };\n\n // Instant call - non-blocking\n fetch(`${trackingUrl}/capture-event`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {})\n },\n body: JSON.stringify(payload)\n }).catch(err => console.error('AppStorys: Instant Tracking Failed', err));\n\n // Also call trackEvent in background for reliability/state syncing if needed\n // but we focus on the instant fetch above\n }}\n />\n </div>\n );\n })()}\n\n {/* CTA Footer Section */}\n {(slideCtaText || slideCtaLink) && (\n <Cta\n cta={currentSlide?.styling?.cta}\n buttonText={slideCtaText || 'Learn More'}\n onPress={(e) => { if (e && e.stopPropagation) e.stopPropagation(); handleClickCTA(currentSlide); }}\n />\n )}\n </div>\n\n {isDesktop && (\n <div style={{ display: 'flex', justifyContent: 'flex-start', alignItems: 'center', gap: '12px', width: '100%', boxSizing: 'border-box' }}>\n {/* Next Slide Arrow Navigator */}\n {activeSlideIndex < currentStory.slides.length - 1 && (\n <button onClick={handleNextSlide} style={{ background: 'rgba(255,255,255,0.15)', border: '1px solid rgba(255,255,255,0.2)', color: 'white', borderRadius: '50%', width: '40px', height: '40px', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', fontSize: '18px', backdropFilter: 'blur(5px)', transition: 'background 0.2s' }} onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.25)'} onMouseLeave={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.15)'}>\n ›\n </button>\n )}\n\n {/* Next Previews: Only show inner next slide within current active story stack */}\n {(() => {\n const hasNextSlide = activeSlideIndex < currentStory.slides.length - 1;\n const nextMedia = hasNextSlide ? currentStory.slides[activeSlideIndex + 1] : null;\n\n if (!nextMedia) return null;\n\n const nextStyling = nextMedia.styling as any;\n const nextEditorSource = nextStyling?.editorSource || nextStyling?.meta?.editorSource;\n const nextIsStudio = nextEditorSource === 'studio' || nextEditorSource === 'editor';\n const nextBgImage = nextIsStudio ? nextStyling?.background?.media?.mediaUrl : nextMedia.image;\n\n return (\n <div style={sideCardStyle} onClick={handleNextSlide}>\n <StoryThumbnail src={nextBgImage || currentStory.thumbnail} />\n <div style={{ position: 'absolute', top: 0, bottom: 0, left: 0, right: 0, background: 'rgba(0,0,0,0.2)', backdropFilter: 'blur(1px)' }} />\n </div>\n );\n })()}\n </div>\n )}\n\n {/* Bottom Sidebar Previous Stories Preview cards Float structure */}\n {isDesktop && activeStoryIndex > 0 && (\n <div style={{ position: 'absolute', bottom: '40px', left: '40px', display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '5px', zIndex: 20 }}>\n <span style={{ fontSize: '11px', fontWeight: 'bold', color: 'rgba(255,255,255,0.75)', letterSpacing: '0.4px', paddingLeft: '2px' }}>Previous Stories</span>\n <div style={{\n background: 'rgba(255, 255, 255, 0.06)',\n padding: '8px 14px',\n borderRadius: '14px',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n backdropFilter: 'blur(16px)',\n cursor: 'pointer',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.25)',\n transition: 'all 0.2s',\n maxWidth: '280px'\n }} onClick={onPrevStory}>\n <span style={{ color: 'white', fontSize: '15px', fontWeight: 'normal' }}>←</span>\n <div style={{ width: '40px', height: '40px', borderRadius: '50%', border: '2px solid white', display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'white', flexShrink: 0 }}>\n <StoryThumbnail src={stories[activeStoryIndex - 1].thumbnail} style={{ width: '36px', height: '36px', borderRadius: '50%' }} />\n </div>\n <span style={{ fontSize: '14px', color: 'white', fontWeight: '500', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', minWidth: 0 }}>{stories[activeStoryIndex - 1].name}</span>\n </div>\n </div>\n )}\n\n {/* Bottom Sidebar Next Stories Preview cards Float structure */}\n {isDesktop && activeStoryIndex < stories.length - 1 && (\n <div style={{ position: 'absolute', bottom: '40px', right: '40px', display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '5px', zIndex: 20 }}>\n <span style={{ fontSize: '11px', fontWeight: 'bold', color: 'rgba(255,255,255,0.75)', letterSpacing: '0.4px', paddingLeft: '2px' }}>Next Stories</span>\n <div style={{\n background: 'rgba(255, 255, 255, 0.06)',\n padding: '8px 14px',\n borderRadius: '14px',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n backdropFilter: 'blur(16px)',\n cursor: 'pointer',\n boxShadow: '0 8px 16px rgba(0, 0, 0, 0.25)',\n transition: 'all 0.2s',\n maxWidth: '280px'\n }} onClick={onNextStory}>\n <div style={{ width: '40px', height: '40px', borderRadius: '50%', border: '2px solid white', display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'white', flexShrink: 0 }}>\n <StoryThumbnail src={stories[activeStoryIndex + 1].thumbnail} style={{ width: '36px', height: '36px', borderRadius: '50%' }} />\n </div>\n <span style={{ fontSize: '14px', color: 'white', fontWeight: '500', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', minWidth: 0 }}>{stories[activeStoryIndex + 1].name}</span>\n <span style={{ color: 'white', fontSize: '15px', fontWeight: 'normal' }}>→</span>\n </div>\n </div>\n )}\n\n {/* Rich Toast Notification */}\n {showToast && (\n <div style={{\n position: 'absolute',\n bottom: '40px',\n left: '50%',\n transform: 'translateX(-50%)',\n background: 'rgba(20, 20, 20, 0.96)',\n border: '1px solid rgba(255,255,255,0.08)',\n padding: '12px 24px',\n borderRadius: '12px',\n color: 'white',\n fontSize: '13px',\n fontWeight: '500',\n boxShadow: '0 10px 20px rgba(0,0,0,0.5)',\n backdropFilter: 'blur(10px)',\n zIndex: 1000\n }}>\n {showToast}\n </div>\n )}\n\n </div>\n </div>\n );\n};","import React from 'react';\nimport { PollStickerData, StickerProps } from './types';\n\nexport const PollSticker: React.FC<StickerProps<PollStickerData>> = ({\n data,\n onInteraction,\n isEditing = false,\n}) => {\n const isHorizontal = data.layout?.type === 'horizontal';\n const defaults = {\n headerTextColor: '#000000',\n optionBgColor: '#1A1A1A',\n optionTextColor: '#FFFFFF',\n backgroundColor: '#FFFFFF',\n borderRadius: 24,\n padding: 20,\n };\n\n const styling = data.styling || {};\n const containerStyle: React.CSSProperties = {\n backgroundColor: styling.backgroundColor || defaults.backgroundColor,\n borderRadius: `${styling.borderRadius ?? defaults.borderRadius}px`,\n overflow: 'hidden',\n boxShadow: styling.shadow || '0 12px 24px rgba(0,0,0,0.1)',\n boxSizing: 'border-box',\n width: '100%',\n opacity: styling.opacity ?? 1,\n padding: `${styling.padding ?? defaults.padding}px`,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '16px',\n };\n\n const questionStyle: React.CSSProperties = {\n color: styling.headerTextColor || defaults.headerTextColor,\n textAlign: 'center',\n fontWeight: '800',\n fontSize: `${styling.fontSize ? styling.fontSize + 4 : 20}px`,\n lineHeight: '1.2',\n margin: '0',\n width: '100%',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n };\n\n const optionsContainerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: isHorizontal ? 'row' : 'column',\n gap: '4px',\n width: '100%',\n backgroundColor: '#1A1A1A',\n borderRadius: '12px',\n overflow: 'hidden',\n padding: '2px',\n };\n\n const optionStyle: React.CSSProperties = {\n backgroundColor: styling.optionBgColor || 'transparent',\n color: styling.optionTextColor || defaults.optionTextColor,\n padding: isHorizontal ? '14px 10px' : '16px 20px',\n fontSize: `${styling.fontSize ? styling.fontSize + 1 : 16}px`,\n fontWeight: '700',\n cursor: 'pointer',\n border: 'none',\n width: '100%',\n textAlign: 'center',\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background 0.2s',\n flex: 1,\n borderRight: isHorizontal ? '1px solid rgba(255,255,255,0.1)' : 'none',\n borderBottom: !isHorizontal ? '1px solid rgba(255,255,255,0.1)' : 'none',\n };\n\n const handleOptionClick = (optionId: string) => {\n if (isEditing) return;\n onInteraction?.({\n type: 'poll',\n pollId: data.id,\n optionId: optionId,\n stickerId: data.id\n });\n };\n\n const options = Array.isArray(data.options) ? data.options : [];\n\n return (\n <div style={containerStyle}>\n <h3 style={questionStyle}>{data.question || 'Ask A Question...'}</h3>\n <div style={optionsContainerStyle}>\n {options.map((option, index) => (\n <button\n key={option.id}\n style={{\n ...optionStyle,\n borderRight: isHorizontal && index === options.length - 1 ? 'none' : optionStyle.borderRight,\n borderBottom: !isHorizontal && index === options.length - 1 ? 'none' : optionStyle.borderBottom\n }}\n onClick={() => handleOptionClick(option.id)}\n onMouseOver={(e) => {\n if (!isEditing) e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.1)';\n }}\n onMouseOut={(e) => {\n if (!isEditing) e.currentTarget.style.backgroundColor = styling.optionBgColor || 'transparent';\n }}\n >\n {option.text}\n {option.percentage !== undefined && (\n <span style={{ fontSize: '11px', opacity: 0.6, marginLeft: '8px' }}>{option.percentage}%</span>\n )}\n </button>\n ))}\n </div>\n </div>\n );\n};","import React, { useState } from 'react';\nimport { QuizStickerData, StickerProps } from './types';\n\nexport const QuizSticker: React.FC<StickerProps<QuizStickerData>> = ({\n data,\n onInteraction,\n isEditing = false,\n}) => {\n const [selectedOptionId, setSelectedOptionId] = useState<string | null>(null);\n\n const defaults = {\n backgroundColor: '#FFFFFF',\n borderRadius: 20,\n padding: 16,\n questionTextColor: '#FFFFFF', // Changed from #111111 to white for black header\n questionBgColor: '#000000',\n optionBgColor: '#FFFFFF',\n optionTextColor: '#2B2B2B',\n borderColor: '#E5E7EB',\n activeColor: '#10b981', // Success Green\n incorrectColor: '#ef4444', // Error Red\n labelBgColor: '#FFFFFF',\n labelTextColor: '#111111',\n labelBorderColor: '#111111',\n };\n\n const styling = (data as any).styling || {};\n const cardPadding = styling.padding ?? defaults.padding;\n const questionFontSize = styling.fontSize ? styling.fontSize + 6 : 22; // Larger default\n const optionFontSize = styling.optionFontSize || 17; // Larger default\n const optionRadius = styling.optionBorderRadius || 14;\n const borderColor = styling.borderColor || defaults.borderColor;\n const labelSize = Math.min(Math.max(Math.round(optionFontSize * 2.1), 18), 32);\n const containerStyle: React.CSSProperties = {\n backgroundColor: styling.backgroundColor || defaults.backgroundColor,\n borderRadius: `${styling.borderRadius ?? defaults.borderRadius}px`,\n padding: `${cardPadding}px`,\n paddingTop: 0, // Header will handle its own top padding\n boxShadow: styling.shadow || '0 10px 30px rgba(0,0,0,0.12)',\n boxSizing: 'border-box',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden', // Ensure header doesn't bleed\n opacity: styling.opacity ?? 1,\n };\n\n const questionStyle: React.CSSProperties = {\n color: styling.questionTextColor || defaults.questionTextColor,\n backgroundColor: styling.questionBgColor || defaults.questionBgColor,\n fontWeight: '900',\n fontSize: `${questionFontSize}px`,\n lineHeight: 1.25,\n margin: `0 -${cardPadding}px 16px -${cardPadding}px`, // Flush edges\n textAlign: 'center',\n padding: `24px ${cardPadding}px`,\n borderTopLeftRadius: `${styling.borderRadius ?? defaults.borderRadius}px`,\n borderTopRightRadius: `${styling.borderRadius ?? defaults.borderRadius}px`,\n letterSpacing: '-0.01em',\n };\n\n const optionStyle: React.CSSProperties = {\n backgroundColor: styling.optionBgColor || defaults.optionBgColor,\n color: styling.optionTextColor || defaults.optionTextColor,\n padding: `${styling.optionPadding || Math.max(cardPadding * 0.7, 10)}px ${Math.max(cardPadding * 0.8, 12)}px`,\n borderRadius: `${optionRadius}px`,\n border: `1px solid ${borderColor}`,\n display: 'flex',\n alignItems: 'center',\n gap: `${Math.max(Math.round(labelSize * 0.45), 8)}px`,\n cursor: selectedOptionId ? 'default' : 'pointer',\n width: '100%',\n textAlign: 'left',\n boxSizing: 'border-box',\n transition: 'all 0.2s ease',\n boxShadow: '0 1px 2px rgba(15,23,42,0.03)',\n };\n\n const labelStyle: React.CSSProperties = {\n width: `${labelSize}px`,\n height: `${labelSize}px`,\n minWidth: `${labelSize}px`,\n borderRadius: '50%',\n backgroundColor: styling.labelBgColor || defaults.labelBgColor,\n color: styling.labelTextColor || defaults.labelTextColor,\n border: `${Math.max(Math.round(labelSize * 0.08), 1)}px solid ${styling.labelBorderColor || defaults.labelBorderColor}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: '700',\n fontSize: `${Math.max(Math.round(labelSize * 0.46), 10)}px`,\n };\n\n const bodyStyle: React.CSSProperties = {\n backgroundColor: styling.backgroundColor || defaults.backgroundColor,\n borderRadius: `0 0 ${styling.borderRadius ?? defaults.borderRadius}px ${styling.borderRadius ?? defaults.borderRadius}px`,\n display: 'flex',\n flexDirection: 'column',\n gap: `${Math.max(cardPadding * 0.55, 8)}px`,\n };\n\n const handleOptionClick = (optionId: string) => {\n if (isEditing || selectedOptionId) return; // ignore multiple clicks\n setSelectedOptionId(optionId);\n onInteraction?.({\n type: 'quiz',\n quizId: data.id,\n optionId: optionId,\n stickerId: data.id\n });\n };\n\n const alphabet = ['A', 'B', 'C', 'D', 'E', 'F'];\n const options = Array.isArray(data.options) ? data.options : [];\n\n if (options.length === 0 && !isEditing) {\n console.warn('AppStorys: QuizSticker has no options!', data.id);\n }\n\n return (\n <div style={{ ...containerStyle, background: styling.backgroundColor || defaults.backgroundColor }}>\n {data.question && <h3 style={questionStyle}>{data.question}</h3>}\n <div style={{ ...bodyStyle, background: 'transparent' }}>\n {options.map((option, index) => {\n const label = (option as any).label || alphabet[index] || '•';\n const isSelected = option.id === selectedOptionId;\n const isCorrect = (option as any).isCorrect === true;\n\n let currentOptionStyle = { ...optionStyle };\n let currentLabelStyle = { ...labelStyle };\n\n if (selectedOptionId) {\n if (isCorrect) {\n currentOptionStyle.backgroundColor = styling.activeColor || defaults.activeColor;\n currentOptionStyle.borderColor = styling.activeColor || defaults.activeColor;\n currentOptionStyle.color = '#FFFFFF';\n } else if (isSelected) {\n currentOptionStyle.backgroundColor = styling.incorrectColor || defaults.incorrectColor;\n currentOptionStyle.borderColor = styling.incorrectColor || defaults.incorrectColor;\n currentOptionStyle.color = '#FFFFFF';\n }\n }\n\n return (\n <button\n key={option.id}\n style={currentOptionStyle}\n onClick={() => handleOptionClick(option.id)}\n disabled={!!selectedOptionId}\n >\n <div style={labelStyle} className=\"letter-circle\">{label}</div>\n <span style={{ fontWeight: '600', fontSize: `${optionFontSize}px` }}>{option.text}</span>\n </button>\n );\n })}\n </div>\n </div>\n );\n};","import React, { useState, useEffect } from 'react';\nimport { CountdownStickerData, StickerProps } from './types';\n\nexport const CountdownSticker: React.FC<StickerProps<CountdownStickerData>> = ({\n data,\n}) => {\n const [timeLeft, setTimeLeft] = useState({ days: '00', hours: '00', minutes: '00', seconds: '00' });\n\n useEffect(() => {\n if (!data.targetDate) return;\n\n const calculateTime = () => {\n const difference = +new Date(data.targetDate) - +new Date();\n if (difference > 0) {\n const days = Math.floor(difference / (1000 * 60 * 60 * 24));\n const hours = Math.floor((difference / (1000 * 60 * 60)) % 24);\n const minutes = Math.floor((difference / 1000 / 60) % 60);\n const seconds = Math.floor((difference / 1000) % 60);\n\n setTimeLeft({\n days: days.toString().padStart(2, '0'),\n hours: hours.toString().padStart(2, '0'),\n minutes: minutes.toString().padStart(2, '0'),\n seconds: seconds.toString().padStart(2, '0')\n });\n } else {\n setTimeLeft({ days: '00', hours: '00', minutes: '00', seconds: '00' });\n }\n };\n\n const timer = setInterval(calculateTime, 1000);\n calculateTime(); \n return () => clearInterval(timer);\n }, [data.targetDate]);\n\n const styling = data.styling || {};\n const display = data.display || { showDays: true, showHours: true, showMinutes: true, showSeconds: true };\n\n const digitSize = Number(styling.digitSize || 18);\n const safeDigitSize = !isNaN(digitSize) && digitSize > 0 ? digitSize : 18;\n const labelFontSize =\n typeof (styling as any).labelFontSize !== 'undefined'\n ? Number((styling as any).labelFontSize)\n : Math.max(10, Math.round(safeDigitSize * 0.55));\n const boxHeight = Math.max(30, Math.round(safeDigitSize * 1.8));\n const boxMinWidth = Math.max(24, Math.round(safeDigitSize * 1.3));\n const boxRadius = Math.max(6, Math.round(safeDigitSize * 0.35));\n const gridGap = Math.max(6, Math.round(safeDigitSize * 0.25));\n\n const containerStyle: React.CSSProperties = {\n backgroundColor: styling.backgroundColor || '#FFFFFF',\n borderRadius: `${styling.borderRadius !== undefined ? styling.borderRadius : 16}px`,\n padding: `${styling.padding !== undefined ? styling.padding : 16}px`,\n boxShadow: styling.shadow || '0 10px 30px rgba(0,0,0,0.08)',\n width: '100%',\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '8px',\n border: styling.borderColor ? `1px solid ${styling.borderColor}` : 'none',\n overflow: 'hidden',\n opacity: styling.opacity ?? 1,\n };\n\n const titleStyle: React.CSSProperties = {\n color: styling.titleColor || '#000000',\n fontWeight: '700',\n fontSize: `${styling.fontSize ? styling.fontSize : 14}px`,\n width: '100%',\n textAlign: 'center',\n marginBottom: '4px'\n };\n\n const timerGridStyle: React.CSSProperties = {\n display: 'flex',\n gap: `${gridGap}px`,\n width: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n flexWrap: 'nowrap'\n };\n\n const segmentStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '2px'\n };\n\n const digitGroupStyle: React.CSSProperties = {\n display: 'flex',\n gap: '2px'\n };\n\n const boxStyle: React.CSSProperties = {\n backgroundColor: styling.digitBackground || '#F1F3F5',\n borderRadius: `${boxRadius}px`,\n minWidth: `${boxMinWidth}px`,\n height: `${boxHeight}px`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: `${safeDigitSize}px`,\n fontWeight: 'bold',\n color: styling.digitColor || '#1A202C',\n padding: '0 4px',\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: `${Math.max(9, labelFontSize)}px`,\n color: styling.labelColor || '#A0AEC0',\n fontWeight: '600',\n textTransform: 'lowercase'\n };\n\n const separatorStyle: React.CSSProperties = {\n fontSize: `${Math.max(14, Math.round(safeDigitSize * 0.9))}px`,\n fontWeight: '700',\n color: styling.labelColor || '#A0AEC0',\n display: 'flex',\n alignItems: 'center',\n lineHeight: 1,\n };\n\n const renderDigitGroup = (value: string, label: string) => (\n <div style={segmentStyle}>\n <div style={digitGroupStyle}>\n {value.split('').map((digit, i) => (\n <div key={i} style={boxStyle}>{digit}</div>\n ))}\n </div>\n <span style={labelStyle}>{label}</span>\n </div>\n );\n\n // Build items based on display configuration\n const items: React.ReactNode[] = [];\n let shownCount = 0;\n\n if (display.showDays !== false) {\n items.push(renderDigitGroup(timeLeft.days, 'days'));\n shownCount++;\n }\n \n if (display.showHours !== false) {\n if (shownCount > 0) items.push(<div key=\"sep-h\" style={separatorStyle}>:</div>);\n items.push(renderDigitGroup(timeLeft.hours, 'hours'));\n shownCount++;\n }\n \n if (display.showMinutes !== false) {\n if (shownCount > 0) items.push(<div key=\"sep-m\" style={separatorStyle}>:</div>);\n items.push(renderDigitGroup(timeLeft.minutes, 'min'));\n shownCount++;\n }\n \n if (display.showSeconds !== false) {\n if (shownCount > 0) items.push(<div key=\"sep-s\" style={separatorStyle}>:</div>);\n items.push(renderDigitGroup(timeLeft.seconds, 'sec'));\n shownCount++;\n }\n\n return (\n <div style={containerStyle}>\n {data.title && <div style={titleStyle}>{data.title}</div>}\n <div style={timerGridStyle}>\n {items}\n </div>\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { PromoCodeStickerData, StickerProps } from './types';\n\nexport const PromoCodeSticker: React.FC<StickerProps<PromoCodeStickerData>> = ({\n data,\n onInteraction,\n}) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = () => {\n if (data.code) {\n navigator.clipboard.writeText(data.code).catch(() => { });\n setCopied(true);\n\n // Trigger interaction event via capture-event\n onInteraction?.({\n type: 'promo_code',\n value: 'copied',\n stickerId: data.id,\n code: data.code\n });\n\n setTimeout(() => setCopied(false), 2000);\n }\n };\n\n const styling = data.styling || {};\n\n // Ticket-like pill style with side notches\n const ticketPillStyle: React.CSSProperties = {\n backgroundColor: styling.backgroundColor || '#FFFFFF',\n padding: '12px 18px',\n borderRadius: '12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n height: '60px',\n boxSizing: 'border-box',\n position: 'relative',\n filter: 'drop-shadow(0 8px 16px rgba(0,0,0,0.1))',\n cursor: 'pointer',\n // Using a clip-path or mask-image for professional notches\n clipPath: 'polygon(0% 0%, 0% 40%, 4% 50%, 0% 60%, 0% 100%, 100% 100%, 100% 60%, 96% 50%, 100% 40%, 100% 0%)',\n // Fallback for notch look using radial gradients\n backgroundImage: `\n radial-gradient(circle at 0px 30px, transparent 8px, white 8.5px),\n radial-gradient(circle at 100% 30px, transparent 8px, white 8.5px)\n `,\n backgroundPosition: '0 0, 100% 0',\n backgroundSize: '100% 100%',\n backgroundRepeat: 'no-repeat',\n };\n\n const percentageBoxStyle: React.CSSProperties = {\n width: '36px',\n height: '36px',\n borderRadius: '8px',\n backgroundColor: '#F1F3F5',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '18px',\n fontWeight: '800',\n color: '#2D3748',\n border: '1px solid #E2E8F0'\n };\n\n const codeStyle: React.CSSProperties = {\n fontSize: `${styling.fontSize || 18}px`,\n fontWeight: '800',\n color: '#1A202C',\n letterSpacing: '1px',\n flex: 1,\n textAlign: 'center'\n };\n\n return (\n <div style={ticketPillStyle} onClick={handleCopy}>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flex: 1 }}>\n <div style={percentageBoxStyle}>%</div>\n <span style={codeStyle}>{data.code || 'OFFER20'}</span>\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {copied && <span style={{ fontSize: '11px', color: '#10B981', fontWeight: '700' }}>Copied!</span>}\n <div style={{ padding: '8px', display: 'flex', alignItems: 'center' }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#4A5568\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n </div>\n </div>\n\n </div>\n );\n};\n","import React from 'react';\nimport { ReactionStickerData, StickerProps } from './types';\n\nexport const ReactionSticker: React.FC<StickerProps<ReactionStickerData>> = ({\n data,\n onInteraction,\n isEditing = false,\n}) => {\n const defaults = {\n emojis: ['😍', '👍'],\n };\n\n const emojis = Array.isArray(data.emojis) ? data.emojis : (Array.isArray(defaults.emojis) ? defaults.emojis : []);\n\n const handleReaction = (emoji: string) => {\n if (isEditing) return;\n onInteraction?.({\n type: 'reaction',\n reactionId: data.id,\n emoji: emoji,\n stickerId: data.id\n });\n };\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n gap: '20px',\n justifyContent: 'center',\n alignItems: 'center',\n width: '100%',\n padding: '12px',\n };\n\n const bubbleStyle: React.CSSProperties = {\n backgroundColor: '#FFFFFF',\n width: '64px',\n height: '64px',\n borderRadius: '100px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 8px 30px rgba(0,0,0,0.12)',\n fontSize: '32px',\n cursor: isEditing ? 'default' : 'pointer',\n transition: 'all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)',\n border: 'none',\n outline: 'none',\n padding: 0,\n position: 'relative',\n zIndex: 1,\n };\n\n return (\n <div style={containerStyle}>\n {emojis.map((emoji, idx) => (\n <button\n key={idx}\n style={bubbleStyle}\n onClick={() => handleReaction(emoji)}\n onMouseOver={(e) => {\n if (!isEditing) e.currentTarget.style.transform = 'scale(1.15) translateY(-4px)';\n }}\n onMouseOut={(e) => {\n if (!isEditing) e.currentTarget.style.transform = 'scale(1) translateY(0)';\n }}\n >\n {emoji}\n </button>\n ))}\n </div>\n );\n};","import React, { useState, useRef, useEffect } from 'react';\nimport { RatingStickerData, StickerProps } from './types';\n\nexport const RatingSticker: React.FC<StickerProps<RatingStickerData>> = ({\n data,\n onInteraction,\n isEditing = false,\n}) => {\n const maxRating = data.maxRating || 5;\n const currentRating = data.currentRating ?? Math.floor(maxRating / 2);\n const [val, setVal] = useState(currentRating);\n const sliderTrackRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const defaults = {\n backgroundColor: '#FFFFFF',\n borderRadius: 36,\n padding: 24,\n titleColor: '#000000',\n titleFontSize: 24,\n sliderTrackColor: '#F3F4F6',\n sliderFillColor: '#F97316',\n emojiSize: 42,\n };\n\n const styling = data.styling || {};\n const containerStyle: React.CSSProperties = {\n backgroundColor: styling.backgroundColor || defaults.backgroundColor,\n borderRadius: `${styling.borderRadius ?? defaults.borderRadius}px`,\n padding: `${styling.padding ?? defaults.padding}px`,\n boxShadow: styling.shadow || '0 12px 30px rgba(0,0,0,0.08)',\n boxSizing: 'border-box',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '20px',\n cursor: 'default',\n opacity: styling.opacity ?? 1,\n };\n\n const titleStyle: React.CSSProperties = {\n color: styling.titleColor || defaults.titleColor,\n fontWeight: '900',\n fontSize: `${styling.titleFontSize || defaults.titleFontSize}px`,\n margin: '0',\n textAlign: 'center',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n width: '100%',\n };\n\n const trackStyle: React.CSSProperties = {\n width: '100%',\n height: '18px',\n backgroundColor: styling.sliderTrackColor || defaults.sliderTrackColor,\n borderRadius: '100px',\n position: 'relative',\n cursor: isEditing ? 'default' : 'pointer',\n marginTop: '24px',\n marginBottom: '8px',\n userSelect: 'none',\n };\n\n const percentage = (val / maxRating) * 100;\n\n const fillStyle: React.CSSProperties = {\n width: `${percentage}%`,\n height: '100%',\n background: styling.sliderFillColor || 'linear-gradient(90deg, #FF4582, #e11d48)',\n borderRadius: '100px',\n transition: isDragging ? 'none' : 'width 0.1s ease',\n };\n\n const emojiSize = styling.emojiSize || defaults.emojiSize;\n const thumbStyle: React.CSSProperties = {\n position: 'absolute',\n left: `calc(${percentage}% - ${emojiSize / 2}px)`,\n top: `-${emojiSize / 4}px`,\n fontSize: `${emojiSize}px`,\n userSelect: 'none',\n cursor: 'grab',\n transition: isDragging ? 'none' : 'left 0.1s ease',\n filter: 'drop-shadow(0 4px 8px rgba(0,0,0,0.2))',\n };\n\n const handleDrag = (clientX: number) => {\n if (!sliderTrackRef.current || isEditing) return;\n const rect = sliderTrackRef.current.getBoundingClientRect();\n let offsetX = clientX - rect.left;\n if (offsetX < 0) offsetX = 0;\n if (offsetX > rect.width) offsetX = rect.width;\n\n const ratio = offsetX / rect.width;\n const computedVal = Math.round(ratio * maxRating * 10) / 10; // high precision, or snap: Math.round(ratio * maxRating)\n setVal(computedVal);\n };\n\n const onMouseDown = (e: React.MouseEvent) => {\n if (isEditing) return;\n setIsDragging(true);\n handleDrag(e.clientX);\n };\n\n const onTouchStart = (e: React.TouchEvent) => {\n if (isEditing) return;\n setIsDragging(true);\n handleDrag(e.touches[0].clientX);\n };\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (isDragging) handleDrag(e.clientX);\n };\n\n const onMouseUp = () => {\n if (isDragging) {\n setIsDragging(false);\n onInteraction?.({\n type: 'rating',\n ratingId: data.id,\n value: val,\n stickerId: data.id\n });\n }\n };\n\n const onTouchMove = (e: TouchEvent) => {\n if (isDragging) handleDrag(e.touches[0].clientX);\n };\n\n if (isDragging) {\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n window.addEventListener('touchmove', onTouchMove);\n window.addEventListener('touchend', onMouseUp);\n }\n\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n window.removeEventListener('touchmove', onTouchMove);\n window.removeEventListener('touchend', onMouseUp);\n };\n }, [isDragging, val]);\n\n return (\n <div style={containerStyle}>\n <h3 style={titleStyle}>{data.title || 'Do you like my space?'}</h3>\n <div\n ref={sliderTrackRef}\n style={trackStyle}\n onMouseDown={onMouseDown}\n onTouchStart={onTouchStart}\n >\n <div style={fillStyle} />\n <div style={thumbStyle} className=\"interactive-emoji-thumb\">\n {data.emoji || '😍'}\n </div>\n </div>\n </div>\n );\n};","import React, { useState } from 'react';\nimport { QuestionStickerData, StickerProps } from './types';\n\nexport const QuestionSticker: React.FC<StickerProps<QuestionStickerData>> = ({\n data,\n onInteraction,\n isEditing = false,\n}) => {\n const [value, setValue] = useState('');\n\n const defaults = {\n backgroundColor: '#FFFFFF',\n borderRadius: 16,\n padding: 16,\n promptColor: '#111111',\n inputBgColor: '#FFFFFF',\n borderColor: '#EFEFEF',\n textColor: '#333333',\n placeholderColor: '#A0AEC0',\n };\n\n const styling = data.styling || {};\n const containerStyle: React.CSSProperties = {\n backgroundColor: styling.backgroundColor || defaults.backgroundColor,\n borderRadius: `${styling.borderRadius ?? defaults.borderRadius}px`,\n padding: `${styling.padding ?? defaults.padding}px`,\n boxShadow: styling.shadow || '0 8px 24px rgba(0,0,0,0.06)',\n boxSizing: 'border-box',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '12px',\n border: `1px solid ${styling.borderColor || '#F0F0F0'}`,\n };\n\n const questionStyle: React.CSSProperties = {\n color: styling.promptColor || defaults.promptColor,\n fontWeight: '700',\n fontSize: `${styling.fontSize ? styling.fontSize + 2 : 16}px`,\n textAlign: 'center',\n marginBottom: '2px',\n width: '100%',\n };\n\n const inputContainerStyle: React.CSSProperties = {\n width: '100%',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n };\n\n const inputStyle: React.CSSProperties = {\n backgroundColor: styling.inputBgColor || '#F1F3F5',\n border: 'none',\n borderRadius: '30px',\n padding: '14px 45px 14px 20px',\n width: '100%',\n boxSizing: 'border-box',\n color: styling.inputTextColor || '#1A202C',\n fontSize: `${styling.fontSize || 14}px`,\n outline: 'none',\n textAlign: 'left',\n cursor: isEditing ? 'default' : 'text',\n boxShadow: 'inset 0 1px 2px rgba(0,0,0,0.05)',\n };\n\n const sendButtonStyle: React.CSSProperties = {\n position: 'absolute',\n right: '10px',\n background: styling.submitBackground || '#FE6B35',\n color: 'white',\n border: 'none',\n borderRadius: '50%',\n width: '32px',\n height: '32px',\n display: value.length > 0 ? 'flex' : 'none',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n transition: 'transform 0.2s',\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (isEditing) return;\n setValue(e.target.value);\n };\n\n const handleSend = () => {\n if (isEditing || !value.trim()) return;\n onInteraction?.({\n type: 'question',\n questionId: data.id,\n value: value.trim(),\n stickerId: data.id\n });\n setValue(''); // Clear after send\n };\n\n return (\n <div style={containerStyle}>\n <div style={questionStyle}>{data.question || 'Ask me anything'}</div>\n <div style={inputContainerStyle}>\n <input\n type=\"text\"\n value={value}\n placeholder={data.placeholder || 'Type your answer...'}\n style={inputStyle}\n disabled={isEditing}\n onChange={handleChange}\n onKeyDown={(e) => e.key === 'Enter' && handleSend()}\n />\n <button style={sendButtonStyle} onClick={handleSend}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n </button>\n </div>\n </div>\n );\n};","import React, { useState } from 'react';\nimport { ImageQuizStickerData, StickerProps } from './types';\n\nexport const ImageQuizSticker: React.FC<StickerProps<ImageQuizStickerData>> = ({\n data,\n onInteraction,\n isEditing = false,\n}) => {\n const [selectedOptionId, setSelectedOptionId] = useState<string | null>(null);\n\n const defaults = {\n backgroundColor: '#FFFFFF',\n borderRadius: 20,\n padding: 16,\n questionTextColor: '#111111',\n optionBgColor: '#F7FAFC',\n optionTextColor: '#2D3748',\n borderColor: '#E2E8F0',\n activeColor: '#10B981', // Success Green\n incorrectColor: '#EF4444', // Error Red\n };\n\n const styling = (data as any).styling || {};\n const containerStyle: React.CSSProperties = {\n backgroundColor: styling.backgroundColor || defaults.backgroundColor,\n borderRadius: `${styling.borderRadius ?? defaults.borderRadius}px`,\n padding: `${styling.padding ?? defaults.padding}px`,\n boxShadow: styling.shadow || '0 8px 24px rgba(0,0,0,0.06)',\n boxSizing: 'border-box',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n border: styling.borderColor ? `1px solid ${styling.borderColor}` : 'none',\n };\n\n const questionStyle: React.CSSProperties = {\n color: styling.questionTextColor || defaults.questionTextColor,\n fontWeight: '800',\n fontSize: `${styling.fontSize ? styling.fontSize + 2 : 16}px`,\n margin: '0 0 4px 0',\n textAlign: 'left',\n };\n\n const gridStyle: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: '12px',\n width: '100%',\n };\n\n const optionStyle: React.CSSProperties = {\n backgroundColor: styling.optionBgColor || defaults.optionBgColor,\n color: styling.optionTextColor || defaults.optionTextColor,\n borderRadius: '16px',\n border: `2px solid ${styling.borderColor || defaults.borderColor}`,\n cursor: selectedOptionId ? 'default' : 'pointer',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '8px',\n boxSizing: 'border-box',\n transition: 'all 0.2s ease',\n overflow: 'hidden',\n };\n\n const handleOptionClick = (optionId: string) => {\n if (isEditing || selectedOptionId) return;\n setSelectedOptionId(optionId);\n onInteraction?.({\n type: 'image',\n quizId: data.id,\n optionId: optionId,\n stickerId: data.id\n });\n };\n\n const placeholderImg = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Crect width='100%25' height='100%25' fill='%23EDF2F7'/%3E%3Cpath d='M30 40 L40 30 L50 40 L60 30 L70 40 V60 H30 Z' fill='%23A0AEC0'/%3E%3Ccircle cx='40' cy='45' r='5' fill='%23FFFFFF'/%3E%3C/svg%3E\";\n\n const options = Array.isArray(data.options) ? data.options : [];\n\n return (\n <div style={containerStyle}>\n {data.question && <h3 style={questionStyle}>{data.question}</h3>}\n <div style={gridStyle}>\n {options.map((option) => {\n const isSelected = option.id === selectedOptionId;\n const isCorrect = (option as any).isCorrect === true;\n\n let currentOptionStyle = { ...optionStyle };\n if (selectedOptionId) {\n if (isCorrect) {\n currentOptionStyle.borderColor = styling.activeColor || defaults.activeColor;\n currentOptionStyle.backgroundColor = 'rgba(16, 185, 129, 0.05)';\n } else if (isSelected) {\n currentOptionStyle.borderColor = styling.incorrectColor || defaults.incorrectColor;\n currentOptionStyle.backgroundColor = 'rgba(239, 68, 68, 0.05)';\n }\n }\n\n return (\n <button\n key={option.id}\n style={currentOptionStyle}\n onClick={() => handleOptionClick(option.id)}\n disabled={!!selectedOptionId}\n onMouseOver={(e) => {\n if (!isEditing && !selectedOptionId) e.currentTarget.style.transform = 'translateY(-2px)';\n }}\n onMouseOut={(e) => {\n if (!isEditing && !selectedOptionId) e.currentTarget.style.transform = 'translateY(0)';\n }}\n >\n <div style={{\n width: '100%',\n aspectRatio: '1',\n borderRadius: '12px',\n overflow: 'hidden',\n backgroundColor: '#EDF2F7',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: '8px',\n position: 'relative'\n }}>\n <img\n src={option.image || placeholderImg}\n alt={option.text}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n\n {selectedOptionId && (\n <div style={{\n position: 'absolute',\n top: '6px',\n right: '6px',\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isCorrect ? defaults.activeColor : isSelected ? defaults.incorrectColor : '#A0AEC0',\n color: '#FFFFFF',\n fontSize: '12px',\n fontWeight: 'bold'\n }}>\n {isCorrect ? '✓' : isSelected ? '✕' : ''}\n </div>\n )}\n </div>\n <span style={{\n fontWeight: '600',\n fontSize: `${styling.optionFontSize || 13}px`,\n color: selectedOptionId && isCorrect ? defaults.activeColor : defaults.optionTextColor,\n width: '100%',\n textAlign: 'center',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}>{option.text}</span>\n </button>\n );\n })}\n </div>\n </div>\n );\n};","import React, { useState } from 'react';\nimport { ShopableStickerData, StickerProps, ShopableProduct } from './types';\nimport { ShopableModal } from './ShopableModal';\n\nexport const ShopableSticker: React.FC<StickerProps<ShopableStickerData>> = ({\n data,\n onInteraction,\n isEditing,\n}) => {\n const { products, styling } = data;\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [selectedProduct, setSelectedProduct] = useState<ShopableProduct | null>(null);\n\n const handleProductClick = (e: React.MouseEvent, product: ShopableProduct) => {\n e.stopPropagation();\n if (isEditing) return;\n\n if (data.shopableType === 'product') {\n setSelectedProduct(product);\n setIsModalOpen(true);\n if (onInteraction) {\n onInteraction({\n type: 'product_view',\n stickerId: data.id,\n productId: product.productId || product.id,\n value: product.title,\n });\n }\n return;\n }\n\n // Static Redirection Logic\n let url = product.redirectUrl || product.url;\n if (url && !url.startsWith('http') && !url.startsWith('//')) {\n url = 'https://' + url;\n }\n\n if (onInteraction) {\n onInteraction({\n type: 'buy',\n stickerId: data.id,\n productId: product.id,\n value: product.title,\n selected_option: url,\n });\n }\n\n if (url) {\n try {\n window.open(url, '_blank', 'noopener,noreferrer');\n } catch (error) {\n console.error('AppStorys: Redirect failed', error);\n window.location.href = url;\n }\n }\n };\n\n const handleAddToCart = (item: any) => {\n if (onInteraction) {\n onInteraction({\n type: 'add_to_cart',\n stickerId: data.id,\n productId: item.productId,\n value: item.title,\n selected_option: JSON.stringify({\n size: item.selectedSize,\n color: item.selectedColor,\n quantity: item.quantity\n }),\n });\n }\n };\n\n const containerStyle: React.CSSProperties = {\n width: '100%',\n height: '100%',\n display: 'flex',\n gap: '12px',\n overflowX: 'auto',\n padding: '0 1px',\n scrollSnapType: 'x mandatory',\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n WebkitOverflowScrolling: 'touch',\n pointerEvents: 'auto',\n };\n\n const cardStyle: React.CSSProperties = {\n flex: '0 0 auto',\n width: '100%',\n backgroundColor: styling?.cardBackground || '#ffffff',\n borderRadius: styling?.cardBorderRadius !== undefined\n ? `${styling.cardBorderRadius}px`\n : (styling?.cardRadiusPercent !== undefined ? `${styling.cardRadiusPercent}%` : '12px'),\n overflow: 'hidden',\n boxShadow: styling?.shadow || '0 -2px 12px rgba(0,0,0,0.12)',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '8px 12px',\n position: 'relative',\n scrollSnapAlign: 'center',\n transition: 'transform 0.2s ease',\n cursor: 'pointer',\n boxSizing: 'border-box',\n pointerEvents: 'auto',\n opacity: styling?.opacity ?? 1,\n marginBottom: 0,\n };\n\n const imageContainerStyle: React.CSSProperties = {\n width: '64px',\n height: '64px',\n borderRadius: styling?.imageRadius !== undefined ? `${styling.imageRadius}px` : '12px',\n overflow: 'hidden',\n backgroundColor: '#f5f5f5',\n flexShrink: 0,\n };\n\n const contentContainerStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n padding: '0 12px',\n minWidth: 0,\n };\n\n return (\n <>\n <div style={containerStyle} className=\"shopable-container\">\n <style>{`\n .shopable-container::-webkit-scrollbar { display: none; }\n .shopable-card:active { transform: scale(0.98); }\n `}</style>\n {products.map((product) => (\n <div\n key={product.id}\n style={cardStyle}\n className=\"shopable-card\"\n onClick={(e) => handleProductClick(e, product)}\n >\n {/* Product Image */}\n <div style={imageContainerStyle}>\n <img src={product.image} alt={product.title} style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n </div>\n\n {/* Product Details */}\n <div style={contentContainerStyle}>\n <span style={{\n color: styling?.titleColor || styling?.textColor || '#1a1b2e',\n fontSize: styling?.titleFontSize ? `${styling.titleFontSize}px` : '15px',\n fontWeight: styling?.titleFontWeight || '700',\n lineHeight: '1.2',\n display: 'block',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n marginBottom: '1px'\n }}>\n {product.title}\n </span>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: '6px', flexWrap: 'wrap' }}>\n <span style={{\n color: styling?.priceColor || styling?.textColor || '#1a1b2e',\n fontSize: styling?.priceFontSize ? `${styling.priceFontSize}px` : '18px',\n fontWeight: styling?.priceFontWeight || '800',\n display: 'block'\n }}>\n {product.price}\n </span>\n {product.oldPrice && (\n <span style={{\n color: styling?.mrpColor || '#8b8b98',\n fontSize: styling?.mrpFontSize ? `${styling.mrpFontSize}px` : '12px',\n fontWeight: styling?.mrpFontWeight || '500',\n textDecoration: 'line-through'\n }}>\n {product.oldPrice}\n </span>\n )}\n </div>\n </div>\n\n {/* Buy Button */}\n <div style={{\n backgroundColor: styling?.buttonBackground || '#000000',\n color: styling?.buttonTextColor || '#ffffff',\n fontSize: styling?.buttonFontSize ? `${styling.buttonFontSize}px` : '14px',\n fontWeight: '700',\n padding: '10px 18px',\n borderRadius: styling?.buttonBorderRadius !== undefined ? `${styling.buttonBorderRadius}px` : '100px',\n textAlign: 'center',\n flexShrink: 0,\n whiteSpace: 'nowrap'\n }}>\n Buy Now\n </div>\n </div>\n ))}\n </div>\n\n {/* Premium Product Details Modal */}\n {isModalOpen && selectedProduct && (\n <ShopableModal\n product={selectedProduct}\n styling={styling}\n onClose={() => setIsModalOpen(false)}\n onAddToCart={handleAddToCart}\n />\n )}\n </>\n );\n};\n\n","import React, { useState, useEffect } from 'react';\nimport { ShopableProduct } from './types';\n\ninterface ShopableModalProps {\n product: ShopableProduct;\n styling: any;\n onClose: () => void;\n onAddToCart: (item: any) => void;\n}\n\nexport const ShopableModal: React.FC<ShopableModalProps> = ({\n product,\n styling,\n onClose,\n onAddToCart,\n}) => {\n const [selectedSize, setSelectedSize] = useState<string>('');\n const [selectedColorIndex, setSelectedColorIndex] = useState<number>(0);\n const [quantity, setQuantity] = useState<number>(1);\n const [isSuccess, setIsSuccess] = useState<boolean>(false);\n const [isVisible, setIsVisible] = useState<boolean>(false);\n\n const attributes = product.attributes || {};\n const colors = attributes.colors || [];\n const sizes = attributes.sizes || [];\n const imageUrls = attributes.imageUrls || [product.image];\n const description = attributes.description || '';\n\n useEffect(() => {\n if (sizes.length > 0) setSelectedSize(sizes[0]);\n setIsVisible(true);\n }, [sizes]);\n\n const handleAddToCart = () => {\n const item = {\n productId: product.productId || product.id,\n title: product.title,\n selectedSize,\n selectedColor: colors[selectedColorIndex]?.name,\n quantity,\n price: product.price,\n };\n onAddToCart(item);\n \n // Handle Redirection\n let url = product.redirectUrl || product.url;\n if (url) {\n if (!url.startsWith('http') && !url.startsWith('//')) {\n url = 'https://' + url;\n }\n try {\n window.open(url, '_blank', 'noopener,noreferrer');\n } catch (error) {\n console.error('AppStorys: Redirect failed', error);\n }\n }\n \n setIsSuccess(true);\n };\n\n const handleDismiss = () => {\n setIsVisible(false);\n setTimeout(onClose, 400); // Match transiton duration\n };\n\n // Base Colors from styling\n const buttonBg = styling?.buttonBackground || '#000000';\n const buttonFg = styling?.buttonTextColor || '#ffffff';\n const titleFg = styling?.titleColor || styling?.textColor || '#1a1a2e';\n const priceFg = styling?.priceColor || styling?.textColor || '#1a1a2e';\n const mrpFg = styling?.mrpColor || '#8b8b98';\n \n const titleWeight = styling?.titleFontWeight || '600';\n const priceWeight = styling?.priceFontWeight || '700';\n const mrpWeight = styling?.mrpFontWeight || '500';\n\n if (isSuccess) {\n return (\n <div className=\"appstorys-shopable-success-overlay\" style={overlayStyle}>\n <div className=\"appstorys-shopable-backdrop\" style={backdropStyle} onClick={handleDismiss} />\n <div className=\"appstorys-shopable-sheet\" style={{\n ...sheetStyle,\n height: 'auto',\n minHeight: '310px',\n animation: 'appstorys-slide-up 0.4s cubic-bezier(0.2, 0.8, 0.2, 1)',\n }}>\n <div style={dragHandleStyle} onClick={handleDismiss} />\n <div style={{ padding: '0 20px 24px', textAlign: 'center' }}>\n <div style={{ \n backgroundColor: '#F3F4F6', \n borderRadius: '20px', \n padding: '22px', \n marginTop: '16px',\n display: 'flex', \n flexDirection: 'column', \n alignItems: 'center',\n gap: '12px'\n }}>\n <h3 style={{ margin: 0, fontSize: '16px', fontWeight: '600', lineHeight: '1.4' }}>\n Added to your bag<br />successfully\n </h3>\n {/* Smile Arc Icon SVG */}\n <svg width=\"44\" height=\"26\" viewBox=\"0 0 44 26\" fill=\"none\">\n <path d=\"M4 4C4 4 11 22 22 22C33 22 40 4 40 4\" stroke=\"currentColor\" strokeWidth=\"2.8\" strokeLinecap=\"round\" />\n </svg>\n </div>\n\n <div style={{ marginTop: '24px', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <button \n onClick={handleDismiss}\n style={{ \n ...buttonBaseStyle, \n backgroundColor: '#000000', \n color: '#ffffff',\n padding: '17px',\n fontSize: '16px',\n fontWeight: '600'\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px' }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4Z\"/><path d=\"M3 6h18\"/><path d=\"M16 10a4 4 0 0 1-8 0\"/>\n </svg>\n Go to checkout\n </div>\n </button>\n <button \n onClick={handleDismiss}\n style={{ \n ...buttonBaseStyle, \n backgroundColor: 'transparent', \n color: '#000000',\n border: '1px solid rgba(0,0,0,0.1)',\n padding: '15px',\n fontSize: '16px'\n }}\n >\n Continue with stories\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`appstorys-shopable-overlay ${isVisible ? 'visible' : ''}`} style={overlayStyle}>\n <div className=\"appstorys-shopable-backdrop\" style={backdropStyle} onClick={handleDismiss} />\n <div className=\"appstorys-shopable-sheet\" style={{\n ...sheetStyle,\n transform: isVisible ? 'translateY(0)' : 'translateY(100%)',\n opacity: isVisible ? 1 : 0,\n }}>\n {/* Header */}\n <div style={headerStyle}>\n <div style={dragHandleStyle} onClick={handleDismiss} />\n <button style={closeButtonStyle} onClick={handleDismiss}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n\n <div style={scrollContentStyle}>\n {/* Gallery Section */}\n <div style={gallerySectionStyle}>\n {imageUrls.map((url, i) => (\n <div key={i} style={{\n minWidth: imageUrls.length > 1 ? '85%' : '100%',\n aspectRatio: '1.2 / 1',\n maxHeight: '240px',\n borderRadius: '16px',\n overflow: 'hidden',\n backgroundColor: '#F9FAFB'\n }}>\n <img src={url} alt={product.title} style={{ width: '100%', height: '100%', objectFit: 'contain' }} />\n </div>\n ))}\n </div>\n\n <div style={{ padding: '0 20px 20px' }}>\n <h2 style={{ \n margin: '16px 0 4px', \n fontSize: styling?.titleFontSize ? `${styling.titleFontSize}px` : '20px', \n fontWeight: titleWeight, \n color: titleFg,\n lineHeight: '1.2' \n }}>\n {product.title}\n </h2>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: '8px', marginBottom: '16px' }}>\n <span style={{ \n fontSize: styling?.priceFontSize ? `${styling.priceFontSize}px` : '18px', \n fontWeight: priceWeight, \n color: priceFg \n }}>\n {product.price}\n </span>\n {product.oldPrice && (\n <span style={{ \n fontSize: styling?.mrpFontSize ? `${styling.mrpFontSize}px` : '14px', \n color: mrpFg, \n textDecoration: 'line-through',\n fontWeight: mrpWeight\n }}>\n {product.oldPrice}\n </span>\n )}\n </div>\n {/* Color Section */}\n {colors.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>COLOR</div>\n <div style={{ display: 'flex', gap: '14px', marginTop: '12px' }}>\n {colors.map((color, i) => (\n <div key={color.id} style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '5px' }}>\n <button\n onClick={() => setSelectedColorIndex(i)}\n style={{\n width: '36px', height: '36px', borderRadius: '50%', border: 'none',\n backgroundColor: color.hex || '#gray',\n position: 'relative', cursor: 'pointer',\n boxShadow: selectedColorIndex === i ? '0 0 0 2px #fff, 0 0 0 4px #000' : 'none',\n transition: 'all 0.2s ease'\n }}\n />\n <div style={{ \n width: '5px', height: '5px', borderRadius: '50%', \n backgroundColor: selectedColorIndex === i ? '#000' : 'transparent',\n transition: 'all 0.2s ease'\n }} />\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Size Section */}\n {sizes.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>SIZE</div>\n <div style={{ display: 'flex', gap: '10px', marginTop: '12px', flexWrap: 'wrap' }}>\n {sizes.map((size) => (\n <div key={size} style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '4px' }}>\n <button\n onClick={() => setSelectedSize(size)}\n style={{\n minWidth: '42px', height: '42px', borderRadius: '50%',\n backgroundColor: 'transparent',\n border: `1px solid ${selectedSize === size ? '#000' : 'rgba(0,0,0,0.1)'}`,\n color: selectedSize === size ? '#000' : '#8b8b98',\n fontSize: '13px', fontWeight: '500', cursor: 'pointer',\n transition: 'all 0.2s ease'\n }}\n >\n {size}\n </button>\n <div style={{ \n width: '5px', height: '5px', borderRadius: '50%', \n backgroundColor: selectedSize === size ? '#000' : 'transparent',\n transition: 'all 0.2s ease'\n }} />\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Description */}\n {description && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>DESCRIPTION</div>\n <p style={{ \n margin: '8px 0 0', fontSize: '14px', lineHeight: '1.5', color: '#8b8b98',\n wordBreak: 'break-word'\n }}>\n {description}\n </p>\n </div>\n )}\n </div>\n </div>\n\n {/* Sticky Bottom Bar */}\n <div style={bottomBarStyle}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1px', minWidth: '75px' }}>\n <div style={{ fontSize: '15px', fontWeight: priceWeight, color: priceFg }}>{product.price}</div>\n {product.oldPrice && (\n <div style={{ fontSize: '11px', color: mrpFg, textDecoration: 'line-through', fontWeight: mrpWeight }}>{product.oldPrice}</div>\n )}\n </div>\n\n <div style={stepperStyle}>\n <button style={stepperBtnStyle} onClick={() => setQuantity(q => Math.max(1, q - 1))}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" /></svg>\n </button>\n <span style={{ fontSize: '16px', fontWeight: '700', minWidth: '18px', textAlign: 'center', color: '#000000', display: 'inline-block' }}>{quantity}</span>\n <button style={stepperBtnStyle} onClick={() => setQuantity(q => q + 1)}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" /><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" /></svg>\n </button>\n </div>\n\n {(() => {\n const availability = attributes.availability?.toLowerCase() || '';\n const isOutOfStock = availability === 'out of stock' || availability === 'out-of-stock';\n \n return (\n <button \n onClick={isOutOfStock ? undefined : handleAddToCart} \n disabled={isOutOfStock}\n style={{\n ...buttonBaseStyle,\n backgroundColor: isOutOfStock ? '#F3F4F6' : buttonBg,\n color: isOutOfStock ? '#9CA3AF' : buttonFg,\n flex: '1',\n padding: '12px 8px',\n gap: '6px',\n cursor: isOutOfStock ? 'not-allowed' : 'pointer',\n opacity: isOutOfStock ? 0.8 : 1\n }}\n >\n {!isOutOfStock && (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4Z\"/><path d=\"M3 6h18\"/><path d=\"M16 10a4 4 0 0 1-8 0\"/>\n </svg>\n )}\n <span style={{ fontSize: '12px', fontWeight: '700', whiteSpace: 'nowrap' }}>\n {isOutOfStock ? 'Out of Stock' : 'Add to cart'}\n </span>\n </button>\n );\n })()}\n </div>\n </div>\n\n <style>{`\n @keyframes appstorys-slide-up {\n from { transform: translateY(100%); }\n to { transform: translateY(0); }\n }\n .appstorys-shopable-overlay {\n position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 10000;\n display: flex; align-items: flex-end; justify-content: center;\n visibility: hidden;\n }\n .appstorys-shopable-overlay.visible {\n visibility: visible;\n }\n `}</style>\n </div>\n );\n};\n\n// Styles\nconst overlayStyle: React.CSSProperties = {\n position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10000,\n display: 'flex', alignItems: 'flex-end', justifyContent: 'center', pointerEvents: 'auto',\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n width: '100%', height: '100%',\n boxSizing: 'border-box'\n};\n\nconst backdropStyle: React.CSSProperties = {\n position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0,0,0,0.45)',\n cursor: 'pointer'\n};\n\nconst sheetStyle: React.CSSProperties = {\n position: 'relative', width: '100%', maxWidth: '500px',\n backgroundColor: '#fff', borderTopLeftRadius: '28px', borderTopRightRadius: '28px',\n borderBottomLeftRadius: 0, borderBottomRightRadius: 0,\n maxHeight: '60vh', display: 'flex', flexDirection: 'column', margin: 0,\n transition: 'transform 0.4s cubic-bezier(0.2, 0.8, 0.2, 1), opacity 0.4s ease',\n boxShadow: '0 -8px 24px rgba(0,0,0,0.15)', overflow: 'hidden',\n boxSizing: 'border-box'\n};\n\nconst headerStyle: React.CSSProperties = {\n height: '48px', display: 'flex', alignItems: 'center', justifyContent: 'center', position: 'relative', flexShrink: 0\n};\n\nconst dragHandleStyle: React.CSSProperties = {\n width: '36px', height: '5px', backgroundColor: 'rgba(0,0,0,0.1)', borderRadius: '3px', cursor: 'pointer'\n};\n\nconst closeButtonStyle: React.CSSProperties = {\n position: 'absolute', right: '18px', top: '16px', border: 'none',\n width: '28px', height: '28px', borderRadius: '50%', backgroundColor: '#F3F4F6',\n display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#666', cursor: 'pointer'\n};\n\nconst scrollContentStyle: React.CSSProperties = {\n flex: 1, overflowY: 'auto', WebkitOverflowScrolling: 'touch'\n};\n\nconst gallerySectionStyle: React.CSSProperties = {\n padding: '0 16px 20px', display: 'flex', gap: '8px', overflowX: 'auto', scrollSnapType: 'x mandatory'\n};\n\nconst sectionStyle: React.CSSProperties = {\n marginTop: '20px'\n};\n\nconst sectionTitleStyle: React.CSSProperties = {\n fontSize: '11px', fontWeight: '600', color: 'rgba(0,0,0,0.5)', letterSpacing: '1.4px'\n};\n\nconst bottomBarStyle: React.CSSProperties = {\n padding: '12px 16px calc(20px + env(safe-area-inset-bottom, 0px))',\n borderTop: '1px solid rgba(0,0,0,0.05)', display: 'flex', alignItems: 'center', gap: '8px',\n backgroundColor: '#fff', boxShadow: '0 -4px 12px rgba(0,0,0,0.06)', zIndex: 10,\n boxSizing: 'border-box'\n};\n\nconst stepperStyle: React.CSSProperties = {\n display: 'flex', alignItems: 'center', gap: '10px', padding: '10px 12px',\n borderRadius: '100px', border: '1px solid rgba(0,0,0,0.1)'\n};\n\nconst stepperBtnStyle: React.CSSProperties = {\n border: 'none', backgroundColor: 'transparent', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center'\n};\n\nconst buttonBaseStyle: React.CSSProperties = {\n border: 'none', borderRadius: '100px', cursor: 'pointer',\n display: 'flex', alignItems: 'center', justifyContent: 'center', transition: 'all 0.2s ease'\n};\n","import React from 'react';\nimport { StickerData } from './types';\nimport { PollSticker } from './PollSticker';\nimport { QuizSticker } from './QuizSticker';\nimport { CountdownSticker } from './CountdownSticker';\nimport { PromoCodeSticker } from './PromoCodeSticker';\nimport { ReactionSticker } from './ReactionSticker';\nimport { RatingSticker } from './RatingSticker';\nimport { QuestionSticker } from './QuestionSticker';\nimport { ImageQuizSticker } from './ImageQuizSticker';\nimport { ShopableSticker } from './ShopableSticker';\n\ninterface InteractiveItemProps {\n data: StickerData;\n onInteraction?: (data: any) => void;\n isEditing?: boolean;\n}\n\nexport const InteractiveItem: React.FC<InteractiveItemProps> = ({\n data,\n onInteraction,\n isEditing = false,\n}) => {\n const defaults = {\n x: 10,\n y: 15,\n width: 80, // percentage\n rotation: 0,\n };\n\n const x = data.x ?? defaults.x;\n const y = data.y ?? defaults.y;\n const width = data.width ?? defaults.width;\n const rotation = data.rotation ?? defaults.rotation;\n\n const wrapperStyle: React.CSSProperties = {\n position: 'absolute',\n top: `${y}%`,\n left: `${x}%`,\n width: `${width}%`,\n height: (data as any).height ? `${(data as any).height}%` : 'auto',\n transform: `rotate(${rotation}deg)`,\n zIndex: 10,\n transformOrigin: 'center center',\n boxSizing: 'border-box',\n cursor: isEditing ? 'move' : 'default',\n pointerEvents: 'auto',\n };\n\n const animationStyle: React.CSSProperties = {\n width: '100%',\n height: '100%',\n animation: (data as any).styling?.animation,\n animationFillMode: 'forwards',\n };\n\n const renderSticker = () => {\n const stickerType = (data as any).type;\n switch (stickerType) {\n case 'poll':\n return <PollSticker data={data as any} onInteraction={onInteraction} isEditing={isEditing} />;\n case 'quiz':\n return <QuizSticker data={data as any} onInteraction={onInteraction} isEditing={isEditing} />;\n case 'rating':\n return <RatingSticker data={data as any} onInteraction={onInteraction} isEditing={isEditing} />;\n case 'question':\n case 'input':\n return <QuestionSticker data={data as any} onInteraction={onInteraction} isEditing={isEditing} />;\n case 'image_quiz':\n return <ImageQuizSticker data={data as any} onInteraction={onInteraction} isEditing={isEditing} />;\n case 'countdown':\n return <CountdownSticker data={data as any} onInteraction={onInteraction} isEditing={isEditing} />;\n case 'promo_code':\n case 'promo':\n return <PromoCodeSticker data={data as any} onInteraction={onInteraction} isEditing={isEditing} />;\n case 'reaction':\n return <ReactionSticker data={data as any} onInteraction={onInteraction} isEditing={isEditing} />;\n case 'buy':\n case 'shopable':\n return <ShopableSticker data={data as any} onInteraction={onInteraction} isEditing={isEditing} />;\n case 'image':\n return <img src={(data as any).url} alt=\"static overlay\" style={{ width: '100%', height: '100%', objectFit: 'fill' }} />;\n case 'text': {\n const textStyle = (data as any).styling || {};\n return (\n <span style={{\n color: textStyle.color || '#000000',\n fontSize: `${textStyle.fontSize || 14}px`,\n fontFamily: textStyle.fontFamily || 'Arial',\n fontStyle: textStyle.fontStyle || 'normal',\n fontWeight: textStyle.fontWeight || 'normal',\n wordBreak: 'break-word',\n display: 'inline-block',\n }}>\n {(data as any).text}\n </span>\n );\n }\n default:\n return (\n <div style={{ padding: '10px', background: 'white', color: 'black', borderRadius: '4px' }}>\n Unsupported interactive element: {(data as any).type}\n </div>\n );\n }\n };\n\n return (\n <div style={wrapperStyle} className={`interactive-item-z${(data as any).z ?? 0}`}>\n <div style={animationStyle}>\n {renderSticker()}\n </div>\n </div>\n );\n};","export const parseBackground = (bg: any): string | undefined => {\n if (!bg) return undefined;\n if (typeof bg === 'string') return bg;\n\n // Some payloads send colors directly without a nested `color` object.\n // Examples: { solid: '#ffffff' } or { value: '#ffffff' }\n if (typeof bg === 'object') {\n if (typeof bg.solid === 'string' && bg.solid) return bg.solid;\n if (typeof bg.value === 'string' && bg.value) return bg.value;\n }\n\n const color = bg.color || {};\n if (color.type === 'gradient' && color.gradient) {\n const { direction = 'right', from, to, stops = [] } = color.gradient;\n const dirMap: Record<string, string> = {\n right: 'to right',\n left: 'to left',\n top: 'to top',\n bottom: 'to bottom',\n };\n const cssDir = dirMap[direction] || direction;\n\n if (stops.length > 0) {\n const stopStr = stops\n .map((s: any) => `${s.color} ${Math.round((s.offset || 0) * 100)}%`)\n .join(', ');\n return `linear-gradient(${cssDir}, ${stopStr})`;\n }\n return `linear-gradient(${cssDir}, ${from}, ${to})`;\n }\n\n return color.solid || color.value || undefined;\n};\n\nexport const getAnimationStyles = (anim: any): string | undefined => {\n if (!anim || anim.type === 'none') return undefined;\n const type = String(anim.type).toLowerCase();\n const duration = anim.duration || 0.6;\n\n if (type === 'fade') return `appstorys-fade-in ${duration}s ease-out forwards`;\n if (type === 'classic') return `appstorys-classic-in ${duration}s cubic-bezier(0.34, 1.56, 0.64, 1) forwards`;\n if (type === 'rotate') return `appstorys-rotate-in ${duration}s ease-out forwards`;\n if (type === 'bounce') return `appstorys-bounce-in ${duration + 0.2}s cubic-bezier(0.68, -0.6, 0.32, 1.6) forwards`;\n\n return undefined;\n};","import React from 'react';\nimport { StickerData } from './types';\nimport { InteractiveItem } from './InteractiveItem';\nimport { parseBackground, getAnimationStyles } from '../../../utils/styleUtils';\n\ninterface InteractiveOverlayProps {\n content?: any; // Pass fully packed backend content structure\n onInteraction?: (data: any) => void;\n isEditing?: boolean;\n elapsedTime?: number;\n}\n\nconst getEditorSource = (item: any, content: any): 'studio' | 'dashboard' => {\n const editorSource =\n item?.styling?.editorSource ||\n item?.styling?.meta?.editorSource ||\n item?.style?.editorSource ||\n content?.editorSource ||\n content?.meta?.editorSource;\n\n return editorSource === 'studio' || editorSource === 'editor' ? 'studio' : 'dashboard';\n};\n\nconst normalizeOptions = (options: any, isCorrect?: string | boolean | null): any[] => {\n if (Array.isArray(options)) {\n return options.map((option, index) => {\n const optionId = option?.id || option?.key || option?.value || `option_${index + 1}`;\n const optionLabel = option?.label || option?.optionLabel;\n const optionText =\n typeof option === 'string'\n ? option\n : option?.text || option?.title || optionLabel || '';\n\n return {\n id: String(optionId),\n text: optionText,\n image: option?.image || option?.imageUrl || '',\n label: optionLabel,\n isCorrect: option?.isCorrect === true || String(optionId) === String(isCorrect),\n };\n });\n }\n\n if (options && typeof options === 'object') {\n return Object.entries(options).map(([key, value]) => {\n const optionValue = typeof value === 'string' ? { text: value } : ((value as any) || {});\n return {\n id: key,\n text: optionValue.text || optionValue.title || optionValue.label || '',\n image: optionValue.image || optionValue.imageUrl || '',\n label: optionValue.label,\n isCorrect: key === String(isCorrect),\n };\n });\n }\n\n return [];\n};\n\nconst normalizeReactionEmojis = (data: any): string[] => {\n if (Array.isArray(data?.emojis)) {\n return data.emojis.map((emoji: any) => String(emoji));\n }\n\n return normalizeOptions(data?.options).map((option) => option.text).filter(Boolean);\n};\n\nconst normalizeElementType = (type: any): string => {\n const normalized = String(type || '').toLowerCase();\n if (normalized === 'quizz') return 'quiz';\n if (normalized === 'rate') return 'rating';\n if (normalized === 'input' || normalized === 'ask_question' || normalized === 'askquestion') return 'question';\n if (normalized === 'promo' || normalized === 'promocode') return 'promo_code';\n return normalized;\n};\n\n// Helper to combine endDate and endTime into ISO string\nconst getCountdownTarget = (data: any) => {\n if (data.targetDate) return data.targetDate;\n if (!data.endDate) return new Date(Date.now() + 86400000).toISOString();\n\n try {\n const combined = `${data.endDate}${data.endTime ? `T${data.endTime}` : ''}`;\n return new Date(combined).toISOString();\n } catch (e) {\n return data.endDate || new Date(Date.now() + 86400000).toISOString();\n }\n};\n\nexport const InteractiveOverlay: React.FC<InteractiveOverlayProps> = ({\n content = {},\n onInteraction,\n isEditing = false,\n elapsedTime = 0,\n}) => {\n const canva = content?.canva || { height: 1920, width: 1080 };\n const canvaWidth = canva?.width || 1080;\n const canvaHeight = canva?.height || 1920;\n const scale_factor = 0.352; // standard width desktop factor scaling 380/1080\n\n const elements = content?.elements || [];\n const images = content?.image || [];\n const texts = content?.text || [];\n const interactions = content?.interactions || [];\n const shopableContent = (Array.isArray(content?.shopable) && content.shopable.length > 0)\n ? content.shopable\n : (Array.isArray(content?.styling?.shopable) ? content.styling.shopable : []);\n const shopableIds = new Set(shopableContent.map((s: any) => s.id));\n const shopableStyling = (content?.styling?.shopable || []).concat(shopableContent.map((s: any) => s.styling).filter(Boolean));\n\n if (elements.length === 0 && images.length === 0 && texts.length === 0 && interactions.length === 0 && shopableContent.length === 0) return null;\n\n // 1. Map interactive elements\n const displayElements = elements\n .filter((item: any) => !shopableIds.has(item.id))\n .map((item: any): StickerData => {\n const custom = item.custom || {};\n const data = custom.data || {};\n const style = custom.style || item.styling || {};\n const source = getEditorSource(item, content);\n\n const position = item.position || item.postion || {};\n const size = item.size || {};\n\n // Safe coordinate conversion with bulletproof Number parsing.\n // Studio often sends `{ position: {x,y}, size: {width,height} }` instead of direct `x/y/width`.\n const rawX = item.x !== undefined ? item.x : position.x;\n const rawY = item.y !== undefined ? item.y : position.y;\n const rawW = item.width !== undefined ? item.width : size.width;\n\n const x_percent = rawX !== undefined && !isNaN(Number(rawX)) ? (Number(rawX) / canvaWidth) * 100 : 10;\n const y_percent = rawY !== undefined && !isNaN(Number(rawY)) ? (Number(rawY) / canvaHeight) * 100 : 15;\n const width_percent = rawW !== undefined && !isNaN(Number(rawW)) ? (Number(rawW) / canvaWidth) * 100 : 80;\n\n const baseData = {\n id: item.id || Math.random().toString(),\n type: normalizeElementType(custom.interactiveType || item.widgetType || item.type || 'unknown'),\n x: x_percent,\n y: y_percent,\n width: width_percent,\n rotation: style.rotation ?? item.rotation ?? 0,\n z: item.z ?? item.position?.z ?? style.z ?? 10,\n duration: data.duration || style.duration,\n styling: {\n backgroundColor: parseBackground(style.background || style.containerBgColor || style.backgroundColor),\n borderRadius: (style.borderRadius !== undefined ? (style.borderRadius >= 100 ? 999 : style.borderRadius * scale_factor) : (style.radius !== undefined ? (style.radius >= 100 ? 999 : style.radius * scale_factor) : 0)),\n padding: (style.containerPadding !== undefined ? style.containerPadding : (style.padding !== undefined ? style.padding : 0)) * scale_factor,\n shadow: style.shadow,\n fontSize: style.questionFontSize ? style.questionFontSize * scale_factor : undefined,\n opacity: style.opacity ?? 1,\n animation: getAnimationStyles(style.animation),\n },\n };\n\n if (baseData.type === 'poll') {\n const normalizedOpts = normalizeOptions(data.options);\n return {\n ...baseData,\n type: 'poll',\n question: data.question || data.title || 'Poll Question',\n options: normalizedOpts,\n layout: data.layout || { type: 'vertical', columns: 1 },\n styling: {\n ...baseData.styling,\n headerColor: style.headerBgColor || style.background,\n headerTextColor: style.questionColor || style.questionTextColor || (style.question?.color),\n optionBgColor: style.optionBgColor || style.options?.background || '#1A1A1A',\n optionTextColor: style.optionTextColor || style.options?.textColor || '#ffffff',\n optionBorderRadius: style.optionBorderRadius !== undefined ? style.optionBorderRadius * scale_factor : (style.options?.radius !== undefined ? style.options?.radius * scale_factor : 0),\n },\n } as any;\n }\n\n if (baseData.type === 'quiz') {\n const colors = style.colors || {};\n const normalizedOpts = normalizeOptions(data.options, data.isCorrect);\n return {\n ...baseData,\n type: 'quiz',\n question: data.question || data.title || 'Quiz Question',\n options: normalizedOpts,\n showExplanation: data.showExplanation,\n url: data.url,\n styling: {\n ...baseData.styling,\n backgroundColor: style.background || style.containerBgColor || style.backgroundColor || 'transparent',\n questionTextColor: style.questionColor || colors.questionColor || style.question?.color || style.colors?.questionText || '#FF0000',\n questionBgColor: style.questionBgColor || colors.questionBackground || style.question?.background || style.colors?.questionBg || '#3BFF00',\n optionBgColor: style.optionBgColor || colors.optionBackground || style.options?.background || style.colors?.optionBg || '#C100FF',\n optionTextColor: style.optionTextColor || colors.optionTextColor || style.options?.textColor || style.colors?.optionText || '#ffffff',\n borderColor: style.borderColor || 'transparent',\n activeColor: style.correctColor || colors.correctColor || style.correctBorderColor || '#00D9FF',\n incorrectColor: style.incorrectColor || colors.incorrectColor || '#ef4444',\n optionBorderRadius: (style.optionRadius !== undefined ? (style.optionRadius >= 100 ? 999 : style.optionRadius * scale_factor) : (style.optionBorderRadius !== undefined ? (style.optionBorderRadius >= 100 ? 999 : style.optionBorderRadius * scale_factor) : 100)),\n optionFontSize: (style.optionFontSize ? style.optionFontSize : (style.typography?.optionSize ? style.typography?.optionSize : (style.options?.fontSize ? style.options?.fontSize : 16))) * scale_factor * 1.25,\n },\n } as any;\n }\n\n if (baseData.type === 'rating') {\n return {\n ...baseData,\n type: 'rating',\n title: data.title || 'Do you like my space?',\n emoji: data.emoji || '😍',\n currentRating: data.currentRating,\n maxRating: data.maxRating,\n styling: {\n ...baseData.styling,\n sliderTrackColor: style.colors?.sliderTrack || style.sliderTrack,\n sliderFillColor: style.colors?.sliderFill || style.sliderFill,\n emojiSize: style.emojiSize ? style.emojiSize * 0.45 : undefined,\n titleColor: style.colors?.titleColor || style.titleColor,\n titleFontSize: style.titleFontSize ? style.titleFontSize * 0.4 : undefined,\n },\n } as any;\n }\n\n if (baseData.type === 'question') {\n return {\n ...baseData,\n type: 'question',\n question: data.question || data.title || 'Ask me a question',\n placeholder: data.placeholder || 'Type your answer...',\n styling: {\n ...baseData.styling,\n promptColor: style.questionColor || style.textColor,\n inputBgColor: style.inputBgColor,\n inputTextColor: style.inputTextColor,\n submitBackground: style.submitBackground,\n },\n } as any;\n }\n\n if (baseData.type === 'image_quiz' || baseData.type === 'imageQuiz' || (custom.interactiveType || '').toLowerCase() === 'media_quiz') {\n return {\n ...baseData,\n type: 'image_quiz',\n question: data.question || data.title || 'Image Quiz',\n options: normalizeOptions(data.options || []),\n styling: {\n ...baseData.styling,\n questionTextColor: style.questionColor,\n activeColor: style.correctColor || style.correctBorderColor,\n incorrectColor: style.incorrectColor,\n imageRadius: style.imageRadius ? style.imageRadius * scale_factor : undefined,\n },\n } as any;\n }\n\n if (baseData.type === 'countdown') {\n return {\n ...baseData,\n type: 'countdown',\n title: data.title || 'Ends in...',\n targetDate: getCountdownTarget(data),\n styling: {\n ...baseData.styling,\n borderColor: style.borderColor,\n digitBackground: style.digitBackground,\n digitColor: style.digitColor,\n digitSize: style.digitSize ? style.digitSize * scale_factor : undefined,\n labelColor: style.labelColor,\n titleColor: style.titleColor,\n },\n display: data.display,\n } as any;\n }\n\n if (baseData.type === 'promo_code') {\n return {\n ...baseData,\n type: 'promo_code',\n code: data.code || 'CODE20',\n styling: {\n ...baseData.styling,\n borderColor: style.borderColor,\n },\n } as any;\n }\n\n if (baseData.type === 'reaction' || baseData.type === 'emoji_reaction') {\n const emojisArray = normalizeReactionEmojis(data);\n\n return {\n ...baseData,\n type: 'reaction',\n emojis: emojisArray.length > 0 ? emojisArray : ['😍', '👍'],\n source,\n } as any;\n }\n\n return baseData as any;\n });\n\n // 1b. Map interactions (new structure supported for story interaction types)\n const displayInteractions = (content?.interactions || [])\n .filter((item: any) => !shopableIds.has(item.id))\n .map((item: any): StickerData => {\n const data = item.config || {};\n const style = item.styling || item.style || {}; // Map both structures\n const source = getEditorSource(item, content);\n\n const typeStr = normalizeElementType(item.interaction_type || item.type);\n\n // Support position and size structures framed sizing absolute layout setups\n const position = style.position || item.position || {};\n const size = style.size || item.size || {};\n\n // Support both direct dimensions and nested size/position structures scales framing\n const posX = position.x ?? item.x;\n const posY = position.y ?? item.y;\n const sizeW = size.width ?? item.width;\n const sizeH = size.height ?? item.height;\n\n // Fall back to defaults (10, 15, 80) if no dimension is provided or parsed to NaN\n const x_percent = posX !== undefined && !isNaN(Number(posX)) ? (Number(posX) / canvaWidth) * 100 : 10;\n const y_percent = posY !== undefined && !isNaN(Number(posY)) ? (Number(posY) / canvaHeight) * 100 : 15;\n const width_percent = sizeW !== undefined && !isNaN(Number(sizeW)) ? (Number(sizeW) / canvaWidth) * 100 : 80;\n const height_percent = sizeH !== undefined && !isNaN(Number(sizeH)) ? (Number(sizeH) / canvaHeight) * 100 : undefined;\n\n const baseData = {\n id: item.id || Math.random().toString(),\n type: typeStr,\n x: x_percent,\n y: y_percent,\n width: width_percent,\n height: height_percent,\n rotation: style.rotation ?? item.rotation ?? 0,\n z: item.z ?? item.position?.z ?? style.z ?? 10,\n source,\n duration: data.duration || style.duration,\n styling: {\n backgroundColor: parseBackground(style.background || style.containerBgColor || style.backgroundColor),\n borderRadius: (style.borderRadius !== undefined ? (style.borderRadius >= 100 ? 999 : style.borderRadius * scale_factor) : (style.radius !== undefined ? (style.radius >= 100 ? 999 : style.radius * scale_factor) : 0)),\n padding: (style.containerPadding !== undefined ? style.containerPadding : (style.padding !== undefined ? style.padding : 0)) * scale_factor,\n shadow: style.shadow,\n fontSize: style.questionSize ? style.questionSize * scale_factor : (style.questionFontSize ? style.questionFontSize * scale_factor : undefined),\n opacity: style.opacity ?? 1,\n animation: getAnimationStyles(style.animation),\n },\n };\n\n if (baseData.type === 'rating' || baseData.type === 'rate') {\n const colors = style.colors || {};\n return {\n ...baseData,\n type: 'rating',\n title: data.title || 'Do you like my space?',\n emoji: data.emoji || '😍',\n currentRating: data.currentRating,\n maxRating: data.maxRating,\n styling: {\n ...baseData.styling,\n sliderTrackColor: colors.sliderTrack || style.colors?.sliderTrack || style.colors?.sliderTrack,\n sliderFillColor: colors.sliderFill || style.colors?.sliderFill || style.sliderFill,\n emojiSize: style.emojiSize ? style.emojiSize * 0.45 : undefined,\n titleColor: colors.titleColor || style.colors?.titleColor || style.titleColor,\n titleFontSize: style.titleFontSize ? style.titleFontSize * 0.4 : undefined,\n },\n } as any;\n }\n\n if (baseData.type === 'poll') {\n const normalizedOpts = normalizeOptions(data.options);\n return {\n ...baseData,\n type: 'poll',\n question: data.question || data.title || 'Poll Question',\n options: normalizedOpts,\n layout: data.layout || { type: 'vertical', columns: 1 },\n styling: {\n ...baseData.styling,\n headerColor: style.headerBgColor || style.background,\n headerTextColor: style.questionColor || style.questionTextColor || (style.question?.color),\n optionBgColor: style.optionBgColor || style.options?.background || '#1A1A1A',\n optionTextColor: style.optionTextColor || style.options?.textColor || '#ffffff',\n optionBorderRadius: style.optionBorderRadius !== undefined ? style.optionBorderRadius * scale_factor : (style.options?.radius !== undefined ? style.options?.radius * scale_factor : 0),\n },\n } as any;\n }\n\n if (baseData.type === 'quiz') {\n const colors = style.colors || {};\n const normalizedOpts = normalizeOptions(data.options, data.isCorrect);\n return {\n ...baseData,\n type: 'quiz',\n question: data.question || data.title || 'Quiz Question',\n options: normalizedOpts,\n showExplanation: data.showExplanation,\n url: data.url,\n styling: {\n ...baseData.styling,\n backgroundColor: style.background || style.containerBgColor || style.backgroundColor || 'transparent',\n questionTextColor: style.questionColor || colors.questionColor || style.question?.color || style.colors?.questionText || '#FF0000',\n questionBgColor: style.questionBgColor || colors.questionBackground || style.question?.background || style.colors?.questionBg || '#3BFF00',\n optionBgColor: style.optionBgColor || colors.optionBackground || style.options?.background || style.colors?.optionBg || '#C100FF',\n optionTextColor: style.optionTextColor || colors.optionTextColor || style.options?.textColor || style.colors?.optionText || '#ffffff',\n borderColor: style.borderColor || 'transparent',\n activeColor: style.correctColor || colors.correctColor || style.correctBorderColor || '#00D9FF',\n incorrectColor: style.incorrectColor || colors.incorrectColor || '#ef4444',\n optionBorderRadius: (style.optionRadius !== undefined ? (style.optionRadius >= 100 ? 999 : style.optionRadius * scale_factor) : (style.optionBorderRadius !== undefined ? (style.optionBorderRadius >= 100 ? 999 : style.optionBorderRadius * scale_factor) : 100)),\n optionFontSize: (style.optionFontSize ? style.optionFontSize : (style.typography?.optionSize ? style.typography?.optionSize : (style.options?.fontSize ? style.options?.fontSize : 16))) * scale_factor * 1.25,\n },\n } as any;\n }\n\n if (baseData.type === 'question') {\n return {\n ...baseData,\n type: 'question',\n question: data.question || data.title || 'Ask me a question',\n placeholder: data.placeholder || 'Type your answer...',\n styling: {\n ...baseData.styling,\n promptColor: style.questionColor || style.promptColor || style.textColor,\n inputBgColor: style.inputBackground || style.inputBgColor,\n inputTextColor: style.inputTextColor,\n submitBackground: style.submitBackground,\n },\n } as any;\n }\n\n if (baseData.type === 'image_quiz' || baseData.type === 'imageQuiz' || typeStr === 'media_quiz') {\n return {\n ...baseData,\n type: 'image_quiz',\n question: data.question || data.title || 'Image Quiz',\n options: normalizeOptions(data.options || []),\n styling: {\n ...baseData.styling,\n questionTextColor: style.questionColor,\n activeColor: style.correctColor || style.correctBorderColor,\n incorrectColor: style.incorrectColor,\n imageRadius: style.imageRadius ? style.imageRadius * scale_factor : undefined,\n },\n } as any;\n }\n\n if (baseData.type === 'countdown') {\n return {\n ...baseData,\n type: 'countdown',\n title: data.title || 'Ends in...',\n targetDate: getCountdownTarget(data),\n styling: {\n ...baseData.styling,\n borderColor: style.borderColor,\n digitBackground: style.digitBackground,\n digitColor: style.digitColor,\n // Countdown digit/font sizes appear to be authored for final display already; scaling makes them too small.\n digitSize: (style.digitSize || style.fontSize) ? Number(style.digitSize || style.fontSize) : undefined,\n labelColor: style.labelColor,\n titleColor: style.titleColor,\n // Provide an optional label font size if backend uses a single fontSize.\n labelFontSize: style.labelFontSize ? Number(style.labelFontSize) : undefined,\n },\n display: data.display || item.display,\n } as any;\n }\n\n if (baseData.type === 'promo_code') {\n return {\n ...baseData,\n type: 'promo_code',\n code: data.code || 'CODE20',\n styling: {\n ...baseData.styling,\n borderColor: style.borderColor,\n },\n } as any;\n }\n\n if (baseData.type === 'reaction' || baseData.type === 'emoji_reaction') {\n const emojisArray = normalizeReactionEmojis(data);\n\n return {\n ...baseData,\n type: 'reaction',\n emojis: emojisArray.length > 0 ? emojisArray : ['😍', '👍'],\n } as any;\n }\n\n return baseData as any;\n });\n\n // 1c. Map shopable elements\n const displayShopable = shopableContent.map((item: any) => {\n const matchedStyling =\n shopableStyling.find((s: any) => String(s?.id) === String(item?.id)) ||\n shopableStyling.find((s: any) => s?.id === undefined) ||\n {};\n\n // Some payloads send styling directly on each shopable item instead of item.styling/content.styling.shopable\n const inlineStyling = {\n position: item?.position,\n size: item?.size,\n rotation: item?.rotation,\n z: item?.z,\n background: item?.background,\n cardBackground: item?.cardBackground,\n cardBorderRadius: item?.cardBorderRadius,\n cardRadiusPercent: item?.cardRadiusPercent,\n transparent: item?.transparent,\n textColor: item?.textColor,\n buttonBackground: item?.buttonBackground,\n buttonTextColor: item?.buttonTextColor,\n buttonFontSize: item?.buttonFontSize,\n buttonBorderRadius: item?.buttonBorderRadius,\n titleColor: item?.titleColor,\n titleFontSize: item?.titleFontSize,\n titleFontWeight: item?.titleFontWeight,\n priceColor: item?.priceColor,\n priceFontSize: item?.priceFontSize,\n priceFontWeight: item?.priceFontWeight,\n mrpColor: item?.mrpColor,\n mrpFontSize: item?.mrpFontSize,\n mrpFontWeight: item?.mrpFontWeight,\n imageRadius: item?.imageRadius,\n opacity: item?.opacity,\n animation: item?.animation,\n };\n\n const styling = {\n ...matchedStyling,\n ...(item?.styling || {}),\n ...Object.fromEntries(Object.entries(inlineStyling).filter(([, value]) => value !== undefined)),\n };\n\n const position = styling.position || {};\n const size = styling.size || {};\n\n // Radius values coming from Studio are based on the 1080x1920-ish canvas units.\n // Converting `cardRadiusPercent` directly to CSS '%' makes the card overly round.\n // Prefer a scaled px value.\n const rawCardBorderRadius = styling.cardBorderRadius !== undefined ? Number(styling.cardBorderRadius) : undefined;\n const rawCardRadiusPercent = styling.cardRadiusPercent !== undefined ? Number(styling.cardRadiusPercent) : undefined;\n const rawHeight = size.height !== undefined ? Number(size.height) : undefined;\n const radiusFromPercent =\n rawCardBorderRadius === undefined && rawCardRadiusPercent !== undefined && rawHeight !== undefined\n ? (Math.max(0, Math.min(100, rawCardRadiusPercent)) / 100) * (rawHeight / 2)\n : undefined;\n\n const resolvedCardBorderRadius = (rawCardBorderRadius ?? radiusFromPercent);\n const resolvedCardBorderRadiusPx =\n resolvedCardBorderRadius !== undefined && !isNaN(resolvedCardBorderRadius)\n ? resolvedCardBorderRadius * scale_factor\n : undefined;\n\n // Standard coordinate conversion - using backend data directly as requested\n const x_percent = position.x !== undefined ? (Number(position.x) / canvaWidth) * 100 : 0;\n const width_percent = size.width !== undefined ? (Number(size.width) / canvaWidth) * 100 : 100;\n const height_percent = size.height !== undefined ? (Number(size.height) / canvaHeight) * 100 : undefined;\n\n // Default to the bottom if position is missing, otherwise use provided Y\n let y_percent = position.y !== undefined ? (Number(position.y) / canvaHeight) * 100 : (height_percent ? 100 - height_percent - 2.5 : 85);\n\n // Tighten the bottom-snapping logic to remove the \"space\" as requested\n if (height_percent && (y_percent + height_percent) > 96) {\n y_percent = Math.max(0, 100 - height_percent);\n } else if (y_percent > 75 && height_percent && (y_percent + height_percent) > 91) {\n y_percent = Math.max(0, 100 - height_percent - 1);\n }\n\n const isProductType = Array.isArray(item.product) && item.product.length > 0;\n const itemsSource = isProductType ? item.product : (item.static || []);\n\n return {\n id: item.id || Math.random().toString(),\n type: 'buy',\n shopableType: isProductType ? 'product' : 'static',\n x: x_percent,\n y: y_percent,\n width: width_percent,\n height: height_percent,\n rotation: styling.rotation ?? 0,\n z: styling.z ?? 10,\n products: itemsSource.map((p: any) => {\n // Handle potential nesting in productData key as seen in latest backend JSON\n const sourceData = p.productData || p || {};\n const attr = sourceData.attributes || p.attributes || {};\n\n // If sales_price exists in attributes, it's the current price, and p.price is the old price\n const currentPrice = attr.sales_price || sourceData.price || attr.price || p.price;\n const oldPrice = attr.sales_price ? (sourceData.price || attr.price || p.price) : (sourceData.oldPrice || p.oldPrice);\n\n // Robust attribute mapping - ensure all metadata is preserved for the modal\n const colorVal = sourceData.color || attr.color || p.color;\n const sizeVal = sourceData.size || attr.size || p.size;\n \n let colors = attr.colors || [];\n if (colors.length === 0 && colorVal) {\n colors = [{ id: colorVal, hex: colorVal, name: colorVal }];\n }\n\n let sizes = attr.sizes || [];\n if (sizes.length === 0 && sizeVal) {\n sizes = typeof sizeVal === 'string' ? sizeVal.split(',').map(s => s.trim()) : [sizeVal];\n }\n\n const consolidatedAttributes = {\n description: sourceData.description || attr.description || p.description,\n color: colorVal,\n size: sizeVal,\n colors: colors,\n sizes: sizes,\n imageUrls: attr.imageUrls || [attr.image_link || sourceData.imageUrl || sourceData.image || p.imageUrl || p.image || p.url].filter(Boolean),\n availability: sourceData.availability || attr.availability || p.availability,\n tags: sourceData.tags || attr.tags || p.tags,\n ...attr,\n };\n\n return {\n id: sourceData.productId || sourceData.id || p.productId || p.id || Math.random().toString(),\n image: attr.image_link || sourceData.imageUrl || sourceData.image || p.imageUrl || p.image || p.url,\n url: sourceData.link || sourceData.url || p.link || p.url || p.redirectUrl,\n title: sourceData.title || p.title,\n price: currentPrice,\n oldPrice: oldPrice,\n redirectUrl: p.redirectUrl || sourceData.link || p.link || p.url,\n svg: sourceData.svg || p.svg,\n productId: sourceData.productId || p.productId,\n collectionId: sourceData.collectionId || p.collectionId,\n feedId: sourceData.feedId || p.feedId,\n attributes: consolidatedAttributes,\n };\n }),\n styling: {\n backgroundColor: parseBackground(styling.background),\n cardBackground: parseBackground(styling.cardBackground) || parseBackground(styling.background) || '#ffffff',\n cardBorderRadius: resolvedCardBorderRadiusPx !== undefined ? resolvedCardBorderRadiusPx : 10,\n // Keep for backward compatibility, but UI should prefer px radius above.\n cardRadiusPercent: rawCardRadiusPercent,\n transparent: styling.transparent === true,\n textColor: styling.textColor || '#ffffff',\n buttonBackground: styling.buttonBackground || '#000000',\n buttonTextColor: styling.buttonTextColor || '#ffffff',\n buttonFontSize: styling.buttonFontSize || 12,\n buttonBorderRadius: styling.buttonBorderRadius !== undefined ? styling.buttonBorderRadius : 100,\n titleColor: styling.titleColor || styling.textColor || '#1a1a2e',\n titleFontSize: styling.titleFontSize || 14,\n titleFontWeight: styling.titleFontWeight ? String(styling.titleFontWeight) : '600',\n priceColor: styling.priceColor || styling.textColor || '#1a1a2e',\n priceFontSize: styling.priceFontSize || 16,\n priceFontWeight: styling.priceFontWeight ? String(styling.priceFontWeight) : '700',\n mrpColor: styling.mrpColor || '#8b8b98',\n mrpFontSize: styling.mrpFontSize || 12,\n mrpFontWeight: styling.mrpFontWeight ? String(styling.mrpFontWeight) : '500',\n imageRadius: styling.imageRadius !== undefined ? Number(styling.imageRadius) * scale_factor : 10,\n animation: getAnimationStyles(styling.animation),\n },\n };\n });\n\n // 2. Map static images\n const displayImages = images.map((img: any) => {\n const position = img.position || img.postion || { x: 0, y: 0 };\n return {\n id: img.id || Math.random().toString(),\n type: 'image',\n x: (position.x / canvaWidth) * 100,\n y: (position.y / canvaHeight) * 100,\n width: (img.width / canvaWidth) * 100,\n height: img.height ? (img.height / canvaHeight) * 100 : undefined,\n url: img.link || img.url,\n z: img.z ?? 0,\n };\n });\n\n // 3. Map static text\n const displayText = texts.map((txt: any) => {\n const position = txt.position || { x: 0, y: 0 };\n const font = txt.font || {};\n return {\n id: txt.id || Math.random().toString(),\n type: 'text',\n x: (position.x / canvaWidth) * 100,\n y: (position.y / canvaHeight) * 100,\n width: txt.size?.width ? (txt.size.width / canvaWidth) * 100 : undefined,\n text: txt.value,\n z: txt.z ?? 1,\n styling: {\n color: txt.color || '#000000',\n fontSize: font.fontSize ? font.fontSize * scale_factor : undefined,\n fontFamily: font.fontFamily,\n fontStyle: font.fontStyle,\n fontWeight: font.fontWeight,\n },\n };\n });\n\n // Combine & Sort by Z index index layer mappings stack\n const displayItems = [...displayElements, ...displayInteractions, ...displayShopable, ...displayImages, ...displayText]\n .filter((item: any) => {\n if (!item.duration) return true;\n const { start, end } = item.duration;\n return elapsedTime >= start && elapsedTime <= end;\n })\n .sort((a: any, b: any) => (a.z ?? 0) - (b.z ?? 0));\n\n const overlayStyle: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 10,\n pointerEvents: 'none',\n overflow: 'hidden',\n };\n\n return (\n <div style={overlayStyle}>\n <style>{`\n @keyframes appstorys-fade-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes appstorys-classic-in {\n 0% { opacity: 0; transform: scale(0.7); }\n 70% { opacity: 1; transform: scale(1.05); }\n 100% { opacity: 1; transform: scale(1); }\n }\n @keyframes appstorys-rotate-in {\n from { opacity: 0; transform: rotate(-20deg) scale(0.5); }\n to { opacity: 1; transform: rotate(0deg) scale(1); }\n }\n @keyframes appstorys-bounce-in {\n 0% { opacity: 0; transform: scale(0.3); }\n 50% { opacity: 1; transform: scale(1.1); }\n 70% { opacity: 1; transform: scale(0.95); }\n 100% { opacity: 1; transform: scale(1); }\n }\n `}</style>\n {displayItems.map((item: any) => {\n if (!item || typeof item !== 'object') return null;\n const typeStr = (item.type || '').toLowerCase();\n if (!typeStr) return null; // Ignore invalid element items\n\n return (\n <InteractiveItem\n key={item.id}\n data={item as StickerData}\n onInteraction={onInteraction}\n isEditing={isEditing}\n />\n );\n })}\n </div>\n );\n};","import React, { useState } from 'react';\n\ninterface PlayPauseButtonProps {\n isPaused: boolean;\n onPress: (event: React.MouseEvent<HTMLButtonElement>) => void;\n style?: React.CSSProperties;\n size?: number;\n}\n\nexport const PlayPauseButton: React.FC<PlayPauseButtonProps> = ({ \n isPaused, \n onPress, \n style, \n size = 36 \n}) => {\n const [isHovered, setIsHovered] = useState(false);\n\n return (\n <button\n onClick={onPress}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{\n width: `${size}px`,\n height: `${size}px`,\n background: isHovered ? 'rgba(255, 255, 255, 0.15)' : 'rgba(255, 255, 255, 0.08)',\n border: isHovered ? '1px solid white' : '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '10px',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n padding: 0,\n outline: 'none',\n ...style,\n }}\n >\n {isPaused ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\">\n <path d=\"M5 3.867v16.266c0 .54.58.88 1.05.61l14.133-8.133c.46-.27.46-.94 0-1.21L6.05 3.257C5.58 2.987 5 3.327 5 3.867z\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n )}\n </button>\n );\n};\n\nexport default PlayPauseButton;\n","import React from 'react';\nimport { StorySlideCta } from '../../../types';\nimport { personalizeText } from '../../../core/personalization';\n\ninterface CtaProps {\n cta?: StorySlideCta | null;\n buttonText?: string;\n onPress: (event: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nconst mapAlignment = (alignment?: string) => {\n switch (alignment) {\n case \"left\": return \"flex-start\";\n case \"right\": return \"flex-end\";\n default: return \"center\";\n }\n};\n\nconst Cta: React.FC<CtaProps> = ({ cta, buttonText, onPress }) => {\n if (!cta || !buttonText || buttonText.trim() === '') {\n return null;\n }\n\n return (\n <div\n style={{\n position: \"absolute\",\n bottom: cta?.margin?.bottom,\n left: cta?.margin?.left,\n right: cta?.margin?.right,\n display: 'flex',\n justifyContent: mapAlignment(cta?.container?.alignment),\n width: '100%',\n pointerEvents: 'none',\n boxSizing: 'border-box',\n zIndex: 10,\n }}\n >\n <button\n style={{\n backgroundColor: cta?.container?.backgroundColor || '#F7921C',\n borderColor: cta?.container?.borderColor || 'transparent',\n borderWidth: cta?.container?.borderWidth ?? 0,\n borderStyle: cta?.container?.borderWidth ? 'solid' : 'none',\n borderTopRightRadius: cta?.cornerRadius?.topRight,\n borderTopLeftRadius: cta?.cornerRadius?.topLeft,\n borderBottomRightRadius: cta?.cornerRadius?.bottomRight,\n borderBottomLeftRadius: cta?.cornerRadius?.bottomLeft,\n height: cta?.container?.height || 42,\n width: cta?.container?.ctaFullWidth\n ? \"100%\"\n : cta?.container?.ctaWidth || \"auto\",\n justifyContent: \"center\",\n alignItems: \"center\",\n display: 'flex',\n cursor: 'pointer',\n outline: 'none',\n pointerEvents: 'auto',\n padding: '0 12px',\n boxSizing: 'border-box',\n }}\n onClick={onPress}\n >\n <span\n style={{\n color: cta?.text?.color || '#ffffff',\n fontSize: cta?.text?.fontSize || 14,\n fontFamily: cta?.text?.fontFamily,\n fontWeight: cta?.text?.fontDecoration?.includes(\"bold\") ? \"bold\" : \"normal\",\n fontStyle: cta?.text?.fontDecoration?.includes(\"italic\") ? \"italic\" : \"normal\",\n textDecorationLine: cta?.text?.fontDecoration?.includes(\"underline\") ? \"underline\" : \"none\",\n textAlign: \"center\",\n }}\n >\n {personalizeText(buttonText)}\n </span>\n </button>\n </div>\n );\n};\n\nexport default Cta;","import React from 'react';\n\nexport interface CrossButtonConfig {\n color: {\n cross: string;\n fill: string;\n stroke: string;\n };\n enabled: boolean;\n image: string;\n margin: {\n bottom: number;\n left: number;\n right: number;\n top: number;\n };\n selectedStyle?: string;\n size: number;\n}\n\ninterface CrossButtonProps {\n config?: CrossButtonConfig | null;\n onPress: (event: React.MouseEvent<HTMLButtonElement>) => void;\n style?: React.CSSProperties;\n ignoreSizeAndMargin?: boolean;\n}\n\nconst CrossButton: React.FC<CrossButtonProps> = ({ config, onPress, style, ignoreSizeAndMargin = false }) => {\n if (!config || !config.enabled) {\n return null;\n }\n\n const {\n size: backendSize = 18,\n margin,\n color,\n image,\n selectedStyle,\n } = config;\n\n const size = ignoreSizeAndMargin ? 40 : backendSize;\n\n const containerStyle: React.CSSProperties = {\n marginTop: ignoreSizeAndMargin ? 0 : (margin?.top ?? 0),\n marginBottom: ignoreSizeAndMargin ? 0 : (margin?.bottom ?? 0),\n marginLeft: ignoreSizeAndMargin ? 0 : (margin?.left ?? 0),\n marginRight: ignoreSizeAndMargin ? 0 : (margin?.right ?? 0),\n width: size,\n height: size,\n backgroundColor: color?.fill || 'transparent',\n borderColor: color?.stroke || 'transparent',\n borderWidth: size * 0.05,\n borderRadius: '50%',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 1000000,\n position: 'absolute',\n display: 'flex',\n padding: 0,\n cursor: 'pointer',\n outline: 'none',\n borderStyle: color?.stroke ? 'solid' : 'none',\n ...style,\n };\n\n const renderDefaultIcon = () => {\n const stroke = color?.cross || '#ffffff';\n return (\n <svg viewBox=\"0 0 24 24\" width=\"70%\" height=\"70%\" aria-hidden>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" stroke={stroke} strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" stroke={stroke} strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n </svg>\n );\n };\n\n return (\n <button\n onClick={onPress}\n style={containerStyle}\n title={selectedStyle || ''}\n >\n {image && image.trim() !== '' ? (\n <img\n src={image}\n style={{ width: size, height: size, objectFit: 'contain' }}\n alt=\"close\"\n />\n ) : (\n renderDefaultIcon()\n )}\n </button>\n );\n};\n\nexport default CrossButton;","import React from 'react';\nimport { PipButtonConfig } from '../../Pip/types';\n\ninterface SoundButtonProps {\n config: PipButtonConfig | null;\n onPress: (event: React.MouseEvent<HTMLButtonElement>) => void;\n style?: React.CSSProperties;\n ignoreSizeAndMargin?: boolean;\n enabled?: boolean;\n type: 'mute' | 'unmute';\n}\n\nexport const SoundButton: React.FC<SoundButtonProps> = ({\n config,\n onPress,\n ignoreSizeAndMargin = false,\n enabled,\n style,\n type,\n}) => {\n if (!config || !enabled) {\n return null;\n }\n\n const {\n size: backendSize = 18,\n margin,\n color,\n image,\n selectedStyle,\n } = config;\n\n const size = ignoreSizeAndMargin ? 40 : backendSize;\n\n // Safe margin access with correct defaults\n const marginTop = ignoreSizeAndMargin ? 0 : (margin?.top ?? 0);\n const marginBottom = ignoreSizeAndMargin ? 0 : (margin?.bottom ?? 0);\n const marginLeft = ignoreSizeAndMargin ? 0 : (margin?.left ?? 0);\n const marginRight = ignoreSizeAndMargin ? 0 : (margin?.right ?? 0);\n\n const containerStyle: React.CSSProperties = {\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n width: size,\n height: size,\n backgroundColor: color?.fill || 'transparent',\n borderColor: color?.stroke || 'transparent',\n borderWidth: size * 0.05,\n borderRadius: '50%',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 1000000,\n display: 'flex',\n ...(ignoreSizeAndMargin\n ? {}\n : {\n marginTop: config.margin?.top ?? 0,\n marginRight: config.margin?.right ?? 0,\n marginBottom: config.margin?.bottom ?? 0,\n marginLeft: config.margin?.left ?? 0,\n }),\n ...style,\n };\n\n const renderDefaultIcon = () => {\n const stroke = color?.cross || '#ffffff';\n if (type === 'mute') {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"70%\" height=\"70%\" aria-hidden>\n <polygon points=\"4,10 8,10 13,6 13,18 8,14 4,14\" fill=\"none\" stroke={stroke} strokeWidth=\"2.2\" strokeLinejoin=\"round\" />\n <line x1=\"16\" y1=\"8\" x2=\"21\" y2=\"16\" stroke={stroke} strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n <line x1=\"21\" y1=\"8\" x2=\"16\" y2=\"16\" stroke={stroke} strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n </svg>\n );\n } else {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"70%\" height=\"70%\" aria-hidden>\n <polygon points=\"4,10 8,10 13,6 13,18 8,14 4,14\" fill=\"none\" stroke={stroke} strokeWidth=\"2.2\" strokeLinejoin=\"round\" />\n <path d=\"M16 10 Q18 12 16 14\" fill=\"none\" stroke={stroke} strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n <path d=\"M18 8 Q22 12 18 16\" fill=\"none\" stroke={stroke} strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n };\n\n return (\n <button\n onClick={onPress}\n style={{\n ...containerStyle,\n border: containerStyle.borderColor ? `${containerStyle.borderWidth}px solid ${containerStyle.borderColor as string}` : 'none',\n padding: 0,\n cursor: 'pointer',\n outline: 'none',\n }}\n title={selectedStyle || ''}\n >\n {image && image.trim() !== '' ? (\n <img\n src={image}\n style={{ width: size, height: size, objectFit: 'contain' }}\n alt={type}\n />\n ) : (\n renderDefaultIcon()\n )}\n </button>\n );\n};","import React from 'react';\n\nexport interface ShareButtonConfig {\n color: {\n cross: string;\n fill: string;\n stroke: string;\n };\n enabled: boolean;\n image: string;\n margin: {\n bottom: number;\n left: number;\n right: number;\n top: number;\n };\n selectedStyle?: string;\n size: number;\n}\n\ninterface ShareButtonProps {\n config: ShareButtonConfig | null;\n onPress: (event: React.MouseEvent<HTMLButtonElement>) => void;\n style?: React.CSSProperties;\n ignoreSizeAndMargin?: boolean;\n}\n\nconst ShareButton: React.FC<ShareButtonProps> = ({ config, onPress, ignoreSizeAndMargin = false, style }) => {\n if (!config || config.enabled === false) {\n return null;\n }\n\n const {\n size: backendSize = 18,\n margin,\n color,\n image,\n selectedStyle,\n } = config;\n\n const size = ignoreSizeAndMargin ? 40 : backendSize;\n\n const containerStyle: React.CSSProperties = {\n marginTop: ignoreSizeAndMargin ? 0 : (margin?.top ?? 0),\n marginBottom: ignoreSizeAndMargin ? 0 : (margin?.bottom ?? 0),\n marginLeft: ignoreSizeAndMargin ? 0 : (margin?.left ?? 0),\n marginRight: ignoreSizeAndMargin ? 0 : (margin?.right ?? 0),\n width: size,\n height: size,\n backgroundColor: color?.fill || 'transparent',\n borderColor: color?.stroke || 'transparent',\n borderWidth: size * 0.05,\n borderRadius: '50%',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 1000000,\n position: 'absolute',\n display: 'flex',\n padding: 0,\n cursor: 'pointer',\n outline: 'none',\n borderStyle: color?.stroke ? 'solid' : 'none',\n ...style,\n };\n\n const renderDefaultIcon = () => {\n const stroke = color?.cross || '#ffffff';\n return (\n <svg viewBox=\"0 0 24 24\" width=\"60%\" height=\"60%\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"18\" cy=\"5\" r=\"3\" />\n <circle cx=\"6\" cy=\"12\" r=\"3\" />\n <circle cx=\"18\" cy=\"19\" r=\"3\" />\n <line x1=\"8.59\" y1=\"13.51\" x2=\"15.42\" y2=\"17.49\" />\n <line x1=\"15.41\" y1=\"6.51\" x2=\"8.59\" y2=\"10.49\" />\n </svg>\n );\n };\n\n return (\n <button\n onClick={onPress}\n style={containerStyle}\n title={selectedStyle || ''}\n >\n {image && image.trim() !== '' ? (\n <img\n src={image}\n style={{ width: size, height: size, objectFit: 'contain' }}\n alt=\"share\"\n />\n ) : (\n renderDefaultIcon()\n )}\n </button>\n );\n};\n\nexport default ShareButton;","import React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CampaignWidget } from '../../types';\nimport useCampaigns from '../../hooks/useCampaigns';\nimport useAppStorysStore from '../../core/store';\nimport { resolveCampaignVariant } from '../../core/variantResolver';\nimport trackEvent from '../../core/trackEvent';\nimport { revealCampaignFromLink } from '../../core/campaignHelpers';\n\ninterface WidgetProps {\n position?: string;\n}\n\n/**\n * Simple web widget component mirroring RN Widgets.tsx implementation\n * - Accepts optional position prop\n * - Fetches single campaign via useCampaigns hook\n * - Renders carousel with auto-advance (full) or manual scroll (half)\n * - Portals into host element if position target found\n */\nexport const Widget: React.FC<WidgetProps> = ({ position }) => {\n const hookData = useCampaigns<CampaignWidget>('WID', { position });\n const campaigns = useAppStorysStore((state) => state.campaigns);\n const allCampaigns = useAppStorysStore((state) => state.allCampaigns);\n const currentScreen = useAppStorysStore((state) => state.currentScreen);\n\n const normalizeScreen = (value?: string | null): string => (value || '').trim().toLowerCase();\n\n const data = hookData ?? ((): CampaignWidget | undefined => {\n const screen = normalizeScreen(currentScreen);\n const found = [...(campaigns || []), ...(allCampaigns || [])].find((campaign) => {\n const item = campaign as CampaignWidget;\n if (item.campaign_type !== 'WID') return false;\n if (position && item.position !== position) return false;\n const hasTrigger = Boolean((item as any).trigger_event ?? (item as any).trigger);\n const displayTriggerReady = (item as any).display_trigger !== false && !hasTrigger;\n const matchesScreen = !normalizeScreen(item.screen) || normalizeScreen(item.screen) === screen;\n return displayTriggerReady && matchesScreen;\n }) as CampaignWidget | undefined;\n\n if (!found) return undefined;\n try {\n return resolveCampaignVariant(found) as CampaignWidget;\n } catch {\n return found;\n }\n })();\n const [activeIndex, setActiveIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const autoAdvanceRef = useRef<ReturnType<typeof setInterval> | null>(null);\n // Derived values (must be declared unconditionally so hooks stay stable)\n const details = data?.details || ({} as any);\n const images = (details.widget_images || []) as any[];\n const styling = details.styling || {};\n const widgetType = details.type || 'full';\n const isHalf = widgetType === 'half';\n\n // Track per-image impressions (match RN behavior)\n const trackedImpressionsRef = useRef<string[]>([]);\n\n const trackImpression = (widgetImageId?: string) => {\n if (!data?.id || !widgetImageId) return;\n if (trackedImpressionsRef.current.includes(widgetImageId)) return;\n trackedImpressionsRef.current.push(widgetImageId);\n void trackEvent('viewed', data.id, { widget_image: widgetImageId });\n };\n\n // Auto-advance full widgets every 5 seconds\n useEffect(() => {\n if (widgetType === 'full' && images.length > 1) {\n autoAdvanceRef.current = setInterval(() => {\n setActiveIndex((prev) => {\n const next = prev + 1;\n return next >= images.length ? 0 : next;\n });\n }, 5000);\n\n return () => {\n if (autoAdvanceRef.current) {\n clearInterval(autoAdvanceRef.current as any);\n }\n };\n }\n return undefined;\n }, [widgetType, images.length]);\n\n const handleClick = (imageId: string, link: string) => {\n if (data?.id) void trackEvent('clicked', data.id, { widget_image: imageId });\n if (link) {\n // Try reveal flow for internal campaign links first\n if (!link.startsWith('http')) {\n try {\n const revealed = revealCampaignFromLink(link);\n if (revealed) return;\n } catch (err) {\n console.warn('[Widget] revealCampaignFromLink error', err);\n }\n console.log('[Widget] Internal link:', link);\n return;\n }\n\n window.open(link, '_blank');\n }\n };\n\n const handleScroll = () => {\n if (containerRef.current && isHalf) {\n const { scrollLeft, offsetWidth } = containerRef.current;\n const itemWidth = (offsetWidth / 2) + 12;\n const index = Math.round(scrollLeft / itemWidth);\n setActiveIndex(index);\n }\n };\n\n // For full widgets: track impression when active slide changes\n useEffect(() => {\n if (!data?.id || widgetType !== 'full' || images.length === 0) return;\n const img = images[activeIndex];\n if (img && img.id) trackImpression(img.id);\n }, [activeIndex, data?.id, images, widgetType]);\n\n // For half widgets: track impressions based on visible area (50% coverage)\n useEffect(() => {\n if (!data?.id || !containerRef.current || !isHalf) return;\n\n const el = containerRef.current;\n const checkVisibility = () => {\n const { scrollLeft, offsetWidth } = el;\n const itemWidth = (offsetWidth / 2) + 12;\n images.forEach((img: any, idx: number) => {\n const itemLeft = idx * itemWidth;\n const itemRight = itemLeft + itemWidth;\n const viewLeft = scrollLeft;\n const viewRight = scrollLeft + offsetWidth;\n const overlap = Math.max(0, Math.min(itemRight, viewRight) - Math.max(itemLeft, viewLeft));\n if (overlap / itemWidth >= 0.5) {\n trackImpression(img.id);\n }\n });\n };\n\n // initial check\n checkVisibility();\n // listen for scroll events\n el.addEventListener('scroll', checkVisibility);\n return () => el.removeEventListener('scroll', checkVisibility);\n }, [data?.id, isHalf, images]);\n\n // Container styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: isHalf ? 'nowrap' : 'wrap',\n gap: '12px',\n width: '100%',\n height: isHalf && details.height ? `${details.height}px` : 'auto',\n marginTop: styling.topMargin ? `${styling.topMargin}px` : '0px',\n marginBottom: styling.bottomMargin ? `${styling.bottomMargin}px` : '0px',\n marginLeft: styling.leftMargin ? `${styling.leftMargin}px` : '0px',\n marginRight: styling.rightMargin ? `${styling.rightMargin}px` : '0px',\n boxSizing: 'border-box',\n overflowX: isHalf ? 'auto' : 'hidden',\n overflowY: 'hidden',\n scrollSnapType: isHalf ? 'x mandatory' : undefined,\n msOverflowStyle: 'none',\n scrollbarWidth: 'none',\n };\n\n // Item styles\n const getItemStyle = (index: number): React.CSSProperties => ({\n flex: isHalf ? '0 0 calc(50% - 6px)' : '0 0 100%',\n height: isHalf && details.height ? `${details.height}px` : 'auto',\n cursor: 'pointer',\n position: 'relative',\n overflow: 'hidden',\n borderRadius: styling.borderRadius ? `${styling.borderRadius}px` : '0px',\n borderTopLeftRadius: styling.topLeftRadius ? `${styling.topLeftRadius}px` : undefined,\n borderTopRightRadius: styling.topRightRadius ? `${styling.topRightRadius}px` : undefined,\n borderBottomLeftRadius: styling.bottomLeftRadius ? `${styling.bottomLeftRadius}px` : undefined,\n borderBottomRightRadius: styling.bottomRightRadius ? `${styling.bottomRightRadius}px` : undefined,\n boxShadow: '0 4px 12px rgba(0,0,0,0.08)',\n scrollSnapAlign: 'start',\n });\n\n // Render content\n const content = (\n <div style={{ width: '100%', position: 'relative' }}>\n <style>{`\n .widget-scroll-container::-webkit-scrollbar {\n display: none;\n }\n `}</style>\n\n {/* Carousel/grid container */}\n <div\n ref={containerRef}\n className=\"widget-scroll-container\"\n style={containerStyle}\n onScroll={handleScroll}\n >\n {isHalf\n ? // Half: show all images (2 per row with horizontal scroll)\n images.map((img: any, idx: number) => (\n <div key={img.id} style={getItemStyle(idx)}>\n <img\n src={img.image}\n alt=\"widget\"\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n }}\n onClick={() => handleClick(img.id, img.link)}\n />\n </div>\n ))\n : // Full: show only current slide (auto-advances)\n images.length > 0 && (\n <div key={`slide-${activeIndex}`} style={getItemStyle(0)}>\n <img\n src={images[activeIndex].image}\n alt=\"widget\"\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n }}\n onClick={() => handleClick(images[activeIndex].id, images[activeIndex].link)}\n />\n </div>\n )}\n </div>\n\n {/* Dots indicator for full widgets */}\n {widgetType === 'full' && images.length > 1 && (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n gap: '6px',\n marginTop: '8px',\n width: '100%'\n }}>\n {images.map((_: any, i: number) => (\n <div\n key={i}\n style={{\n width: '6px',\n height: '6px',\n borderRadius: '50%',\n backgroundColor: i === activeIndex ? '#333' : '#ccc',\n transition: 'background-color 0.2s ease',\n }}\n />\n ))}\n </div>\n )}\n </div>\n );\n\n // Try to find host element if position is declared (mirror RN behavior)\n let target: Element | null = null;\n if (data?.position) {\n const key = String(data.position || '').replace(/^widget_/, '');\n const selectors = [\n `[data-as-id=\"${key}\"]`,\n `#${key}`,\n `.${key}`,\n `[data-widget=\"${key}\"]`,\n ];\n\n for (const sel of selectors) {\n try {\n const el = document.querySelector(sel);\n if (el) {\n target = el;\n console.log('[Widget] Portal target found:', sel, 'for campaign', data?.id);\n break;\n }\n } catch (e) {\n // ignore\n }\n }\n\n if (!target) {\n console.log('[Widget] No portal target found for position:', data?.position, 'rendering inline for campaign:', data?.id);\n }\n }\n\n // Portal into host if found, otherwise render inline\n if (target) {\n return createPortal(content, target);\n }\n\n return content;\n};\n\nexport default Widget;\n","import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport useCampaigns from \"../../hooks/useCampaigns\";\nimport trackEvent from \"../../core/trackEvent\";\nimport useAppStorysStore from \"../../core/store\";\nimport { BaseCampaign } from \"../../types\";\n\nimport { CampaignTooltip, TooltipItem, TooltipStyling } from \"../../types\";\n\nconst normalizeScreen = (value?: string | null): string => (value || \"\").trim().toLowerCase();\n\nexport const Tooltip: React.FC = () => {\n const hookData = useCampaigns<CampaignTooltip>(\"TTP\");\n const campaigns = useAppStorysStore((state: any) => state.campaigns);\n const allCampaigns = useAppStorysStore((state: any) => state.allCampaigns);\n const currentScreen = useAppStorysStore((state: any) => state.currentScreen);\n const sdkVisible = useAppStorysStore((state: any) => state.isVisible);\n\n const [currentStep, setCurrentStep] = useState(0);\n const [isDismissed, setIsDismissed] = useState(false);\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null);\n const [tooltipSize, setTooltipSize] = useState({ width: 0, height: 0 });\n\n const tooltipRef = useRef<HTMLDivElement>(null);\n const observerRef = useRef<MutationObserver | null>(null);\n\n const data = useMemo(() => {\n if (hookData) return hookData;\n\n const screen = normalizeScreen(currentScreen);\n const findFromList = (source: any[]) => source.find((campaign) => {\n const item = campaign as BaseCampaign;\n const isTooltip = item.campaign_type === \"TTP\" || item.campaign_type === \"TLTP\";\n const matchesScreen = !normalizeScreen(item.screen) || normalizeScreen(item.screen) === screen;\n const hasTrigger = Boolean((item as any).trigger_event ?? (item as any).trigger);\n const displayTriggerReady = (item as any).display_trigger !== false && !hasTrigger;\n return isTooltip && matchesScreen && displayTriggerReady;\n }) as CampaignTooltip | undefined;\n\n return findFromList(campaigns) ?? findFromList(allCampaigns);\n }, [hookData, campaigns, allCampaigns, currentScreen]);\n\n const tooltips = useMemo(() => {\n if (data?.details?.tooltips && Array.isArray(data.details.tooltips)) {\n return [...data.details.tooltips].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n }\n\n // Support for single step fully flat campaigns\n if (data?.details?.target || data?.details?.titleText) {\n return [{ ...data.details, _id: data.id } as TooltipItem];\n }\n\n return [];\n }, [data]);\n\n const currentTooltip = tooltips[currentStep];\n\n useEffect(() => {\n // Intentionally no-op here: viewed should be emitted when tooltip is actually shown\n // (i.e. when target element is measured and tooltip is displayed). Native emits\n // `viewed` from the overlay show path with `tooltip_id` metadata.\n }, [data]);\n\n // Track `viewed` when the tooltip is actually displayed (matches native flow)\n const viewedTooltipsRef = useRef<Set<string>>(new Set());\n useEffect(() => {\n if (!data || !currentTooltip || !targetRect || isDismissed || !sdkVisible) return;\n\n try {\n const tooltipId = (currentTooltip as any)._id || (currentTooltip as any).id || undefined;\n const key = String(data.id || '') + '::' + String(tooltipId || '');\n if (!viewedTooltipsRef.current.has(key)) {\n viewedTooltipsRef.current.add(key);\n void trackEvent('viewed', data.id, { tooltip_id: tooltipId });\n }\n } catch (e) {\n // ignore tracking errors\n }\n }, [data, currentTooltip, targetRect, isDismissed, sdkVisible]);\n\n // Find target element and get rect\n useEffect(() => {\n if (!currentTooltip?.target || isDismissed) return;\n\n setTargetRect(null);\n\n const findTarget = (scroll = false) => {\n const targetId = currentTooltip.target;\n if (!targetId) return null;\n\n const el = document.getElementById(targetId) ||\n document.querySelector(`[data-id=\"${targetId}\"]`) ||\n document.querySelector(`.${targetId}`);\n\n if (el) {\n setTargetRect(el.getBoundingClientRect());\n if (scroll) {\n el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n }\n return el;\n }\n return null;\n };\n\n // Initial check\n const el = findTarget(true);\n\n // Setup MutationObserver to watch for element appearing\n if (!el) {\n observerRef.current = new MutationObserver(() => {\n const found = findTarget(true);\n if (found) {\n observerRef.current?.disconnect();\n }\n });\n observerRef.current.observe(document.body, { childList: true, subtree: true });\n }\n\n // Resize and scroll listener\n const handleResizeOrScroll = () => {\n const targetEl = findTarget(false);\n if (targetEl) {\n setTargetRect(targetEl.getBoundingClientRect());\n }\n };\n\n window.addEventListener(\"resize\", handleResizeOrScroll);\n window.addEventListener(\"scroll\", handleResizeOrScroll, { passive: true });\n\n return () => {\n observerRef.current?.disconnect();\n window.removeEventListener(\"resize\", handleResizeOrScroll);\n window.removeEventListener(\"scroll\", handleResizeOrScroll);\n };\n }, [currentTooltip, isDismissed, currentStep]);\n\n // Measure tooltip content\n useLayoutEffect(() => {\n if (tooltipRef.current && targetRect) {\n const { width, height } = tooltipRef.current.getBoundingClientRect();\n setTooltipSize({ width, height });\n }\n }, [currentTooltip, targetRect]);\n\n if (!data || !currentTooltip || isDismissed || !sdkVisible || !targetRect) return null;\n\n const styling = currentTooltip.styling || {};\n const appearance = styling.appearance || {};\n const colors = appearance.colors || {};\n const cta = styling.cta || {};\n const ctaContainer = cta.container || {};\n const ctaCorner = cta.cornerRadius || {};\n const ctaText = cta.text || {};\n\n const arrowPos = currentTooltip.arrowPosition || \"left\";\n const arrowStyle = appearance.arrowStyle || { width: 6, height: 12 };\n const arrowSize = arrowStyle.width || 6; // fallback\n\n const absoluteTop = targetRect.top + window.scrollY;\n const absoluteLeft = targetRect.left + window.scrollX;\n\n let tooltipLeft = 0;\n let tooltipTop = 0;\n\n // Offset gap between target and tooltip (excluding arrow itself)\n const offsetGap = 8;\n\n if (arrowPos === \"left\") {\n tooltipLeft = absoluteLeft + targetRect.width + offsetGap;\n tooltipTop = absoluteTop + (targetRect.height / 2) - (tooltipSize.height / 2);\n } else if (arrowPos === \"right\") {\n tooltipLeft = absoluteLeft - tooltipSize.width - offsetGap;\n tooltipTop = absoluteTop + (targetRect.height / 2) - (tooltipSize.height / 2);\n } else if (arrowPos === \"top\") {\n tooltipTop = absoluteTop + targetRect.height + offsetGap;\n tooltipLeft = absoluteLeft + (targetRect.width / 2) - (tooltipSize.width / 2);\n } else if (arrowPos === \"bottom\") {\n tooltipTop = absoluteTop - tooltipSize.height - offsetGap;\n tooltipLeft = absoluteLeft + (targetRect.width / 2) - (tooltipSize.width / 2);\n }\n\n // Bounds checking to prevent cutting off at viewport edge\n const safeMargin = 8;\n const viewportTop = window.scrollY;\n const viewportBottom = window.scrollY + window.innerHeight;\n const viewportLeft = window.scrollX;\n const viewportRight = window.scrollX + window.innerWidth;\n\n if (tooltipSize.height > 0) {\n tooltipTop = Math.max(viewportTop + safeMargin, Math.min(viewportBottom - tooltipSize.height - safeMargin, tooltipTop));\n }\n if (tooltipSize.width > 0) {\n tooltipLeft = Math.max(viewportLeft + safeMargin, Math.min(viewportRight - tooltipSize.width - safeMargin, tooltipLeft));\n }\n\n const handleNext = () => {\n const action = currentTooltip.clickAction || \"nextStep\";\n const targetLink = currentTooltip.link || currentTooltip.url;\n\n // Mirror native: emit `clicked` with tooltip identifier before action\n try {\n const tooltipId = (currentTooltip as any)._id || (currentTooltip as any).id || undefined;\n if (data?.id) {\n void trackEvent('clicked', data.id, { tooltip_id: tooltipId });\n }\n } catch (e) {\n // ignore tracking errors\n }\n\n if (action === \"close\") {\n setIsDismissed(true);\n if (targetLink) window.open(targetLink, \"_blank\");\n return;\n }\n\n if (currentStep < tooltips.length - 1) {\n setCurrentStep((prev: number) => prev + 1);\n } else {\n setIsDismissed(true);\n if (targetLink) {\n window.open(targetLink, \"_blank\");\n }\n }\n };\n\n const handleBackdropClick = () => {\n if (currentTooltip.enableBackdrop) {\n setIsDismissed(true);\n }\n };\n\n return (\n <>\n {currentTooltip.enableBackdrop && (\n <div\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: colors.backdrop || \"rgba(0, 0, 0, 0.7)\",\n opacity: appearance.backdropOpacity ? appearance.backdropOpacity / 100 : 0.7,\n zIndex: 10000,\n }}\n onClick={handleBackdropClick}\n />\n )}\n\n <div\n ref={tooltipRef}\n style={{\n position: \"absolute\",\n top: tooltipTop,\n left: tooltipLeft,\n zIndex: 10001,\n backgroundColor: colors.tooltip || \"#FE6B35\",\n padding: `${appearance.padding?.top ?? 8}px ${appearance.padding?.right ?? 8}px ${appearance.padding?.bottom ?? 8}px ${appearance.padding?.left ?? 8}px`,\n borderRadius: `${appearance.cornerRadius?.topLeft ?? 12}px ${appearance.cornerRadius?.topRight ?? 12}px ${appearance.cornerRadius?.bottomRight ?? 12}px ${appearance.cornerRadius?.bottomLeft ?? 12}px`,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n maxWidth: 300,\n minWidth: 200,\n transition: \"top 0.2s ease, left 0.2s ease\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n width: 0,\n height: 0,\n borderStyle: \"solid\",\n ...(arrowPos === \"left\" && {\n left: -offsetGap,\n top: Math.max(12, Math.min(tooltipSize.height - arrowSize * 2 - 12, absoluteTop + (targetRect.height / 2) - tooltipTop - arrowSize)),\n borderWidth: `${arrowSize}px ${offsetGap}px ${arrowSize}px 0`,\n borderColor: `transparent ${colors.tooltip || \"#FE6B35\"} transparent transparent`,\n }),\n ...(arrowPos === \"right\" && {\n right: -offsetGap,\n top: Math.max(12, Math.min(tooltipSize.height - arrowSize * 2 - 12, absoluteTop + (targetRect.height / 2) - tooltipTop - arrowSize)),\n borderWidth: `${arrowSize}px 0 ${arrowSize}px ${offsetGap}px`,\n borderColor: `transparent transparent transparent ${colors.tooltip || \"#FE6B35\"}`,\n }),\n ...(arrowPos === \"top\" && {\n top: -offsetGap,\n left: Math.max(12, Math.min(tooltipSize.width - arrowSize * 2 - 12, absoluteLeft + (targetRect.width / 2) - tooltipLeft - arrowSize)),\n borderWidth: `0 ${arrowSize}px ${offsetGap}px ${arrowSize}px`,\n borderColor: `transparent transparent ${colors.tooltip || \"#FE6B35\"} transparent`,\n }),\n ...(arrowPos === \"bottom\" && {\n bottom: -offsetGap,\n left: Math.max(12, Math.min(tooltipSize.width - arrowSize * 2 - 12, absoluteLeft + (targetRect.width / 2) - tooltipLeft - arrowSize)),\n borderWidth: `${offsetGap}px ${arrowSize}px 0 ${arrowSize}px`,\n borderColor: `${colors.tooltip || \"#FE6B35\"} transparent transparent transparent`,\n }),\n }}\n />\n\n {currentTooltip.titleText && (\n <div\n style={{\n color: styling.title?.color || \"#ffffff\",\n fontFamily: styling.title?.fontFamily || \"Arial\",\n fontSize: styling.title?.fontSize || 14,\n textAlign: (styling.title?.textAlign as any) || \"center\",\n marginBottom: styling.title?.margin?.bottom ?? 4,\n marginTop: styling.title?.margin?.top ?? 0,\n marginLeft: styling.title?.margin?.left ?? 0,\n marginRight: styling.title?.margin?.right ?? 0,\n fontWeight: styling.title?.fontDecoration?.includes(\"bold\") ? \"bold\" : 600,\n fontStyle: styling.title?.fontDecoration?.includes(\"italic\") ? \"italic\" : \"normal\",\n textDecoration: styling.title?.fontDecoration?.includes(\"underline\") ? \"underline\" : \"none\",\n }}\n >\n {currentTooltip.titleText}\n </div>\n )}\n\n {currentTooltip.subtitleText && (\n <div\n style={{\n color: styling.subTitle?.color || \"#ffffff\",\n fontFamily: styling.subTitle?.fontFamily || \"Arial\",\n fontSize: styling.subTitle?.fontSize || 12,\n textAlign: (styling.subTitle?.textAlign as any) || \"center\",\n marginBottom: styling.subTitle?.margin?.bottom ?? 8,\n marginTop: styling.subTitle?.margin?.top ?? 0,\n marginLeft: styling.subTitle?.margin?.left ?? 0,\n marginRight: styling.subTitle?.margin?.right ?? 0,\n fontWeight: styling.subTitle?.fontDecoration?.includes(\"bold\") ? \"bold\" : \"normal\",\n fontStyle: styling.subTitle?.fontDecoration?.includes(\"italic\") ? \"italic\" : \"normal\",\n textDecoration: styling.subTitle?.fontDecoration?.includes(\"underline\") ? \"underline\" : \"none\",\n }}\n >\n {currentTooltip.subtitleText}\n </div>\n )}\n\n {currentTooltip.ctaText && (\n <div\n style={{\n display: \"flex\",\n justifyContent: ctaContainer.alignment === \"right\" ? \"flex-end\" : ctaContainer.alignment === \"left\" ? \"flex-start\" : \"center\",\n marginTop: 8,\n }}\n >\n <button\n onClick={handleNext}\n style={{\n width: ctaContainer.ctaFullWidth ? \"100%\" : ctaContainer.ctaWidth || \"auto\",\n height: ctaContainer.height || 35,\n background: ctaContainer.backgroundColor || \"#F7921C\",\n color: ctaText.color || \"#ffffff\",\n border: `${ctaContainer.borderWidth || 0}px solid ${ctaContainer.borderColor || \"transparent\"}`,\n borderRadius: `${ctaCorner.topLeft ?? 7}px ${ctaCorner.topRight ?? 7}px ${ctaCorner.bottomRight ?? 7}px ${ctaCorner.bottomLeft ?? 7}px`,\n fontSize: ctaText.fontSize || 14,\n fontFamily: ctaText.fontFamily || \"Arial\",\n fontWeight: ctaText.fontDecoration?.includes(\"bold\") ? \"bold\" : \"normal\",\n fontStyle: ctaText.fontDecoration?.includes(\"italic\") ? \"italic\" : \"normal\",\n textDecoration: ctaText.fontDecoration?.includes(\"underline\") ? \"underline\" : \"none\",\n cursor: \"pointer\",\n padding: \"0 12px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {currentTooltip.ctaText}\n </button>\n </div>\n )}\n </div>\n </>\n );\n};\n\nexport default Tooltip;\n","import React, { useEffect, useState } from 'react';\nimport useCampaigns from '../../hooks/useCampaigns';\nimport useAppStorysStore from '../../core/store';\nimport { resolveCampaignVariant } from '../../core/variantResolver';\nimport trackEvent from '../../core/trackEvent';\nimport { revealCampaignFromLink } from '../../core/campaignHelpers';\nimport { CampaignBottomSheet, BottomSheetElement } from '../../types';\nimport CrossButton from '../common/CommonElements/CrossButton';\n\nexport const BottomSheet: React.FC = () => {\n const hookData = useCampaigns<CampaignBottomSheet>('BTS');\n const campaigns = useAppStorysStore((state: any) => state.campaigns);\n const allCampaigns = useAppStorysStore((state: any) => state.allCampaigns);\n const currentScreen = useAppStorysStore((state: any) => state.currentScreen);\n\n const data = hookData ?? ((): CampaignBottomSheet | undefined => {\n const screen = (currentScreen || '').trim().toLowerCase();\n const found = [...(campaigns || []), ...(allCampaigns || [])].find((campaign: any) => {\n if (!campaign) return false;\n if (campaign.campaign_type !== 'BTS') return false;\n const hasTrigger = Boolean(campaign.trigger_event ?? campaign.trigger);\n // keep display-trigger campaigns available only when not trigger-driven\n const displayTriggerReady = (campaign as any).display_trigger !== false && !hasTrigger;\n if (!displayTriggerReady) return false;\n const cs = (campaign.screen || '').trim().toLowerCase();\n return !cs || cs === screen;\n }) as CampaignBottomSheet | undefined;\n\n if (!found) return undefined;\n try {\n return resolveCampaignVariant(found) as CampaignBottomSheet;\n } catch {\n return found;\n }\n })();\n const sdkVisible = useAppStorysStore((state: any) => state.isVisible);\n const [isDismissed, setIsDismissed] = useState(false);\n\n useEffect(() => {\n if (data) {\n setIsDismissed(false);\n // Match RN: send generic `viewed` event for campaigns\n void trackEvent('viewed', data.id);\n }\n }, [data]);\n\n const removeTrackedEvent = (eventKey: string) => {\n try {\n const state = useAppStorysStore.getState();\n const tracked = state.trackedEvents || [];\n const next = tracked.filter((e: string) => e !== eventKey);\n state.setTrackedEvents(next);\n } catch (e) {\n // ignore\n }\n };\n\n if (!data || isDismissed || !sdkVisible) return null;\n\n const { details } = data;\n const elements = details.elements || [];\n const sortedElements = [...elements].sort((a, b) => (a.order || 0) - (b.order || 0));\n\n // Determine opacity: if it's high (>1), treat as percentage\n let opacity = details.backdropOpacity ?? 0.5;\n if (opacity > 1) {\n opacity = opacity / 100;\n }\n\n const renderElement = (element: BottomSheetElement) => {\n switch (element.type) {\n case 'image': {\n const imgStyle: React.CSSProperties = {\n width: '100%',\n display: 'block',\n objectFit: 'contain',\n backgroundColor: element.imageBackgroundColor || 'transparent',\n paddingBottom: element.paddingBottom ?? 0,\n paddingLeft: element.paddingLeft ?? 0,\n paddingRight: element.paddingRight ?? 0,\n paddingTop: element.paddingTop ?? 0,\n cursor: element.imageLink ? 'pointer' : 'default',\n };\n return (\n <div key={element.id} style={{ textAlign: element.alignment || 'left', width: '100%' }}>\n {element.url && (\n <img \n src={element.url} \n alt=\"\" \n style={imgStyle} \n onClick={() => {\n if (!element.imageLink) return;\n if (data?.id) void trackEvent('clicked', data.id);\n try {\n const link = String(element.imageLink || '').trim();\n if (link && !link.startsWith('http')) {\n const revealed = revealCampaignFromLink(link);\n if (revealed) return;\n }\n } catch (err) {\n console.warn('revealCampaignFromLink error', err);\n }\n\n try {\n window.open(element.imageLink, '_blank');\n } catch (err) {\n // ignore\n }\n }}\n />\n )}\n </div>\n );\n }\n\n case 'cta': {\n const ctaData = element.cta || {};\n const container = ctaData.container || {};\n const cornerRadius = ctaData.cornerRadius || {};\n const margin = ctaData.margin || {};\n const textStyle = ctaData.text || {};\n\n return (\n <div \n key={element.id}\n style={{\n display: 'flex',\n justifyContent: container.alignment === 'center' ? 'center' : container.alignment === 'right' ? 'flex-end' : 'flex-start',\n width: '100%',\n marginTop: margin.top ?? 0,\n marginBottom: margin.bottom ?? 0,\n marginLeft: margin.left ?? 0,\n marginRight: margin.right ?? 0,\n }}\n >\n <button\n style={{\n width: container.ctaFullWidth ? '100%' : container.ctaWidth || 'auto',\n height: container.height || 45,\n backgroundColor: container.ctaBoxColor || container.backgroundColor || '#FE6B35',\n color: textStyle.color || '#ffffff',\n border: `${container.borderWidth || 0}px solid ${container.borderColor || 'transparent'}`,\n borderRadius: `${cornerRadius.topLeft ?? 12}px ${cornerRadius.topRight ?? 12}px ${cornerRadius.bottomRight ?? 12}px ${cornerRadius.bottomLeft ?? 12}px`,\n fontSize: textStyle.fontSize || 14,\n fontFamily: textStyle.fontFamily || 'Arial',\n fontWeight: textStyle.fontDecoration?.includes('bold') ? 'bold' : 'normal',\n fontStyle: textStyle.fontDecoration?.includes('italic') ? 'italic' : 'normal',\n textDecoration: textStyle.fontDecoration?.includes('underline') ? 'underline' : 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 16px',\n }}\n onClick={() => {\n const link = element.ctaLink || element.url;\n if (!link) return;\n if (data?.id) void trackEvent('clicked', data.id);\n try {\n const l = String(link || '').trim();\n if (l && !l.startsWith('http')) {\n const revealed = revealCampaignFromLink(l);\n if (revealed) return;\n }\n } catch (err) {\n console.warn('revealCampaignFromLink error', err);\n }\n\n try {\n window.open(link, '_blank');\n } catch (err) {\n // ignore\n }\n }}\n >\n {element.ctaText || 'Button'}\n </button>\n </div>\n );\n }\n\n case 'body': {\n const titleStyle = element.titleFontStyle || {};\n const descStyle = element.descriptionFontStyle || {};\n \n return (\n <div \n key={element.id}\n style={{\n width: '100%',\n backgroundColor: element.bodyBackgroundColor || 'transparent',\n marginTop: element.marginTop ?? 0,\n marginBottom: element.marginBottom ?? 20,\n marginLeft: element.marginLeft ?? 4,\n marginRight: element.marginRight ?? 4,\n }}\n >\n {element.titleText && (\n <div style={{\n color: titleStyle.colour || '#000000',\n fontSize: titleStyle.fontSize ? `${titleStyle.fontSize}px` : element.titleFontSize ? `${element.titleFontSize}px` : '16px',\n fontFamily: titleStyle.fontFamily || 'inherit',\n textAlign: titleStyle.alignment || 'left',\n lineHeight: element.titleLineHeight || 1.2,\n fontWeight: titleStyle.decoration?.includes('bold') ? 'bold' : '600',\n fontStyle: titleStyle.decoration?.includes('italic') ? 'italic' : 'normal',\n textDecoration: titleStyle.decoration?.includes('underline') ? 'underline' : 'none',\n marginBottom: element.spacingBetweenTitleDesc ?? 4,\n }}>\n {element.titleText}\n </div>\n )}\n \n {element.descriptionText && (\n <div style={{\n color: descStyle.colour || '#000000',\n fontSize: descStyle.fontSize ? `${descStyle.fontSize}px` : element.descriptionFontSize ? `${element.descriptionFontSize}px` : '14px',\n fontFamily: descStyle.fontFamily || 'inherit',\n textAlign: descStyle.alignment || 'left',\n lineHeight: element.descriptionLineHeight || 1.5,\n fontWeight: descStyle.decoration?.includes('bold') ? 'bold' : 'normal',\n fontStyle: descStyle.decoration?.includes('italic') ? 'italic' : 'normal',\n textDecoration: descStyle.decoration?.includes('underline') ? 'underline' : 'none',\n }}>\n {element.descriptionText}\n </div>\n )}\n </div>\n );\n }\n\n default:\n return null;\n }\n };\n\n return (\n <>\n <div \n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: details.backdropColor || 'rgba(0,0,0,0.5)',\n opacity: opacity,\n zIndex: 999998,\n transition: 'opacity 0.3s ease',\n }}\n onClick={() => {\n if (data?.id) removeTrackedEvent(`viaAppStorys${data.id}`);\n setIsDismissed(true);\n }}\n />\n <div \n style={{\n position: 'fixed',\n bottom: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n width: '100%',\n maxWidth: '500px', // Responsive safety\n backgroundColor: details.backgroundColor || '#FFFFFF',\n borderTopLeftRadius: `${details.cornerRadius?.topLeft ?? 16}px`,\n borderTopRightRadius: `${details.cornerRadius?.topRight ?? 16}px`,\n borderBottomLeftRadius: `${details.cornerRadius?.bottomLeft ?? 0}px`,\n borderBottomRightRadius: `${details.cornerRadius?.bottomRight ?? 0}px`,\n zIndex: 999999,\n padding: '24px 16px',\n boxShadow: '0 -4px 16px rgba(0,0,0,0.15)',\n maxHeight: '85vh',\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n transition: 'transform 0.3s ease-out',\n }}\n >\n <div style={{\n width: '40px',\n height: '5px',\n backgroundColor: '#E0E0E0',\n borderRadius: '2.5px',\n marginBottom: '16px',\n cursor: 'pointer'\n }} onClick={() => setIsDismissed(true)} />\n\n {details.crossButton?.enabled && (\n <CrossButton \n config={details.crossButton}\n onPress={() => {\n if (data?.id) removeTrackedEvent(`viaAppStorys${data.id}`);\n setIsDismissed(true);\n }}\n style={{\n top: details.crossButton?.margin?.top ?? 12,\n right: details.crossButton?.margin?.right ?? 12,\n }}\n />\n )}\n \n <div style={{ width: '100%', display: 'flex', flexDirection: 'column', gap: '12px' }}>\n {sortedElements.map(renderElement)}\n </div>\n </div>\n </>\n );\n};\n\nexport default BottomSheet;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport useCampaigns from '../../hooks/useCampaigns';\nimport useAppStorysStore from '../../core/store';\nimport { resolveCampaignVariant } from '../../core/variantResolver';\nimport trackEvent from '../../core/trackEvent';\nimport { revealCampaignFromLink } from '../../core/campaignHelpers';\nimport CrossButton from '../common/CommonElements/CrossButton';\nimport { CampaignCsat, CsatCampaignDetails, CsatSpacing, CsatTextStyle } from '../../types';\n\nconst FIVE_STAR_MAX = 5;\nconst LOW_RATING_CUTOFF = 3;\n\nfunction asSpacingValue(value?: number): string | undefined {\n if (value == null) return undefined;\n return `${value}px`;\n}\n\nfunction spacingToStyle(spacing?: CsatSpacing): React.CSSProperties {\n return {\n marginTop: asSpacingValue(spacing?.top),\n marginRight: asSpacingValue(spacing?.right),\n marginBottom: asSpacingValue(spacing?.bottom),\n marginLeft: asSpacingValue(spacing?.left),\n };\n}\n\nfunction applyFontFamily(fontFamily?: string): string | undefined {\n if (!fontFamily) return undefined;\n if (fontFamily.startsWith('http://') || fontFamily.startsWith('https://')) return undefined;\n return fontFamily;\n}\n\nfunction textStyleToCss(textStyle?: CsatTextStyle): React.CSSProperties {\n if (!textStyle) return {};\n\n return {\n color: textStyle.color,\n fontSize: textStyle.fontSize,\n fontFamily: applyFontFamily(textStyle.fontFamily),\n textAlign: textStyle.textAlign as React.CSSProperties['textAlign'],\n fontWeight: textStyle.fontDecoration?.includes('bold') ? 'bold' : undefined,\n fontStyle: textStyle.fontDecoration?.includes('italic') ? 'italic' : undefined,\n textDecoration: textStyle.fontDecoration?.includes('underline') ? 'underline' : undefined,\n };\n}\n\nfunction getCornerRadius(cornerRadius?: { topLeft?: number; topRight?: number; bottomRight?: number; bottomLeft?: number }): string {\n return `${cornerRadius?.topLeft ?? 8}px ${cornerRadius?.topRight ?? 8}px ${cornerRadius?.bottomRight ?? 8}px ${cornerRadius?.bottomLeft ?? 8}px`;\n}\n\nfunction getAlignment(alignment?: string): React.CSSProperties['justifyContent'] {\n if (alignment === 'right') return 'flex-end';\n if (alignment === 'left') return 'flex-start';\n return 'center';\n}\n\nfunction getRatingType(details: CsatCampaignDetails): 'star' | 'number' | 'emoji' {\n const ratingType = details.styling?.rating?.ratingType;\n if (ratingType === 'number' || ratingType === 'emoji' || ratingType === 'star') return ratingType;\n return 'star';\n}\n\nfunction getEmojiChoices(details: CsatCampaignDetails): string[] {\n const configured = details.styling?.rating?.emoji as unknown;\n\n if (Array.isArray(configured)) {\n return configured.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n }\n\n if (configured && typeof configured === 'object') {\n const values = Object.values(configured as Record<string, unknown>)\n .filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n if (values.length > 0) return values;\n }\n\n if (typeof configured === 'string' && configured.trim()) {\n if (configured.includes(',')) {\n const split = configured.split(',').map((item) => item.trim()).filter(Boolean);\n if (split.length > 0) return split;\n }\n return [configured];\n }\n\n return ['😠', '😕', '😐', '🙂', '😍'];\n}\n\nfunction getNumberChoices(details: CsatCampaignDetails): number[] {\n // Force a 5-point numeric scale (1–5) regardless of backend config.\n // This matches the requested UI and avoids rendering 0–10 style scales.\n return Array.from({ length: 5 }, (_, index) => index + 1);\n}\n\nfunction asNonNegativeNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value >= 0) return value;\n if (typeof value === 'string' && value.trim().length > 0) {\n const parsed = Number(value);\n if (Number.isFinite(parsed) && parsed >= 0) return parsed;\n }\n return undefined;\n}\n\nfunction getNumberRatingGap(details: CsatCampaignDetails): number {\n const rating = (details.styling?.rating as Record<string, unknown> | undefined) || undefined;\n const directCandidates = [\n rating?.['numberSpacing'],\n rating?.['numberGap'],\n rating?.['number_spacing'],\n rating?.['number_gap'],\n rating?.['spacingBetweenNumbers'],\n rating?.['spaceBetweenNumbers'],\n rating?.['numberOptionsSpacing'],\n ];\n\n for (const candidate of directCandidates) {\n const maybe = asNonNegativeNumber(candidate);\n if (maybe != null) return maybe;\n }\n\n const numberConfig = rating?.['number'];\n if (numberConfig && typeof numberConfig === 'object') {\n const obj = numberConfig as Record<string, unknown>;\n const nestedCandidates = [obj['spacing'], obj['gap'], obj['optionsSpacing'], obj['numberSpacing'], obj['numberGap']];\n for (const candidate of nestedCandidates) {\n const maybe = asNonNegativeNumber(candidate);\n if (maybe != null) return maybe;\n }\n }\n\n return 8;\n}\n\nfunction getRatingMax(details: CsatCampaignDetails): number {\n const ratingType = getRatingType(details);\n\n if (ratingType === 'emoji') return Math.max(1, getEmojiChoices(details).length);\n if (ratingType === 'number') {\n const choices = getNumberChoices(details);\n return Math.max(1, choices.length);\n }\n\n return FIVE_STAR_MAX;\n}\n\nconst StarIcon: React.FC<{ fill: string; stroke: string }> = ({ fill, stroke }) => (\n <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" aria-hidden>\n <path\n d=\"M12 2.25l2.91 5.89 6.5.95-4.7 4.58 1.11 6.46L12 17.03 6.18 20.13l1.11-6.46-4.7-4.58 6.5-.95L12 2.25z\"\n fill={fill}\n stroke={stroke}\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\ninterface FormContentProps {\n details: CsatCampaignDetails;\n appearance?: { backgroundColor?: string };\n rating: number;\n selectedOptions: string[];\n comments: string;\n isHighRating: boolean;\n feedbackOptions: string[];\n onRate: (value: number) => void;\n onToggleOption: (option: string) => void;\n onCommentChange: (value: string) => void;\n onInlineSubmit: () => void;\n canSubmit: boolean;\n}\n\nconst CsatFormContent: React.FC<FormContentProps> = ({\n details,\n appearance,\n rating,\n selectedOptions,\n comments,\n isHighRating,\n feedbackOptions,\n onRate,\n onToggleOption,\n onCommentChange,\n onInlineSubmit,\n canSubmit,\n}) => {\n const styling = details.styling || {};\n const feedbackPage = styling.feedbackPage || {};\n const ratingStyle = styling.rating || {};\n const initialFeedback = styling.initialFeedback || {};\n const submitCta = feedbackPage.submitButton?.cta;\n const ratingType = getRatingType(details);\n const numberChoices = ratingType === 'number' ? getNumberChoices(details) : [];\n const emojiChoices = ratingType === 'emoji' ? getEmojiChoices(details) : [];\n\n const numberGap = ratingType === 'number' ? getNumberRatingGap(details) : 8;\n\n const selectedStarConfig = isHighRating ? ratingStyle.star?.high : ratingStyle.star?.low;\n\n return (\n <>\n <div style={spacingToStyle(initialFeedback.title?.margin)}>\n <div\n style={{\n ...(textStyleToCss(initialFeedback.title?.textStyle)),\n color: initialFeedback.title?.textStyle?.color || '#101828',\n fontSize: initialFeedback.title?.textStyle?.fontSize || 20,\n lineHeight: 1.3,\n }}\n >\n {details.title || 'How was your experience?'}\n </div>\n </div>\n\n <div style={spacingToStyle(initialFeedback.subtitle?.margin)}>\n <div\n style={{\n ...(textStyleToCss(initialFeedback.subtitle?.textStyle)),\n color: initialFeedback.subtitle?.textStyle?.color || '#4b5563',\n fontSize: initialFeedback.subtitle?.textStyle?.fontSize || 14,\n lineHeight: 1.4,\n }}\n >\n {details.description_text || 'Your feedback helps us improve your experience.'}\n </div>\n </div>\n\n <div style={{ marginTop: 8, display: 'flex', justifyContent: 'center', gap: ratingType === 'number' ? numberGap : 8, flexWrap: 'wrap' }}>\n {ratingType === 'star' && Array.from({ length: FIVE_STAR_MAX }, (_, index) => {\n const value = index + 1;\n const isSelected = value <= rating;\n const starContainerStyle = isSelected\n ? selectedStarConfig?.stylingContainer\n : ratingStyle.star?.unselected?.stylingContainer;\n const starStyle = isSelected\n ? selectedStarConfig?.stylingStar\n : ratingStyle.star?.unselected?.stylingStar;\n\n return (\n <button\n key={value}\n onClick={() => onRate(value)}\n style={{\n border: `${starContainerStyle?.borderWidth ?? 1}px solid ${starContainerStyle?.border || '#d1d5db'}`,\n background: starContainerStyle?.background || '#ffffff',\n borderRadius: 10,\n width: 44,\n height: 44,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n padding: 0,\n }}\n aria-label={`Rate ${value} out of ${FIVE_STAR_MAX}`}\n >\n <StarIcon\n fill={starStyle?.background || (isSelected ? '#f59e0b' : '#e5e7eb')}\n stroke={starStyle?.border || (isSelected ? '#d97706' : '#9ca3af')}\n />\n </button>\n );\n })}\n\n {ratingType === 'number' && numberChoices.map((value, index) => {\n const selected = value === rating;\n return (\n <button\n key={`${value}-${index}`}\n onClick={() => onRate(value)}\n style={{\n border: `1px solid ${selected ? '#1d4ed8' : '#d1d5db'}`,\n background: selected ? '#dbeafe' : '#ffffff',\n color: selected ? '#1d4ed8' : '#111827',\n borderRadius: 8,\n minWidth: 36,\n height: 36,\n padding: '0 10px',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n fontWeight: 600,\n }}\n aria-label={`Rate ${value}`}\n >\n {value}\n </button>\n );\n })}\n\n {ratingType === 'emoji' && emojiChoices.map((emoji, index) => {\n const value = index + 1;\n const selected = value === rating;\n return (\n <button\n key={`${emoji}-${index}`}\n onClick={() => onRate(value)}\n style={{\n border: `1px solid ${selected ? '#1d4ed8' : '#d1d5db'}`,\n background: selected ? '#dbeafe' : '#ffffff',\n borderRadius: '999px',\n width: 44,\n height: 44,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n fontSize: 22,\n }}\n aria-label={`Emoji rating ${index + 1}`}\n >\n {emoji}\n </button>\n );\n })}\n </div>\n\n {rating > 0 && (\n <div style={{ marginTop: 6, textAlign: 'center', color: '#374151', fontSize: 14 }}>\n {isHighRating ? (details.highStarText || ratingStyle.highRatingSubtitle) : (details.lowStarText || ratingStyle.lowRatingSubtitle)}\n </div>\n )}\n\n {rating > 0 && rating <= LOW_RATING_CUTOFF && (\n <>\n {feedbackOptions.length > 0 && (\n <div\n style={{\n ...spacingToStyle(feedbackPage.options?.margin),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n gap: feedbackPage.options?.optionsSpacing ?? 8,\n width: '100%',\n }}\n >\n {feedbackOptions.map((option) => {\n const isActive = selectedOptions.includes(option);\n const styleSource = isActive ? feedbackPage.options?.selectedOptions : feedbackPage.options?.nonSelectedOptions;\n\n return (\n <button\n key={option}\n onClick={() => onToggleOption(option)}\n style={{\n border: `${styleSource?.borderWidth ?? 1}px solid ${styleSource?.colors?.border || '#d1d5db'}`,\n background: styleSource?.colors?.background || '#f9fafb',\n color: styleSource?.colors?.text || '#111827',\n width: '100%',\n height: feedbackPage.options?.optionsHeight || 38,\n borderRadius: getCornerRadius(feedbackPage.options?.cornerRadius),\n padding: '0 14px',\n cursor: 'pointer',\n textAlign: 'center',\n ...(textStyleToCss(styleSource?.textStyle)),\n }}\n >\n {option}\n </button>\n );\n })}\n </div>\n )}\n\n <textarea\n value={comments}\n onChange={(event) => onCommentChange(event.target.value)}\n placeholder={feedbackPage.additionalComments?.placeholder || 'Tell us what we can improve'}\n style={{\n width: '100%',\n boxSizing: 'border-box',\n minHeight: 56,\n height: 56,\n maxHeight: 64,\n marginTop: 8,\n resize: 'none',\n overflowY: 'auto',\n border: `${feedbackPage.additionalComments?.borderWidth ?? 1}px solid ${feedbackPage.additionalComments?.colors?.border || '#d1d5db'}`,\n background: feedbackPage.additionalComments?.colors?.background || '#ffffff',\n color: feedbackPage.additionalComments?.colors?.text || '#111827',\n borderRadius: 8,\n padding: '12px',\n ...(textStyleToCss(feedbackPage.additionalComments?.textStyle)),\n }}\n />\n\n <div\n style={{\n position: 'sticky',\n bottom: 0,\n marginTop: 8,\n paddingTop: 6,\n paddingBottom: 6,\n background: appearance?.backgroundColor || '#2f6ef5',\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n <button\n onClick={() => onInlineSubmit()}\n disabled={!canSubmit}\n style={{\n width: Math.max(140, Math.min(asNonNegativeNumber(submitCta?.container?.ctaWidth) ?? 180, 220)),\n maxWidth: '100%',\n minHeight: 30,\n height: Math.max(30, Math.min(Number(submitCta?.container?.height) || 34, 34)),\n border: `${submitCta?.container?.borderWidth ?? 1}px solid ${submitCta?.container?.borderColor || '#ff7a00'}`,\n background: submitCta?.container?.backgroundColor || '#ff2bc2',\n color: submitCta?.text?.color || '#ffffff',\n borderRadius: getCornerRadius(submitCta?.cornerRadius),\n fontFamily: applyFontFamily(submitCta?.text?.fontFamily),\n fontSize: Math.min(Number(submitCta?.text?.fontSize) || 14, 14),\n fontWeight: submitCta?.text?.fontDecoration?.includes('bold') ? 'bold' : 600,\n cursor: canSubmit ? 'pointer' : 'not-allowed',\n opacity: canSubmit ? 1 : 0.65,\n padding: '0 12px',\n }}\n >\n {feedbackPage.submitButton?.text || 'Submit'}\n </button>\n </div>\n </>\n )}\n\n </>\n );\n};\n\ninterface ThankYouContentProps {\n details: CsatCampaignDetails;\n isHighRating: boolean;\n onDone: () => void;\n}\n\nconst CsatThankYouContent: React.FC<ThankYouContentProps> = ({ details, isHighRating, onDone }) => {\n const styling = details.styling || {};\n const thankyouPage = styling.thankyouPage || {};\n const ratingStyle = styling.rating || {};\n const doneAlign = getAlignment(thankyouPage.doneButton?.cta?.container?.alignment);\n\n return (\n <>\n {details.thankyouImage && (\n <div style={{ display: 'flex', justifyContent: 'center', marginTop: 6 }}>\n <img\n src={details.thankyouImage}\n alt=\"thank you\"\n style={{\n width: thankyouPage.imageStyle?.width || 80,\n height: thankyouPage.imageStyle?.height || 80,\n objectFit: 'cover',\n borderRadius: 8,\n }}\n />\n </div>\n )}\n\n <div style={{ ...spacingToStyle(thankyouPage.title?.margin), textAlign: 'center' }}>\n <div\n style={{\n ...(textStyleToCss(thankyouPage.title?.textStyle)),\n color: thankyouPage.title?.textStyle?.color || '#111827',\n fontSize: thankyouPage.title?.textStyle?.fontSize || 20,\n fontWeight: thankyouPage.title?.textStyle?.fontDecoration?.includes('bold') ? 'bold' : 600,\n }}\n >\n {details.thankyouText || (isHighRating ? ratingStyle.highRatingTitle : ratingStyle.lowRatingTitle) || 'Thank you for your feedback'}\n </div>\n </div>\n\n <div style={{ ...spacingToStyle(thankyouPage.subtitle?.margin), textAlign: 'center' }}>\n <div\n style={{\n ...(textStyleToCss(thankyouPage.subtitle?.textStyle)),\n color: thankyouPage.subtitle?.textStyle?.color || '#4b5563',\n fontSize: thankyouPage.subtitle?.textStyle?.fontSize || 14,\n }}\n >\n {details.thankyouDescription || (isHighRating ? ratingStyle.highRatingSubtitle : ratingStyle.lowRatingSubtitle) || 'We appreciate your time.'}\n </div>\n </div>\n\n <div\n style={{\n marginTop: thankyouPage.doneButton?.cta?.margin?.top ?? 14,\n marginBottom: thankyouPage.doneButton?.cta?.margin?.bottom ?? 0,\n marginLeft: thankyouPage.doneButton?.cta?.margin?.left ?? 0,\n marginRight: thankyouPage.doneButton?.cta?.margin?.right ?? 0,\n display: 'flex',\n justifyContent: doneAlign,\n }}\n >\n <button\n onClick={onDone}\n style={{\n width: thankyouPage.doneButton?.cta?.container?.ctaFullWidth ? '100%' : thankyouPage.doneButton?.cta?.container?.ctaWidth || 'auto',\n height: thankyouPage.doneButton?.cta?.container?.height || 45,\n border: `${thankyouPage.doneButton?.cta?.container?.borderWidth ?? 0}px solid ${thankyouPage.doneButton?.cta?.container?.borderColor || 'transparent'}`,\n background: thankyouPage.doneButton?.cta?.container?.backgroundColor || '#111827',\n color: thankyouPage.doneButton?.cta?.text?.color || '#ffffff',\n borderRadius: getCornerRadius(thankyouPage.doneButton?.cta?.cornerRadius),\n fontFamily: applyFontFamily(thankyouPage.doneButton?.cta?.text?.fontFamily),\n fontSize: thankyouPage.doneButton?.cta?.text?.fontSize || 16,\n fontWeight: thankyouPage.doneButton?.cta?.text?.fontDecoration?.includes('bold') ? 'bold' : 500,\n cursor: 'pointer',\n padding: '0 16px',\n }}\n >\n {thankyouPage.doneButton?.text || (isHighRating ? 'Rate Now' : 'Done')}\n </button>\n </div>\n </>\n );\n};\n\nexport const Csat: React.FC = () => {\n const hookData = useCampaigns<CampaignCsat>('CSAT');\n const sdkVisible = useAppStorysStore((state: any) => state.isVisible);\n const campaigns = useAppStorysStore((state: any) => state.campaigns);\n const allCampaigns = useAppStorysStore((state: any) => state.allCampaigns);\n const currentScreen = useAppStorysStore((state: any) => state.currentScreen);\n\n const data = hookData ?? ((): CampaignCsat | undefined => {\n const screen = (currentScreen || '').trim().toLowerCase();\n const found = [...(campaigns || []), ...(allCampaigns || [])].find((campaign: any) => {\n if (!campaign) return false;\n if (campaign.campaign_type !== 'CSAT') return false;\n const hasTrigger = Boolean(campaign.trigger_event ?? campaign.trigger);\n const displayTriggerReady = (campaign as any).display_trigger !== false && !hasTrigger;\n if (!displayTriggerReady) return false;\n const cs = (campaign.screen || '').trim().toLowerCase();\n return !cs || cs === screen;\n }) as CampaignCsat | undefined;\n\n if (!found) return undefined;\n try {\n return resolveCampaignVariant(found) as CampaignCsat;\n } catch {\n return found;\n }\n })();\n\n const [isDismissed, setIsDismissed] = useState(false);\n const [canDisplay, setCanDisplay] = useState(false);\n const [rating, setRating] = useState(0);\n const [selectedOptions, setSelectedOptions] = useState<string[]>([]);\n const [comments, setComments] = useState('');\n const [isSubmitted, setIsSubmitted] = useState(false);\n\n useEffect(() => {\n if (!data) return;\n setIsDismissed(false);\n setCanDisplay(false);\n setRating(0);\n setSelectedOptions([]);\n setComments('');\n setIsSubmitted(false);\n\n const delay = data.details?.styling?.appearance?.displayDelay ?? 0;\n const timeoutId = globalThis.setTimeout(() => {\n setCanDisplay(true);\n void trackEvent('viewed', data.id);\n }, Math.max(0, delay) * 1000);\n\n return () => globalThis.clearTimeout(timeoutId);\n }, [data]);\n\n const feedbackOptions = useMemo(() => {\n const source = data?.details?.feedback_option || {};\n return Object.keys(source)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => source[key])\n .filter(Boolean);\n }, [data]);\n\n if (!data || !sdkVisible || isDismissed || !canDisplay) return null;\n\n const details = data.details;\n const styling = details.styling || {};\n const appearance = styling.appearance || {};\n\n const isHighRating = rating > LOW_RATING_CUTOFF;\n\n const configuredWidth = Number(details.width ?? 80);\n const compactCardWidth = Math.max(660, Math.min(1080, configuredWidth * 10));\n\n const handleToggleOption = (option: string) => {\n setSelectedOptions((prev) => (prev.includes(option) ? prev.filter((item) => item !== option) : [...prev, option]));\n };\n\n const handleSubmit = async (override?: { rating?: number; options?: string[]; comments?: string }) => {\n const ratingValue = override?.rating ?? rating;\n if (ratingValue < 1) return;\n setIsSubmitted(true);\n\n const campaignId = details.id || data.id;\n const selectedOption = (override?.options ?? selectedOptions)[0] || \"\";\n const additionalComments = override?.comments ?? comments ?? \"\";\n\n void trackEvent('csat captured', campaignId, {\n starCount: ratingValue,\n selectedOption: selectedOption,\n additionalComments: additionalComments,\n });\n };\n\n const handleRate = (value: number) => {\n setRating(value);\n if (value > LOW_RATING_CUTOFF) {\n setSelectedOptions([]);\n setComments('');\n // Mirror RN: show thanks after 1s and send `csat captured` with RN keys\n const campaignId = details.id || data?.id;\n setTimeout(() => {\n setIsSubmitted(true);\n try {\n void trackEvent('csat captured', campaignId, {\n starCount: value,\n selectedOption: \"\",\n additionalComments: \"\",\n });\n } catch (e) {\n console.warn('Error sending csat captured', e);\n }\n }, 1000);\n }\n };\n\n const handleDone = () => {\n if (isHighRating && details.link) {\n const campaignId = (data && data.id) || undefined;\n try {\n if (campaignId) void trackEvent('clicked', campaignId);\n } catch (err) {\n // ignore track errors\n }\n\n try {\n const link = String(details.link || '').trim();\n if (link && !link.startsWith('http')) {\n const revealed = revealCampaignFromLink(link);\n if (revealed) {\n setIsDismissed(true);\n return;\n }\n }\n } catch (err) {\n console.warn('revealCampaignFromLink error', err);\n }\n\n try {\n globalThis.open(details.link, '_blank');\n } catch (err) {\n // ignore\n }\n }\n\n setIsDismissed(true);\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 999999,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'flex-end',\n paddingLeft: '10px',\n paddingRight: '10px',\n paddingBottom: '10px',\n pointerEvents: 'none',\n }}\n >\n <div\n style={{\n position: 'relative',\n width: `min(${compactCardWidth}px, 96vw)`,\n maxWidth: '96vw',\n minWidth: '320px',\n minHeight: '220px',\n maxHeight: '55vh',\n overflow: 'hidden',\n backgroundColor: appearance.backgroundColor || '#2f6ef5',\n borderRadius: `${appearance.borderRadius ?? 12}px`,\n boxSizing: 'border-box',\n paddingTop: '8px',\n paddingRight: asSpacingValue(appearance.padding?.right) || '12px',\n paddingBottom: '4px',\n paddingLeft: asSpacingValue(appearance.padding?.left) || '12px',\n marginTop: asSpacingValue(appearance.margin?.top),\n marginRight: asSpacingValue(appearance.margin?.right),\n marginBottom: asSpacingValue(appearance.margin?.bottom),\n marginLeft: asSpacingValue(appearance.margin?.left),\n pointerEvents: 'auto',\n boxShadow: '0 14px 36px rgba(0, 0, 0, 0.25)',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <style>\n {`\n .appstorys-csat-scroll {\n scrollbar-width: none; /* Firefox */\n -ms-overflow-style: none; /* IE/Edge */\n }\n .appstorys-csat-scroll::-webkit-scrollbar {\n width: 0;\n height: 0;\n display: none; /* Chrome/Safari */\n }\n `}\n </style>\n\n {styling.crossButton?.enabled && (\n <CrossButton\n config={styling.crossButton}\n onPress={() => setIsDismissed(true)}\n style={{\n top: styling.crossButton?.margin?.top ?? 10,\n right: styling.crossButton?.margin?.right ?? 10,\n }}\n />\n )}\n\n <div\n className=\"appstorys-csat-scroll\"\n style={{\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n paddingBottom: 4,\n }}\n >\n {isSubmitted ? (\n <CsatThankYouContent\n details={details}\n isHighRating={isHighRating}\n onDone={handleDone}\n />\n ) : (\n <CsatFormContent\n details={details}\n rating={rating}\n selectedOptions={selectedOptions}\n comments={comments}\n isHighRating={isHighRating}\n feedbackOptions={feedbackOptions}\n onRate={handleRate}\n onToggleOption={handleToggleOption}\n onCommentChange={setComments}\n onInlineSubmit={handleSubmit}\n canSubmit={rating >= 1}\n appearance={appearance}\n />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Csat;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport useCampaigns from '../../hooks/useCampaigns';\nimport useAppStorysStore from '../../core/store';\nimport trackEvent from '../../core/trackEvent';\nimport { revealCampaignFromLink } from '../../core/campaignHelpers';\nimport CrossButton from '../common/CommonElements/CrossButton';\nimport { CampaignSurvey, SurveyCampaignDetails, SurveySlide, SurveyTextStyle } from '../../types';\nimport { resolveCampaignVariant } from '../../core/variantResolver';\n\nfunction asSpacingValue(value?: number): string | undefined {\n if (value == null) return undefined;\n return `${value}px`;\n}\n\nfunction applyFontFamily(fontFamily?: string): string | undefined {\n if (!fontFamily) return undefined;\n if (fontFamily.startsWith('http://') || fontFamily.startsWith('https://')) return undefined;\n return fontFamily;\n}\n\nfunction textStyleToCss(textStyle?: SurveyTextStyle): React.CSSProperties {\n if (!textStyle) return {};\n\n return {\n color: textStyle.color,\n fontSize: textStyle.fontSize,\n fontFamily: applyFontFamily(textStyle.fontFamily),\n textAlign: textStyle.textAlign as React.CSSProperties['textAlign'],\n fontWeight: textStyle.fontDecoration?.includes('bold') ? 'bold' : undefined,\n fontStyle: textStyle.fontDecoration?.includes('italic') ? 'italic' : undefined,\n textDecoration: textStyle.fontDecoration?.includes('underline') ? 'underline' : undefined,\n };\n}\n\nfunction marginToStyle(margin?: SurveyTextStyle['margin']): React.CSSProperties {\n return {\n marginTop: asSpacingValue(margin?.top),\n marginRight: asSpacingValue(margin?.right),\n marginBottom: asSpacingValue(margin?.bottom),\n marginLeft: asSpacingValue(margin?.left),\n };\n}\n\nfunction getCornerRadius(cornerRadius?: { topLeft?: number; topRight?: number; bottomRight?: number; bottomLeft?: number }): string {\n return `${cornerRadius?.topLeft ?? 12}px ${cornerRadius?.topRight ?? 12}px ${cornerRadius?.bottomRight ?? cornerRadius?.topRight ?? 12}px ${cornerRadius?.bottomLeft ?? cornerRadius?.topLeft ?? 12}px`;\n}\n\nfunction getAlignment(alignment?: string): React.CSSProperties['justifyContent'] {\n if (alignment === 'right') return 'flex-end';\n if (alignment === 'left') return 'flex-start';\n return 'center';\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const raw = (hex || '').trim().replace('#', '');\n if (raw.length === 3) {\n const r = Number.parseInt(raw[0] + raw[0], 16);\n const g = Number.parseInt(raw[1] + raw[1], 16);\n const b = Number.parseInt(raw[2] + raw[2], 16);\n return `rgba(${r}, ${g}, ${b}, ${clamp01(alpha)})`;\n }\n\n if (raw.length === 6) {\n const r = Number.parseInt(raw.slice(0, 2), 16);\n const g = Number.parseInt(raw.slice(2, 4), 16);\n const b = Number.parseInt(raw.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${clamp01(alpha)})`;\n }\n\n return `rgba(0, 0, 0, ${clamp01(alpha)})`;\n}\n\nfunction normalizeBackdropOpacity(opacity?: number): number {\n if (opacity == null) return 0.4;\n const value = Number(opacity);\n if (!Number.isFinite(value)) return 0.4;\n if (value > 1) return clamp01(value / 100);\n return clamp01(value);\n}\n\nfunction getOrderedSlides(details: SurveyCampaignDetails): SurveySlide[] {\n const slides = details.slides || [];\n return [...slides].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\nfunction getOrderedOptions(slide?: SurveySlide): string[] {\n const options = slide?.options || {};\n const keys = Object.keys(options);\n\n const parseIndex = (key: string): number | undefined => {\n const match = /(\\d+)/.exec(key);\n if (!match) return undefined;\n const parsed = Number(match[1]);\n return Number.isFinite(parsed) ? parsed : undefined;\n };\n\n keys.sort((a, b) => {\n const ai = parseIndex(a);\n const bi = parseIndex(b);\n\n if (ai != null && bi != null) return ai - bi;\n if (ai != null) return -1;\n if (bi != null) return 1;\n return a.localeCompare(b);\n });\n\n return keys\n .map((key) => options[key])\n .filter((value): value is string => typeof value === 'string' && value.trim().length > 0);\n}\n\nfunction getBulletLabel(optionListStyle: string | undefined, index: number): string | null {\n if (!optionListStyle) return null;\n\n if (optionListStyle === 'alphabet') {\n const start = 'A'.codePointAt(0) ?? 65;\n return String.fromCodePoint(start + (index % 26));\n }\n\n if (optionListStyle === 'number') {\n return String(index + 1);\n }\n\n return null;\n}\n\nfunction asNonNegativeNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value >= 0) return value;\n if (typeof value === 'string' && value.trim().length > 0) {\n const parsed = Number(value);\n if (Number.isFinite(parsed) && parsed >= 0) return parsed;\n }\n return undefined;\n}\n\nfunction getBorderWidthFromTextStyle(textStyle?: SurveyTextStyle): number {\n return asNonNegativeNumber(textStyle?.borderwidth) ?? 1;\n}\n\ninterface SurveyResponsesMap {\n [slideId: string]: {\n option?: string;\n comment?: string;\n };\n}\n\ninterface SurveyFormContentProps {\n details: SurveyCampaignDetails;\n slide: SurveySlide;\n appearance?: SurveyCampaignDetails['styling'] extends { appearance?: infer A } ? A : any;\n selectedOption: string | null;\n comment: string;\n onSelectOption: (option: string) => void;\n onCommentChange: (value: string) => void;\n onSubmit: () => void;\n canSubmit: boolean;\n}\n\nconst SurveyFormContent: React.FC<SurveyFormContentProps> = ({\n details,\n slide,\n appearance,\n selectedOption,\n comment,\n onSelectOption,\n onCommentChange,\n onSubmit,\n canSubmit,\n}) => {\n const styling = details.styling || {};\n const optionsStyle = styling.options || {};\n const cta = styling.cta;\n\n const options = useMemo(() => getOrderedOptions(slide), [slide]);\n const optionRowGap = optionsStyle.optionsSpacing ?? 8;\n const bulletGap = optionsStyle.bulletSpacing ?? 10;\n const optionHeight = optionsStyle.optionsHeight ?? 44;\n\n const ctaAlign = getAlignment(cta?.container?.alignment);\n\n return (\n <>\n <div style={marginToStyle(styling.title?.textStyle?.margin)}>\n <div\n style={{\n ...(textStyleToCss(styling.title?.textStyle)),\n color: styling.title?.textStyle?.color || '#111827',\n fontSize: styling.title?.textStyle?.fontSize || 20,\n lineHeight: 1.3,\n fontWeight: styling.title?.textStyle?.fontDecoration?.includes('bold') ? 'bold' : 700,\n }}\n >\n {slide.title || slide.question || details.name || 'Survey'}\n </div>\n </div>\n\n {(slide.subtitle || styling.subtitle?.textStyle) && (\n <div style={marginToStyle(styling.subtitle?.textStyle?.margin)}>\n <div\n style={{\n ...(textStyleToCss(styling.subtitle?.textStyle)),\n color: styling.subtitle?.textStyle?.color || '#6b7280',\n fontSize: styling.subtitle?.textStyle?.fontSize || 14,\n lineHeight: 1.35,\n }}\n >\n {slide.subtitle || ''}\n </div>\n </div>\n )}\n\n {options.length > 0 && (\n <div\n style={{\n marginTop: 10,\n display: 'flex',\n flexDirection: 'column',\n gap: optionRowGap,\n }}\n >\n {options.map((option, index) => {\n const isActive = selectedOption === option;\n const styleSource = isActive ? optionsStyle.selectedOptions : optionsStyle.nonSelectedOptions;\n const borderWidth = getBorderWidthFromTextStyle(styleSource?.textStyle);\n const bulletLabel = getBulletLabel(optionsStyle.optionListStyle, index);\n\n return (\n <button\n key={`${option}-${index}`}\n onClick={() => onSelectOption(option)}\n style={{\n width: '100%',\n boxSizing: 'border-box',\n height: optionHeight,\n borderRadius: getCornerRadius(optionsStyle.cornerRadius),\n border: `${borderWidth}px solid ${styleSource?.colors?.border || '#e5e7eb'}`,\n background: styleSource?.colors?.background || '#ffffff',\n color: styleSource?.colors?.text || '#111827',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: bulletGap,\n paddingLeft: 14,\n paddingRight: 14,\n textAlign: 'left',\n ...(textStyleToCss(styleSource?.textStyle)),\n }}\n aria-pressed={isActive}\n >\n <span\n aria-hidden\n style={{\n width: 16,\n height: 16,\n borderRadius: 4,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: `1.5px solid ${styleSource?.colors?.border || '#111827'}`,\n background: '#ffffff',\n flex: '0 0 auto',\n fontSize: 11,\n fontWeight: 700,\n color: styleSource?.colors?.text || '#111827',\n }}\n >\n {isActive ? '✓' : (bulletLabel || '')}\n </span>\n\n <span style={{ flex: 1, minWidth: 0 }}>{option}</span>\n </button>\n );\n })}\n </div>\n )}\n\n {slide.additionalComment?.enabled && (\n <textarea\n value={comment}\n onChange={(event) => onCommentChange(event.target.value)}\n placeholder={slide.additionalComment?.placeholder || ''}\n style={{\n marginTop: 10,\n width: '100%',\n boxSizing: 'border-box',\n minHeight: 72,\n resize: 'none',\n overflowY: 'auto',\n border: `${getBorderWidthFromTextStyle(optionsStyle.additionalComments?.textStyle)}px solid ${optionsStyle.additionalComments?.colors?.border || '#e5e7eb'}`,\n background: optionsStyle.additionalComments?.colors?.background || '#ffffff',\n color: optionsStyle.additionalComments?.colors?.text || '#111827',\n borderRadius: 10,\n padding: '12px',\n ...(textStyleToCss(optionsStyle.additionalComments?.textStyle)),\n }}\n />\n )}\n\n <div\n style={{\n position: 'sticky',\n bottom: 0,\n marginTop: 12,\n paddingTop: 10,\n paddingBottom: 6,\n background: appearance?.backgroundColor || '#ffffff',\n }}\n >\n <div\n style={{\n marginTop: cta?.margin?.top ?? 0,\n marginBottom: cta?.margin?.bottom ?? 0,\n marginLeft: cta?.margin?.left ?? 0,\n marginRight: cta?.margin?.right ?? 0,\n display: 'flex',\n justifyContent: ctaAlign,\n }}\n >\n <button\n onClick={onSubmit}\n disabled={!canSubmit}\n style={{\n width: cta?.container?.ctaFullWidth ? '100%' : (cta?.container?.ctaWidth ?? '100%'),\n height: cta?.container?.height ?? 44,\n border: `${cta?.container?.borderWidth ?? 0}px solid ${cta?.container?.borderColor || 'transparent'}`,\n background: cta?.container?.backgroundColor || '#111827',\n color: cta?.text?.color || '#ffffff',\n borderRadius: getCornerRadius(cta?.cornerRadius),\n fontFamily: applyFontFamily(cta?.text?.fontFamily),\n fontSize: cta?.text?.fontSize || 14,\n fontWeight: cta?.text?.fontDecoration?.includes('bold') ? 'bold' : 600,\n cursor: canSubmit ? 'pointer' : 'not-allowed',\n opacity: canSubmit ? 1 : 0.6,\n padding: '0 16px',\n }}\n >\n {slide.submitButtonText || 'Submit'}\n </button>\n </div>\n </div>\n </>\n );\n};\n\ninterface SurveyThankYouContentProps {\n details: SurveyCampaignDetails;\n onDone: () => void;\n}\n\nconst SurveyThankYouContent: React.FC<SurveyThankYouContentProps> = ({ details, onDone }) => {\n const styling = details.styling || {};\n const thankyouPage = styling.thankyouPage || {};\n\n const cta = thankyouPage.cta;\n const ctaAlign = getAlignment(cta?.container?.alignment);\n\n return (\n <>\n {details.thankYouImage && (\n <div style={{ display: 'flex', justifyContent: 'center', marginTop: 8 }}>\n <img\n src={details.thankYouImage}\n alt=\"thank you\"\n style={{\n width: thankyouPage.imageStyle?.width || 80,\n height: thankyouPage.imageStyle?.height || 80,\n objectFit: 'cover',\n borderRadius: 10,\n }}\n />\n </div>\n )}\n\n <div style={{ ...marginToStyle(thankyouPage.title?.textStyle?.margin) }}>\n <div\n style={{\n ...(textStyleToCss(thankyouPage.title?.textStyle)),\n color: thankyouPage.title?.textStyle?.color || '#111827',\n fontSize: thankyouPage.title?.textStyle?.fontSize || 20,\n lineHeight: 1.3,\n fontWeight: thankyouPage.title?.textStyle?.fontDecoration?.includes('bold') ? 'bold' : 700,\n }}\n >\n {details.thankYouTitle || 'Thank you'}\n </div>\n </div>\n\n <div style={{ ...marginToStyle(thankyouPage.subtitle?.textStyle?.margin) }}>\n <div\n style={{\n ...(textStyleToCss(thankyouPage.subtitle?.textStyle)),\n color: thankyouPage.subtitle?.textStyle?.color || '#6b7280',\n fontSize: thankyouPage.subtitle?.textStyle?.fontSize || 14,\n lineHeight: 1.35,\n }}\n >\n {details.thankYouText || ''}\n </div>\n </div>\n\n {(details.thankYouButtonText || cta) && (\n <div\n style={{\n marginTop: cta?.margin?.top ?? 14,\n marginBottom: cta?.margin?.bottom ?? 0,\n marginLeft: cta?.margin?.left ?? 0,\n marginRight: cta?.margin?.right ?? 0,\n display: 'flex',\n justifyContent: ctaAlign,\n }}\n >\n <button\n onClick={onDone}\n style={{\n width: cta?.container?.ctaFullWidth ? '100%' : (cta?.container?.ctaWidth ?? 'auto'),\n height: cta?.container?.height ?? 40,\n border: `${cta?.container?.borderWidth ?? 0}px solid ${cta?.container?.borderColor || 'transparent'}`,\n background: cta?.container?.backgroundColor || '#111827',\n color: cta?.text?.color || '#ffffff',\n borderRadius: getCornerRadius(cta?.cornerRadius),\n fontFamily: applyFontFamily(cta?.text?.fontFamily),\n fontSize: cta?.text?.fontSize || 14,\n fontWeight: cta?.text?.fontDecoration?.includes('bold') ? 'bold' : 600,\n cursor: 'pointer',\n padding: '0 16px',\n }}\n >\n {details.thankYouButtonText || 'Done'}\n </button>\n </div>\n )}\n </>\n );\n};\n\nexport const Survey: React.FC = () => {\n const hookData = useCampaigns<CampaignSurvey>('SUR');\n const sdkVisible = useAppStorysStore((state: any) => state.isVisible);\n const campaigns = useAppStorysStore((state: any) => state.campaigns);\n const allCampaigns = useAppStorysStore((state: any) => state.allCampaigns);\n const currentScreen = useAppStorysStore((state: any) => state.currentScreen);\n\n const data = hookData ?? ((): CampaignSurvey | undefined => {\n const screen = (currentScreen || '').trim().toLowerCase();\n const found = [...(campaigns || []), ...(allCampaigns || [])].find((campaign: any) => {\n if (!campaign) return false;\n if (campaign.campaign_type !== 'SUR') return false;\n const hasTrigger = Boolean(campaign.trigger_event ?? campaign.trigger);\n const displayTriggerReady = (campaign as any).display_trigger !== false && !hasTrigger;\n if (!displayTriggerReady) return false;\n const cs = (campaign.screen || '').trim().toLowerCase();\n return !cs || cs === screen;\n }) as CampaignSurvey | undefined;\n\n if (!found) return undefined;\n try {\n return resolveCampaignVariant(found) as CampaignSurvey;\n } catch {\n return found;\n }\n })();\n\n const [isDismissed, setIsDismissed] = useState(false);\n const [canDisplay, setCanDisplay] = useState(false);\n const [currentIndex, setCurrentIndex] = useState(0);\n const [selectedOption, setSelectedOption] = useState<string | null>(null);\n const [comment, setComment] = useState('');\n const [responses, setResponses] = useState<SurveyResponsesMap>({});\n const [isSubmitted, setIsSubmitted] = useState(false);\n\n useEffect(() => {\n if (!data) return;\n\n setIsDismissed(false);\n setCanDisplay(false);\n setCurrentIndex(0);\n setSelectedOption(null);\n setComment('');\n setResponses({});\n setIsSubmitted(false);\n\n const delay = data.details?.styling?.appearance?.displayDelay ?? 0;\n const timeoutId = globalThis.setTimeout(() => {\n setCanDisplay(true);\n // Include survey identifiers in initial view event so backend can map impressions\n const surveyId = data.details?.id;\n const orderedSlides = getOrderedSlides(data.details);\n const firstSlideId = orderedSlides.length > 0 ? orderedSlides[0].id : undefined;\n void trackEvent('viewed', data.id, {\n survey_id: surveyId,\n slide_id: firstSlideId,\n });\n }, Math.max(0, delay) * 1000);\n\n return () => globalThis.clearTimeout(timeoutId);\n }, [data]);\n\n const slides = useMemo(() => (data ? getOrderedSlides(data.details) : []), [data]);\n const slide = slides[currentIndex];\n\n useEffect(() => {\n if (!slide) return;\n const existing = responses[slide.id];\n setSelectedOption(existing?.option ?? null);\n setComment(existing?.comment ?? '');\n }, [slide?.id]);\n\n if (!data || !sdkVisible || isDismissed || !canDisplay) return null;\n\n const details: SurveyCampaignDetails = data.details;\n const styling = details.styling || {};\n const appearance = styling.appearance || {};\n\n const backdropColor = appearance.backdropColor || '#000000';\n const backdropOpacity = normalizeBackdropOpacity(appearance.backdropOpacity);\n\n const handleSelectOption = (option: string) => {\n setSelectedOption((prev) => (prev === option ? null : option));\n };\n\n const submitSurvey = async (finalResponses: SurveyResponsesMap, finalSlideId: string) => {\n const responsesArray = slides.map((s) => ({\n slide_id: s.id,\n order: s.order,\n title: s.title,\n question: s.question,\n selected_options: finalResponses[s.id]?.option,\n comment: finalResponses[s.id]?.comment,\n }));\n\n // Use top-level campaign id for capture payload (campaign_id)\n const campaignId = data.id;\n\n // Mirror RN: include selected options and any 'other' text in metadata\n // Map selected option values back to their option keys (option1, option2, ...)\n const selectedOptionsKeys: string[] = [];\n for (const s of slides) {\n const selectedValue = finalResponses[s.id]?.option;\n if (!selectedValue) continue;\n const optionEntry = Object.entries(s.options || {}).find(([, val]) => String(val) === String(selectedValue));\n if (optionEntry) selectedOptionsKeys.push(optionEntry[0]);\n }\n const otherText = responsesArray.map(r => r.comment).filter(Boolean as any).join(' || ') || \"\";\n\n // Send survey identifiers and captured answers (match native `survey captured`)\n const captureCampaignId = details.id || campaignId;\n void trackEvent('survey captured', captureCampaignId, {\n survey_id: details.id,\n slide_id: finalSlideId,\n selected_options: selectedOptionsKeys,\n otherText,\n });\n\n const shouldShowThankYou = styling.content?.isThankyouPage !== false;\n if (shouldShowThankYou) {\n setIsSubmitted(true);\n } else {\n setIsDismissed(true);\n }\n };\n\n const handleSubmitCurrent = async () => {\n if (!slide) return;\n if (!selectedOption) return;\n\n const nextResponses: SurveyResponsesMap = {\n ...responses,\n [slide.id]: {\n option: selectedOption,\n comment,\n },\n };\n\n setResponses(nextResponses);\n\n // Send a capture event for the current slide (mirror RN per-slide capture behavior)\n try {\n const campaignId = data.id;\n // map the selected option value to its key\n let optionKey: string | null = null;\n if (selectedOption && slide && slide.options) {\n const found = Object.entries(slide.options).find(([, val]) => String(val) === String(selectedOption));\n if (found) optionKey = found[0];\n }\n // Per-slide capture: use native `survey captured` with details.id as campaign id\n const perSlideCampaignId = details.id || campaignId;\n void trackEvent('survey captured', perSlideCampaignId, {\n survey_id: details.id,\n slide_id: slide.id,\n selected_options: optionKey ? [optionKey] : [],\n otherText: comment || \"\",\n });\n } catch (e) {\n console.warn('Error sending per-slide survey captured', e);\n }\n\n const rules = slide.logic || [];\n const matchedRule = rules.find((rule) =>\n (rule.selectOption || []).includes(selectedOption)\n );\n\n if (matchedRule?.redirectTo === 'thank-you') {\n await submitSurvey(nextResponses, slide.id);\n return;\n }\n\n const isLastSlide = currentIndex >= slides.length - 1;\n if (isLastSlide) {\n await submitSurvey(nextResponses, slide.id);\n return;\n }\n\n setCurrentIndex((prev) => Math.min(prev + 1, slides.length - 1));\n };\n\n const handleDone = () => {\n const config = details.thankYouButtonConfig;\n if (config?.enabled && config.redirectUrl) {\n try {\n const redirect = String(config.redirectUrl || '').trim();\n if (redirect && !redirect.startsWith('http')) {\n const revealed = revealCampaignFromLink(redirect);\n if (revealed) {\n setIsDismissed(true);\n return;\n }\n }\n } catch (err) {\n console.warn('revealCampaignFromLink error', err);\n }\n\n try {\n globalThis.open(config.redirectUrl, '_blank');\n } catch (err) {\n // ignore\n }\n }\n setIsDismissed(true);\n };\n\n const handleDismiss = async () => {\n try {\n const campaignId = data?.id;\n const surveyId = details?.id;\n const slideId = slide?.id;\n await trackEvent('SurveyDismissed', campaignId, {\n survey_id: surveyId,\n slide_id: slideId,\n });\n } catch (err) {\n console.warn('Error sending SurveyDismissed', err);\n } finally {\n setIsDismissed(true);\n }\n };\n\n if (!slide) return null;\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 999999,\n display: 'flex',\n justifyContent: 'flex-end',\n alignItems: 'flex-end',\n padding: 12,\n pointerEvents: 'none',\n }}\n >\n <div\n aria-hidden\n style={{\n position: 'absolute',\n inset: 0,\n background: hexToRgba(backdropColor, backdropOpacity),\n }}\n />\n\n <div\n style={{\n position: 'relative',\n width: 'min(420px, 92vw)',\n maxWidth: '92vw',\n minWidth: '320px',\n maxHeight: '80vh',\n overflow: 'hidden',\n backgroundColor: appearance.backgroundColor || '#ffffff',\n borderRadius: getCornerRadius(appearance.cornerRadius),\n boxSizing: 'border-box',\n paddingTop: 14,\n paddingRight: 16,\n paddingBottom: 10,\n paddingLeft: 16,\n pointerEvents: 'auto',\n boxShadow: '0 14px 36px rgba(0, 0, 0, 0.25)',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <style>\n {`\n .appstorys-survey-scroll {\n scrollbar-width: none; /* Firefox */\n -ms-overflow-style: none; /* IE/Edge */\n }\n .appstorys-survey-scroll::-webkit-scrollbar {\n width: 0;\n height: 0;\n display: none; /* Chrome/Safari */\n }\n `}\n </style>\n\n {styling.crossButton?.enabled && (\n <CrossButton\n config={styling.crossButton}\n onPress={handleDismiss}\n style={{\n top: styling.crossButton?.margin?.top ?? 10,\n right: styling.crossButton?.margin?.right ?? 10,\n }}\n />\n )}\n\n <div\n className=\"appstorys-survey-scroll\"\n style={{\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n paddingRight: 2,\n }}\n >\n {isSubmitted ? (\n <SurveyThankYouContent details={details} onDone={handleDone} />\n ) : (\n <SurveyFormContent\n details={details}\n slide={slide}\n appearance={appearance}\n selectedOption={selectedOption}\n comment={comment}\n onSelectOption={handleSelectOption}\n onCommentChange={setComment}\n onSubmit={handleSubmitCurrent}\n canSubmit={selectedOption != null}\n />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Survey;\n"],"mappings":"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","names":["WebStorage","init_storage","__esmMin","key","value","getUserId","useAppStorysStore","getAccessToken","WebStorage","getVariantId","campaignId","id","import_zustand","store_default","init_store","__esmMin","init_storage","set","campaigns","version","userId","appId","accountId","currentScreen","attributes","trackedEvents","trackedEventMetadata","isVisible","isAnonymousUser","variantMappings","personalizationData","enabled","baseUrl","trackingUrl","getDeviceInfo","error","init_getDeviceInfo","__esmMin","verifyAccount","accountId","appId","userId","requestBody","WebStorage","DEVICE_INFO_SENT_KEY","deviceInfo","getDeviceInfo","baseUrl","store_default","response","data","access_token","refresh_token","error","init_verifyAccount","__esmMin","init_storage","init_getDeviceInfo","init_store","identifyWidgetPositions","screenName","positionList","accessToken","getAccessToken","endpoint","resp","err","init_identifyWidgetPositions","__esmMin","init_store","normalizeWidgetId","id","extractPositionsFromCampaigns","all","store_default","positions","c","d","v","p","mapServerPositionsToDOM","screenName","mapped","pos","key","selectors","el","sel","rect","frame","CaptureService","ensureList","layoutData","buildFormData","userId","children","blob","form","safeScreenName","filename","file","e","init_CaptureService","__esmMin","init_store","init_verifyAccount","init_identifyWidgetPositions","enabled","s","list","idx","l","enrichedFrame","info","elements","screenWidth","screenHeight","foundIds","positionList","resolve","win","reject","script","loadErr","canvas","b","err","stream","video","ctx","t","accessToken","getAccessToken","getUserId","state","verifyAccount","endpoint","body","resp","newToken","text","positionsToSend","normalized","serverPositions","combined","identifyWidgetPositions","name","screenCapture_exports","__export","mountScreenCaptureButton","injectStyles","style","createButton","btn","state","store_default","debugForce","originalText","screenName","CaptureService","err","init_screenCapture","__esmMin","init_store","init_CaptureService","e","s","token","len","masked","parts","payload","exp","now","index_exports","__export","instance","Banner","BottomSheet","Csat_default","Floater_default","Pip","SdkState","Story","Survey_default","Tooltip_default","Widget","personalizeText","__toCommonJS","SdkState","import_react","LottieModule","init_store","import_react","init_store","init_store","getVariantId","campaignId","store_default","hasVariants","campaign","resolveCampaignVariant","variantId","variants","variantDetails","baseDetails","key","BACK_PRESS_SENTINEL","normalizeScreenName","screen","isScreenMatch","campaignScreen","currentScreen","normalizedCampaignScreen","normalizedCurrentScreen","compareValues","actual","operator","expected","numActual","numExpected","useNumeric","matchesEventConditions","event_config","metadataList","realConditions","c","meta","condition","isTriggerEventSatisfied","campaign","trackedEvents","trackedEventMetadata","t","trigger_event","id","isBackPressCampaignReady","campaigns","store_default","te","event","useCampaigns","campaignType","options","state","allCampaigns","variantMappings","matchCampaign","list","resolveCampaignVariant","init_store","init_getDeviceInfo","init_storage","init_store","init_verifyAccount","OFFLINE_QUEUE_KEY","getQueue","existing","WebStorage","saveQueue","queue","getBackoffDelay","retryCount","shouldRetryRequest","request","lastAttempt","backoffDelay","validateCredentials","state","store_default","verifyAccount","handleAuthError","onSuccess","newToken","handleCriticalError","addToQueue","flushQueue","newQueue","req","res","r","sendOrQueue","trackEvent","event","campaignId","metadata","accessToken","getAccessToken","state","store_default","excludedEvents","trackedEvents","updatedEvents","e","currentMeta","existing","finalMetadata","deviceInfo","getDeviceInfo","variantId","getVariantId","body","getUserId","trackingUrl","sendOrQueue","error","init_store","revealCampaignFromLink","link","s","store_default","all","existing","normalizedLink","referenced","c","cid","details","detailsCampaign","revealed","idx","existingItem","next","import_jsx_runtime","Lottie","LottieModule","Banner","data","useCampaigns","sdkVisible","store_default","state","isDismissed","setIsDismissed","lottieData","setLottieData","aspectRatio","setAspectRatio","containerRef","containerWidth","setContainerWidth","trackEvent","res","json","err","updateWidth","details","styling","calculatedHeight","bannerStyle","mediaStyle","handleClose","e","revealCampaignFromLink","LottieComp","import_react","init_store","import_jsx_runtime","normalizeScreen","value","parseNumber","fallback","parsed","PipIcon","iconType","color","stroke","IconButton","config","imageOverride","onClick","iconSize","buttonSize","margin","imageUrl","iconColor","fillColor","strokeColor","e","Pip","hookData","useCampaigns","campaigns","store_default","state","allCampaigns","currentScreen","sdkVisible","isClosed","setIsClosed","isExpanded","setIsExpanded","isMuted","setIsMuted","isDragging","setIsDragging","dragPosition","setDragPosition","dragOffsetRef","videoRef","data","screen","findFromList","source","campaign","item","isPip","matchesScreen","hasTrigger","displayTriggerReady","found","resolveCampaignVariant","stableData","details","defaultSoundSetting","trackEvent","onMouseMove","event","nextX","nextY","onMouseUp","styling","appearance","configuredWidth","configuredHeight","miniWidth","miniHeight","ctaContainer","ctaText","hasCta","ctaHeight","expandedExtraHeight","bottomPadding","topPadding","videoSource","position","isMovable","soundEnabled","closeEnabled","expandEnabled","closeConfig","expandConfig","soundConfig","wrapperStyle","onWrapperMouseDown","rect","handleOpenLink","link","s","all","existing","referenced","c","revealed","idx","existingItem","next","prev","import_react","import_lottie_react","init_store","import_jsx_runtime","toNumber","value","fallback","parsed","normalizeScreen","MEDIA_BUCKET_HOST","resolveLottieCandidateUrls","url","isDevServer","proxyUrl","isLikelyLottieJson","candidate","FloaterLottieErrorBoundary","React","props","Floater","lottieData","setLottieData","lottieUrls","setLottieUrls","lottieFailed","setLottieFailed","lottieLoading","setLottieLoading","lottieContainerRef","lottieAnimationRef","hookData","useCampaigns","campaigns","store_default","state","allCampaigns","currentScreen","sdkVisible","viewedKeyRef","data","found","campaign","item","hasTrigger","resolveCampaignVariant","campaignId","mappedVariantId","hasVariants","viewKey","trackEvent","lottieSource","candidateUrls","lottie","cancelled","activeAnimation","cleanupCurrent","tryLoadByPath","paths","index","animation","details","styling","position","positionStyle","floaterStyle","handleClick","link","s","all","existing","referenced","c","cid","detailsCampaign","revealed","idx","existingItem","next","err","canRenderLottie","canRenderImage","canRenderLoadingPlaceholder","Floater_default","init_store","normalizeScreenName","screen","isScreenMatch","campaign","screenName","campaignScreen","currentScreen","trackScreen","state","store_default","accessToken","getAccessToken","accountId","baseUrl","response","getUserId","data","variantMappings","variant","allCampaigns","eligibleCampaignIds","foundCampaigns","foundCampaignIds","c","missingCampaignIds","id","missingCampaigns","fallbackResponse","eligibleCampaigns","displayTriggeredCampaigns","hasTrigger","mergedCampaigns","seenCampaignIds","error","init_verifyAccount","init_store","init_getDeviceInfo","setUserProperties","attributes","accessToken","getAccessToken","userId","getUserId","state","store_default","finalMetadata","deviceInfo","getDeviceInfo","bodyData","baseUrl","sendOrQueue","error","init_store","personalizeText","text","personalizationData","store_default","replacePlaceholdersWithFallback","regex","_","variableName","fallbackValue","trimmedVariable","trimmedFallback","init_storage","init_store","STORAGE_KEY_CAMPAIGNS","STORAGE_KEY_ETAG","STORAGE_KEY_VERSION","fetchAllCampaigns","accountId","screenName","isLocalDev","url","cachedData","WebStorage","cachedEtag","cachedVersion","headers","response","newEtag","responseData","version","campaigns","effectiveScreenName","accessToken","getAccessToken","userId","getUserId","trackResp","trackData","possibleScreen","s","store_default","err","userIdFromResp","fallbackResponse","fallbackData","error","normalize","current","campaign","init_store","init_store","reconcileAnonymousUser","anonymousUserId","identifiedUserId","accessToken","getAccessToken","state","store_default","requestBody","baseUrl","response","errorText","error","init_store","ExitIntentManager","isBackPressCampaignReady","state","store_default","trackedEvents","BACK_PRESS_SENTINEL","exitIntentManager","init_store","VisibilityManager","isVisible","state","store_default","visibilityManager","init_storage","ANONYMOUS_USER_KEY","generateAnonymousUserId","currentTimeMs","browserName","getOrCreateAnonymousUserId","storedUserId","WebStorage","newUserId","error","clearAnonymousUserId","getStoredAnonymousUserId","injectStyles","style","makePill","text","pill","ensureRelative","el","node","computed","matches","sel","idx","target","existing","err","import_react","init_store","import_react","LottieModule","import_jsx_runtime","Lottie","StoryThumbnail","src","alt","style","size","lottieData","setLottieData","lottieFailed","setLottieFailed","res","json","err","baseStyle","LottieComp","import_jsx_runtime","StoryGroupItem","story","isViewed","onClick","styling","size","ringWidth","ringColor","nameColor","cornerRadius","borderRadiusStr","imgBorderRadiusStr","StoryThumbnail","import_jsx_runtime","StoryList","stories","viewedStories","onStoryClick","a","b","story","index","StoryGroupItem","import_react","init_store","import_jsx_runtime","PollSticker","data","onInteraction","isEditing","isHorizontal","defaults","styling","containerStyle","questionStyle","optionsContainerStyle","optionStyle","handleOptionClick","optionId","options","option","index","e","import_react","import_jsx_runtime","QuizSticker","data","onInteraction","isEditing","selectedOptionId","setSelectedOptionId","defaults","styling","cardPadding","questionFontSize","optionFontSize","optionRadius","borderColor","labelSize","containerStyle","questionStyle","optionStyle","labelStyle","bodyStyle","handleOptionClick","optionId","alphabet","options","option","index","label","isSelected","isCorrect","currentOptionStyle","currentLabelStyle","import_react","import_jsx_runtime","CountdownSticker","data","timeLeft","setTimeLeft","calculateTime","difference","days","hours","minutes","seconds","timer","styling","display","digitSize","safeDigitSize","labelFontSize","boxHeight","boxMinWidth","boxRadius","gridGap","containerStyle","titleStyle","timerGridStyle","segmentStyle","digitGroupStyle","boxStyle","labelStyle","separatorStyle","renderDigitGroup","value","label","digit","i","items","shownCount","import_react","import_jsx_runtime","PromoCodeSticker","data","onInteraction","copied","setCopied","handleCopy","styling","ticketPillStyle","percentageBoxStyle","codeStyle","import_jsx_runtime","ReactionSticker","data","onInteraction","isEditing","defaults","emojis","handleReaction","emoji","containerStyle","bubbleStyle","idx","e","import_react","import_jsx_runtime","RatingSticker","data","onInteraction","isEditing","maxRating","currentRating","val","setVal","sliderTrackRef","isDragging","setIsDragging","defaults","styling","containerStyle","titleStyle","trackStyle","percentage","fillStyle","emojiSize","thumbStyle","handleDrag","clientX","rect","offsetX","ratio","computedVal","onMouseDown","e","onTouchStart","onMouseMove","onMouseUp","onTouchMove","import_react","import_jsx_runtime","QuestionSticker","data","onInteraction","isEditing","value","setValue","defaults","styling","containerStyle","questionStyle","inputContainerStyle","inputStyle","sendButtonStyle","handleChange","e","handleSend","import_react","import_jsx_runtime","ImageQuizSticker","data","onInteraction","isEditing","selectedOptionId","setSelectedOptionId","defaults","styling","containerStyle","questionStyle","gridStyle","optionStyle","handleOptionClick","optionId","placeholderImg","options","option","isSelected","isCorrect","currentOptionStyle","e","import_react","import_react","import_jsx_runtime","ShopableModal","product","styling","onClose","onAddToCart","selectedSize","setSelectedSize","selectedColorIndex","setSelectedColorIndex","quantity","setQuantity","isSuccess","setIsSuccess","isVisible","setIsVisible","attributes","colors","sizes","imageUrls","description","handleAddToCart","item","url","error","handleDismiss","buttonBg","buttonFg","titleFg","priceFg","mrpFg","titleWeight","priceWeight","mrpWeight","overlayStyle","backdropStyle","sheetStyle","dragHandleStyle","buttonBaseStyle","headerStyle","closeButtonStyle","scrollContentStyle","gallerySectionStyle","i","sectionStyle","sectionTitleStyle","color","size","bottomBarStyle","stepperStyle","stepperBtnStyle","q","availability","isOutOfStock","import_jsx_runtime","ShopableSticker","data","onInteraction","isEditing","products","styling","isModalOpen","setIsModalOpen","selectedProduct","setSelectedProduct","handleProductClick","e","product","url","error","handleAddToCart","item","containerStyle","cardStyle","imageContainerStyle","contentContainerStyle","ShopableModal","import_jsx_runtime","InteractiveItem","data","onInteraction","isEditing","defaults","x","y","width","rotation","wrapperStyle","animationStyle","renderSticker","PollSticker","QuizSticker","RatingSticker","QuestionSticker","ImageQuizSticker","CountdownSticker","PromoCodeSticker","ReactionSticker","ShopableSticker","textStyle","parseBackground","bg","color","direction","from","to","stops","cssDir","stopStr","s","getAnimationStyles","anim","type","duration","import_jsx_runtime","getEditorSource","item","content","editorSource","normalizeOptions","options","isCorrect","option","index","optionId","optionLabel","optionText","key","value","optionValue","normalizeReactionEmojis","data","emoji","normalizeElementType","type","normalized","getCountdownTarget","combined","InteractiveOverlay","onInteraction","isEditing","elapsedTime","canva","canvaWidth","canvaHeight","scale_factor","elements","images","texts","interactions","shopableContent","shopableIds","s","shopableStyling","displayElements","custom","style","source","position","size","rawX","rawY","rawW","x_percent","y_percent","width_percent","baseData","parseBackground","getAnimationStyles","normalizedOpts","colors","emojisArray","displayInteractions","typeStr","posX","posY","sizeW","sizeH","height_percent","displayShopable","matchedStyling","inlineStyling","styling","rawCardBorderRadius","rawCardRadiusPercent","rawHeight","radiusFromPercent","resolvedCardBorderRadius","resolvedCardBorderRadiusPx","isProductType","itemsSource","p","sourceData","attr","currentPrice","oldPrice","colorVal","sizeVal","sizes","consolidatedAttributes","displayImages","img","displayText","txt","font","displayItems","start","end","a","b","InteractiveItem","import_react","import_jsx_runtime","PlayPauseButton","isPaused","onPress","style","size","isHovered","setIsHovered","PlayPauseButton_default","import_jsx_runtime","mapAlignment","alignment","Cta","cta","buttonText","onPress","personalizeText","Cta_default","import_jsx_runtime","CrossButton","config","onPress","style","ignoreSizeAndMargin","backendSize","margin","color","image","selectedStyle","size","containerStyle","renderDefaultIcon","stroke","CrossButton_default","import_jsx_runtime","SoundButton","config","onPress","ignoreSizeAndMargin","enabled","style","type","backendSize","margin","color","image","selectedStyle","size","marginTop","marginBottom","marginLeft","marginRight","containerStyle","renderDefaultIcon","stroke","import_jsx_runtime","ShareButton","config","onPress","ignoreSizeAndMargin","style","backendSize","margin","color","image","selectedStyle","size","containerStyle","renderDefaultIcon","stroke","ShareButton_default","import_jsx_runtime","StoryOverlay","stories","activeStoryIndex","dataId","viewedStories","setViewedStories","onNextStory","onPrevStory","onClose","activeSlideIndex","setActiveSlideIndex","progress","setProgress","isMuted","setIsMuted","videoLoaded","setVideoLoaded","isPaused","setIsPaused","showShortcuts","setShowShortcuts","showToast","setShowToast","isDesktop","setIsDesktop","handleResize","progressTimerRef","activeVideoRef","clickStartTimeRef","currentStory","currentSlide","currentSlideStyling","slideEditorSource","slideIsStudio","slideBgImage","slideCtaText","slideCtaLink","slideVideo","handleShare","shareData","trackEvent","handleKeyDown","e","handleNextSlide","handlePrevSlide","prev","slideTime","isVideo","updated","handleMouseDownNav","handleMouseUpNav","direction","handleVideoLoad","handleClickCTA","slide","styling","editorSource","link","toggleMute","crossConfig","soundConfig","ctaStyling","ctaContainer","ctaTextStyling","backdropStyle","centerCardStyle","sideCardStyle","StoryThumbnail","_","idx","fillWidth","ShareButton_default","SoundButton","PlayPauseButton_default","CrossButton_default","prevMedia","prevStyling","prevEditorSource","prevBgImage","bgColor","parseBackground","InteractiveOverlay","interactionData","type","questionId","pollId","quizId","optionId","value","stickerId","interaction_type","interaction_id","selected","state","store_default","userId","trackingUrl","accessToken","getAccessToken","payload","err","Cta_default","nextMedia","nextStyling","nextEditorSource","nextBgImage","import_jsx_runtime","Story","data","useCampaigns","sdkVisible","store_default","state","activeStoryIndex","setActiveStoryIndex","viewedStories","setViewedStories","saved","e","trackEvent","handleStoryClick","index","story","handleNextStory","handlePrevStory","StoryList","StoryOverlay","import_react","import_react_dom","init_store","import_jsx_runtime","Widget","position","hookData","useCampaigns","campaigns","store_default","state","allCampaigns","currentScreen","normalizeScreen","value","data","screen","found","campaign","item","hasTrigger","displayTriggerReady","matchesScreen","resolveCampaignVariant","activeIndex","setActiveIndex","containerRef","autoAdvanceRef","details","images","styling","widgetType","isHalf","trackedImpressionsRef","trackImpression","widgetImageId","trackEvent","prev","next","handleClick","imageId","link","revealCampaignFromLink","err","handleScroll","scrollLeft","offsetWidth","itemWidth","index","img","el","checkVisibility","idx","itemLeft","itemRight","viewLeft","viewRight","containerStyle","getItemStyle","content","_","i","target","key","selectors","sel","import_react","init_store","import_jsx_runtime","normalizeScreen","value","Tooltip","hookData","useCampaigns","campaigns","store_default","state","allCampaigns","currentScreen","sdkVisible","currentStep","setCurrentStep","isDismissed","setIsDismissed","targetRect","setTargetRect","tooltipSize","setTooltipSize","tooltipRef","observerRef","data","screen","findFromList","source","campaign","item","isTooltip","matchesScreen","hasTrigger","displayTriggerReady","tooltips","a","b","currentTooltip","viewedTooltipsRef","tooltipId","key","trackEvent","findTarget","scroll","targetId","el","handleResizeOrScroll","targetEl","width","height","styling","appearance","colors","cta","ctaContainer","ctaCorner","ctaText","arrowPos","arrowSize","absoluteTop","absoluteLeft","tooltipLeft","tooltipTop","offsetGap","safeMargin","viewportTop","viewportBottom","viewportLeft","viewportRight","handleNext","action","targetLink","prev","handleBackdropClick","Tooltip_default","import_react","init_store","import_jsx_runtime","BottomSheet","hookData","useCampaigns","campaigns","store_default","state","allCampaigns","currentScreen","data","screen","found","campaign","hasTrigger","cs","resolveCampaignVariant","sdkVisible","isDismissed","setIsDismissed","trackEvent","removeTrackedEvent","eventKey","next","e","details","sortedElements","a","opacity","renderElement","element","imgStyle","link","revealCampaignFromLink","err","ctaData","container","cornerRadius","margin","textStyle","l","titleStyle","descStyle","CrossButton_default","import_react","init_store","import_jsx_runtime","FIVE_STAR_MAX","LOW_RATING_CUTOFF","asSpacingValue","value","spacingToStyle","spacing","applyFontFamily","fontFamily","textStyleToCss","textStyle","getCornerRadius","cornerRadius","getAlignment","alignment","getRatingType","details","ratingType","getEmojiChoices","configured","item","values","split","getNumberChoices","_","index","asNonNegativeNumber","parsed","getNumberRatingGap","rating","directCandidates","candidate","maybe","numberConfig","obj","nestedCandidates","StarIcon","fill","stroke","CsatFormContent","details","appearance","rating","selectedOptions","comments","isHighRating","feedbackOptions","onRate","onToggleOption","onCommentChange","onInlineSubmit","canSubmit","styling","feedbackPage","ratingStyle","initialFeedback","submitCta","ratingType","getRatingType","numberChoices","getNumberChoices","emojiChoices","getEmojiChoices","numberGap","getNumberRatingGap","selectedStarConfig","spacingToStyle","textStyleToCss","FIVE_STAR_MAX","_","index","value","isSelected","starContainerStyle","starStyle","selected","emoji","LOW_RATING_CUTOFF","option","styleSource","getCornerRadius","event","asNonNegativeNumber","applyFontFamily","CsatThankYouContent","onDone","thankyouPage","doneAlign","getAlignment","Csat","hookData","useCampaigns","sdkVisible","store_default","state","campaigns","allCampaigns","currentScreen","data","screen","found","campaign","hasTrigger","cs","resolveCampaignVariant","isDismissed","setIsDismissed","canDisplay","setCanDisplay","setRating","setSelectedOptions","setComments","isSubmitted","setIsSubmitted","delay","timeoutId","trackEvent","source","a","b","key","configuredWidth","compactCardWidth","handleToggleOption","prev","item","handleSubmit","override","ratingValue","campaignId","selectedOption","additionalComments","handleRate","e","handleDone","link","revealCampaignFromLink","err","asSpacingValue","CrossButton_default","Csat_default","import_react","init_store","import_jsx_runtime","asSpacingValue","value","applyFontFamily","fontFamily","textStyleToCss","textStyle","marginToStyle","margin","getCornerRadius","cornerRadius","getAlignment","alignment","clamp01","hexToRgba","hex","alpha","raw","r","g","b","normalizeBackdropOpacity","opacity","getOrderedSlides","details","a","getOrderedOptions","slide","options","keys","parseIndex","key","match","parsed","ai","bi","getBulletLabel","optionListStyle","index","start","asNonNegativeNumber","getBorderWidthFromTextStyle","SurveyFormContent","appearance","selectedOption","comment","onSelectOption","onCommentChange","onSubmit","canSubmit","styling","optionsStyle","cta","optionRowGap","bulletGap","optionHeight","ctaAlign","option","isActive","styleSource","borderWidth","bulletLabel","event","SurveyThankYouContent","onDone","thankyouPage","Survey","hookData","useCampaigns","sdkVisible","store_default","state","campaigns","allCampaigns","currentScreen","data","screen","found","campaign","hasTrigger","cs","resolveCampaignVariant","isDismissed","setIsDismissed","canDisplay","setCanDisplay","currentIndex","setCurrentIndex","setSelectedOption","setComment","responses","setResponses","isSubmitted","setIsSubmitted","delay","timeoutId","surveyId","orderedSlides","firstSlideId","trackEvent","slides","existing","backdropColor","backdropOpacity","handleSelectOption","prev","submitSurvey","finalResponses","finalSlideId","responsesArray","s","campaignId","selectedOptionsKeys","selectedValue","optionEntry","val","otherText","captureCampaignId","handleSubmitCurrent","nextResponses","optionKey","perSlideCampaignId","e","rule","handleDone","config","redirect","revealCampaignFromLink","err","handleDismiss","slideId","CrossButton_default","Survey_default","AppStorys","options","appId","accountId","userId","state","store_default","finalUserId","isAnonymous","getOrCreateAnonymousUserId","storedAnonymousUserId","getStoredAnonymousUserId","verifyAccount","reconcileAnonymousUser","clearAnonymousUserId","accessToken","getAccessToken","usersBase","resp","data","s","val","err","campaigns","version","fetchAllCampaigns","exitIntentManager","visibilityManager","e","screenName","trackScreen","event","campaignId","metadata","trackEvent","attributes","setUserProperties","link","revealCampaignFromLink","isVisible","startTime","resolve","text","personalizeText","instance"]}
|