@encorekit/web-sdk 0.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/LICENSE +36 -0
- package/README.md +67 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/umd/encore.min.js +2 -0
- package/dist/umd/encore.min.js.map +1 -0
- package/package.json +54 -0
- package/types/api/APIClient.d.ts +63 -0
- package/types/api/APIClient.d.ts.map +1 -0
- package/types/api/endpoints.d.ts +35 -0
- package/types/api/endpoints.d.ts.map +1 -0
- package/types/api/models.d.ts +156 -0
- package/types/api/models.d.ts.map +1 -0
- package/types/core/Configuration.d.ts +42 -0
- package/types/core/Configuration.d.ts.map +1 -0
- package/types/core/Encore.d.ts +81 -0
- package/types/core/Encore.d.ts.map +1 -0
- package/types/core/EntitlementManager.d.ts +65 -0
- package/types/core/EntitlementManager.d.ts.map +1 -0
- package/types/core/OfferManager.d.ts +35 -0
- package/types/core/OfferManager.d.ts.map +1 -0
- package/types/core/PlacementBuilder.d.ts +27 -0
- package/types/core/PlacementBuilder.d.ts.map +1 -0
- package/types/core/SignalManager.d.ts +51 -0
- package/types/core/SignalManager.d.ts.map +1 -0
- package/types/core/StorageManager.d.ts +34 -0
- package/types/core/StorageManager.d.ts.map +1 -0
- package/types/core/VerificationPoller.d.ts +27 -0
- package/types/core/VerificationPoller.d.ts.map +1 -0
- package/types/index.d.ts +10 -0
- package/types/index.d.ts.map +1 -0
- package/types/types.d.ts +156 -0
- package/types/types.d.ts.map +1 -0
- package/types/ui/OfferCard.d.ts +29 -0
- package/types/ui/OfferCard.d.ts.map +1 -0
- package/types/ui/OfferCarousel.d.ts +55 -0
- package/types/ui/OfferCarousel.d.ts.map +1 -0
- package/types/ui/OfferModal.d.ts +41 -0
- package/types/ui/OfferModal.d.ts.map +1 -0
- package/types/ui/SuccessScreen.d.ts +33 -0
- package/types/ui/SuccessScreen.d.ts.map +1 -0
- package/types/ui/styles.d.ts +44 -0
- package/types/ui/styles.d.ts.map +1 -0
- package/types/utils/eventEmitter.d.ts +50 -0
- package/types/utils/eventEmitter.d.ts.map +1 -0
- package/types/utils/focusDetection.d.ts +21 -0
- package/types/utils/focusDetection.d.ts.map +1 -0
- package/types/utils/logger.d.ts +21 -0
- package/types/utils/logger.d.ts.map +1 -0
- package/types/utils/network.d.ts +57 -0
- package/types/utils/network.d.ts.map +1 -0
- package/types/utils/uuid.d.ts +10 -0
- package/types/utils/uuid.d.ts.map +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
ENCOREKIT PROPRIETARY LICENSE
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 EncoreKit. All Rights Reserved.
|
|
4
|
+
|
|
5
|
+
GRANT OF LICENSE
|
|
6
|
+
|
|
7
|
+
EncoreKit grants you a non-exclusive, non-transferable, revocable license to use
|
|
8
|
+
this software package in your applications, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
PERMITTED USE:
|
|
11
|
+
- You MAY install and use this package in your applications
|
|
12
|
+
- You MAY use the package in both commercial and non-commercial projects
|
|
13
|
+
|
|
14
|
+
PROHIBITED ACTIONS:
|
|
15
|
+
- You MAY NOT modify, alter, adapt, or create derivative works of this package
|
|
16
|
+
- You MAY NOT reverse engineer, decompile, or disassemble this package
|
|
17
|
+
- You MAY NOT redistribute, sublicense, rent, lease, or loan this package
|
|
18
|
+
- You MAY NOT remove or alter any copyright notices or proprietary markings
|
|
19
|
+
- You MAY NOT publish, copy, or redistribute the source code
|
|
20
|
+
|
|
21
|
+
DISCLAIMER
|
|
22
|
+
|
|
23
|
+
THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
24
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
26
|
+
ENCOREKIT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
27
|
+
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
28
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
29
|
+
|
|
30
|
+
TERMINATION
|
|
31
|
+
|
|
32
|
+
This license is effective until terminated. EncoreKit may terminate this license
|
|
33
|
+
at any time if you fail to comply with any term of this agreement. Upon
|
|
34
|
+
termination, you must cease all use of the software and destroy all copies.
|
|
35
|
+
|
|
36
|
+
For licensing inquiries, please contact: admin@encorekit.com
|
package/README.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Encore Web SDK
|
|
2
|
+
|
|
3
|
+
A JavaScript/TypeScript SDK that enables web applications to display targeted offers to users, granting them provisional access to premium features when they complete advertiser offers.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🎯 **Targeted Offer Presentation** - Display offers at critical moments (cancellation flows, paywalls, onboarding)
|
|
8
|
+
- 🔐 **Entitlement Management** - Two-tier system (provisional + verified) for instant UX and reliable billing
|
|
9
|
+
- 📱 **Framework Agnostic** - Works with React, Vue, Angular, Svelte, vanilla JavaScript, or any web framework
|
|
10
|
+
- 🎨 **Responsive UI** - Beautiful, accessible modal interface that works on desktop and mobile
|
|
11
|
+
- 📦 **Lightweight** - < 50KB gzipped bundle size
|
|
12
|
+
- 🔌 **Offline Support** - Queues signals and syncs when connectivity restored
|
|
13
|
+
- ♿ **Accessible** - WCAG 2.1 Level AA compliant
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @encore/web
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Or via CDN:
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<script src="https://encorekit.com/encore.min.js"></script>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import Encore from '@encore/web';
|
|
31
|
+
|
|
32
|
+
// Configure the SDK
|
|
33
|
+
Encore.configure({
|
|
34
|
+
apiKey: 'your-api-key-here'
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Identify the user (optional)
|
|
38
|
+
Encore.identify('user-123', {
|
|
39
|
+
email: 'user@example.com',
|
|
40
|
+
subscriptionTier: 'free'
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Present an offer
|
|
44
|
+
const result = await Encore.presentOffer();
|
|
45
|
+
if (result.granted) {
|
|
46
|
+
console.log('User granted entitlement:', result.entitlement);
|
|
47
|
+
// Unlock premium feature
|
|
48
|
+
} else {
|
|
49
|
+
console.log('User declined:', result.reason);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Check if user has active entitlement
|
|
53
|
+
if (Encore.isActive({ type: 'freeTrial' })) {
|
|
54
|
+
// Show premium content
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Browser Support
|
|
59
|
+
|
|
60
|
+
- Chrome/Edge (last 2 versions)
|
|
61
|
+
- Firefox (last 2 versions)
|
|
62
|
+
- Safari (last 2 versions)
|
|
63
|
+
- iOS Safari 15+
|
|
64
|
+
|
|
65
|
+
## Documentation
|
|
66
|
+
|
|
67
|
+
- [Full Documentation](https://docs.encorekit.com)
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e;Object.defineProperty(exports,"__esModule",{value:!0}),function(e){e.NETWORK_ERROR="NETWORK_ERROR",e.API_ERROR="API_ERROR",e.CONFIGURATION_ERROR="CONFIGURATION_ERROR",e.INITIALIZATION_ERROR="INITIALIZATION_ERROR",e.STORAGE_ERROR="STORAGE_ERROR",e.INVALID_REQUEST="INVALID_REQUEST",e.UNAUTHORIZED="UNAUTHORIZED",e.NOT_FOUND="NOT_FOUND",e.TIMEOUT="TIMEOUT",e.UNKNOWN_ERROR="UNKNOWN_ERROR"}(e||(e={}));const t="[Encore SDK]",n=new class{#e="none";setLogLevel(e){this.#e=e}getLogLevel(){return this.#e}debug(...e){"debug"===this.#e&&console.debug(t,...e)}info(...e){"debug"===this.#e&&console.info(t,...e)}warn(...e){"debug"===this.#e&&console.warn(t,...e)}error(...e){"debug"===this.#e&&console.error(t,...e)}critical(...e){console.error(t,"[CRITICAL]",...e)}};class i{#t=null;#n=!1;configure(e){if(this.#n)return n.warn("SDK already configured. Ignoring subsequent configure() call."),!1;const t=this.#i(e);if(t)return n.error("Invalid configuration:",t),!1;const i=e.logLevel??"none",r=e.environment??"production";return this.#t={apiKey:e.apiKey,userId:e.userId,environment:r,baseURL:this.#r(r),logLevel:i,uiConfiguration:e.uiConfiguration??{}},n.setLogLevel(i),this.#n=!0,n.debug("SDK configured successfully",this.#t),!0}#i(e){return e.apiKey&&"string"==typeof e.apiKey&&""!==e.apiKey.trim()?e.environment&&!["production","localhost"].includes(e.environment)?"environment must be 'production' or 'localhost'":e.logLevel&&!["none","debug"].includes(e.logLevel)?"logLevel must be 'none' or 'debug'":null:"apiKey is required and must be a non-empty string"}#r(e){return"localhost"===e?"http://localhost:8080/encore/v1":"https://svc.joinyaw.com/product/encore/v1"}getConfig(){return this.#t}isConfigured(){return this.#n}getApiKey(){return this.#t?.apiKey??null}getBaseURL(){return this.#t?.baseURL??null}getEnvironment(){return this.#t?.environment??null}getUIConfiguration(){return this.#t?.uiConfiguration??{}}reset(){this.#t=null,this.#n=!1,n.debug("Configuration reset")}}const r="encore_";class s{#s;#o;constructor(){this.#o=new Map,this.#s=this.#a(),n.debug(`StorageManager initialized with ${this.#s}`)}#a(){return this.#l("localStorage")?"localStorage":this.#l("sessionStorage")?"sessionStorage":(n.warn("Neither localStorage nor sessionStorage available, using in-memory storage"),"memory")}#l(e){try{const t="localStorage"===e?localStorage:sessionStorage,n="__encore_test__";return t.setItem(n,"test"),t.removeItem(n),!0}catch{return!1}}#c(){return"localStorage"===this.#s?localStorage:"sessionStorage"===this.#s?sessionStorage:this.#o}#d(e){return`${r}${e}`}set(e,t){if(void 0===t)return void n.warn(`Attempted to store undefined value for key: ${e}`);const i=this.#d(e),r=JSON.stringify(t);try{const t=this.#c();t instanceof Map?t.set(i,r):t.setItem(i,r),n.debug(`Stored ${e} in ${this.#s}`)}catch(e){e instanceof Error&&"QuotaExceededError"===e.name?n.error("Storage quota exceeded:",e):n.error("Failed to store item:",e),"memory"!==this.#s&&(n.warn("Falling back to memory storage for this item"),this.#o.set(i,r))}}get(e){const t=this.#d(e);try{const i=this.#c();let r=null;return r=i instanceof Map?i.get(t)??null:i.getItem(t),null===r||"undefined"===r?("undefined"===r&&(n.warn(`Found corrupted value "undefined" for key: ${e}, cleaning up`),this.remove(e)),null):JSON.parse(r)}catch(t){return n.error(`Failed to retrieve ${e}:`,t),this.remove(e),null}}remove(e){const t=this.#d(e);try{const i=this.#c();i instanceof Map?i.delete(t):i.removeItem(t),n.debug(`Removed ${e} from ${this.#s}`)}catch(t){n.error(`Failed to remove ${e}:`,t)}}clear(){try{const e=this.#c();if(e instanceof Map)for(const t of e.keys())t.startsWith(r)&&e.delete(t);else{const t=[];for(let n=0;n<e.length;n++){const i=e.key(n);i?.startsWith(r)&&t.push(i)}t.forEach(t=>e.removeItem(t))}n.debug(`Cleared all Encore data from ${this.#s}`)}catch(e){n.error("Failed to clear storage:",e)}}getStorageType(){return this.#s}}class o{#u;constructor(){this.#u=new Map}on(e,t){this.#u.has(e)||this.#u.set(e,new Set);const i=this.#u.get(e);if(!i)throw new Error(`Failed to get handlers for event '${String(e)}'`);return i.add(t),n.debug(`Event listener added for '${String(e)}'`),()=>{this.off(e,t)}}off(e,t){const i=this.#u.get(e);i&&(i.delete(t),n.debug(`Event listener removed for '${String(e)}'`),0===i.size&&this.#u.delete(e))}emit(e,t){const i=this.#u.get(e);if(i&&0!==i.size){n.debug(`Emitting event '${String(e)}'`,{listenerCount:i.size});for(const r of i)try{r(t)}catch(t){n.error(`Error in event handler for '${String(e)}':`,t)}}}removeAllListeners(e){e?(this.#u.delete(e),n.debug(`All listeners removed for '${String(e)}'`)):(this.#u.clear(),n.debug("All event listeners removed"))}listenerCount(e){return this.#u.get(e)?.size??0}hasListeners(e){const t=this.#u.get(e);return void 0!==t&&t.size>0}}const a="entitlements",l="entitlements_timestamp";class c{#h;#g;#f;#m=null;#p=null;#b;constructor(e,t,n){this.#h=e,this.#g=t,this.#f=n,this.#b=new o,this.#v()}getEventEmitter(){return this.#b}setUserId(e){this.#f!==e&&(n.debug("EntitlementManager: User ID changed, clearing cache"),this.#f=e,this.#m=null,this.#v())}#v(){try{const e=`${this.#f}_${a}`,t=`${this.#f}_${l}`,i=this.#h.get(e),r=this.#h.get(t);i&&r&&(this.#m={entitlements:i,timestamp:r},n.debug("Loaded entitlements from storage",{count:i.length,age:Date.now()-r}))}catch(e){n.error("Failed to load entitlements from storage:",e)}}saveEntitlements(e){try{Array.isArray(e)||(n.warn("saveEntitlements called with non-array value, defaulting to empty array"),e=[]);const t=this.loadEntitlements(),i=Date.now(),r=`${this.#f}_${a}`,s=`${this.#f}_${l}`;this.#h.set(r,e),this.#h.set(s,i),this.#m={entitlements:e,timestamp:i},n.debug("Saved entitlements to storage",{count:e.length}),this.#y(t,e)}catch(e){n.error("Failed to save entitlements to storage:",e)}}#y(e,t){Array.isArray(e)||(e=[]),Array.isArray(t)||(t=[]);const n=new Map;for(const t of e){const e=`${String(t.type)}_${t.scope}`;n.set(e,t)}const i=new Map;for(const e of t){const t=`${String(e.type)}_${e.scope}`;i.set(t,e)}for(const[e,t]of i){const i=n.get(e);i&&JSON.stringify(i)===JSON.stringify(t)||this.#b.emit("entitlementChanged",{entitlementType:this.#x(t),scope:t.scope,isActive:this.#w(t),entitlement:t})}for(const[e,t]of n)i.has(e)||this.#b.emit("entitlementChanged",{entitlementType:this.#x(t),scope:t.scope,isActive:!1})}#x(e){const{scope:t,expiresAt:n,grantedAt:i,transactionId:r,...s}=e;return s}#w(e){return!e.expiresAt||new Date(e.expiresAt)>new Date}loadEntitlements(){return this.#m?.entitlements??[]}isCacheStale(){return!this.#m||Date.now()-this.#m.timestamp>3e5}getCacheAge(){return this.#m?Date.now()-this.#m.timestamp:null}clearCache(){this.#m=null,this.#b.removeAllListeners();const e=`${this.#f}_${a}`,t=`${this.#f}_${l}`;this.#h.remove(e),this.#h.remove(t),n.debug("Cleared entitlement cache")}isActive(e,t="all"){const n=this.loadEntitlements();for(const i of n){const n=this.#x(i);if(this.#E(n,e)&&("verified"!==t||"verified"===i.scope)){if(i.expiresAt&&new Date(i.expiresAt)<=new Date)continue;return!0}}return!1}#E(e,t){return JSON.stringify(e)===JSON.stringify(t)}getActiveEntitlements(e="all"){const t=this.loadEntitlements(),n=new Date;return t.filter(t=>("verified"!==e||"verified"===t.scope)&&!(t.expiresAt&&new Date(t.expiresAt)<=n))}async refreshEntitlements(){if(this.#p)return n.debug("Refresh already in progress, waiting..."),this.#p;this.#p=this.#I();try{await this.#p}finally{this.#p=null}}async#I(){try{n.debug("Refreshing entitlements from API");const e=await this.#g.fetchEntitlements(this.#f);if(!Array.isArray(e))return n.warn("Received non-array entitlements from API, defaulting to empty array"),void this.saveEntitlements([]);this.saveEntitlements(e),n.info("Entitlements refreshed successfully",{count:e.length})}catch(e){n.error("Failed to refresh entitlements, keeping cached version:",e)}}}const d="signal_queue";class u{#h;#g;#f;#C=[];#$=!1;#k;constructor(e,t,n){this.#h=e,this.#g=t,this.#f=n,this.#A(),this.#T(),this.processQueue()}setUserId(e){this.#f!==e&&(n.debug("SignalManager: User ID changed, clearing queue"),this.#f=e,this.#C=[],this.#A())}#A(){try{const e=`${this.#f}_${d}`,t=this.#h.get(e);t&&Array.isArray(t)&&(this.#C=t,n.debug("Loaded grant signal queue from storage",{count:t.length}))}catch(e){n.error("Failed to load grant signal queue from storage:",e)}}#N(){try{const e=`${this.#f}_${d}`;this.#h.set(e,this.#C),n.debug("Saved grant signal queue to storage",{count:this.#C.length})}catch(e){n.error("Failed to save grant signal queue to storage:",e)}}enqueue(e,t){const i=this.#C.some(n=>n.transactionId===e&&n.grantType===t);if(i)return void n.debug("Grant signal already in queue, skipping",{transactionId:e,grantType:t});const r={transactionId:e,grantType:t,timestamp:(new Date).toISOString(),attempts:0};this.#C.push(r),this.#N(),n.info("Grant signal added to queue",{transactionId:e,grantType:t})}dequeue(e){const t=this.#C.findIndex(t=>t.transactionId===e.transactionId&&t.grantType===e.grantType);-1!==t&&(this.#C.splice(t,1),this.#N(),n.debug("Grant signal removed from queue",{transactionId:e.transactionId,grantType:e.grantType}))}getQueue(){return[...this.#C]}clearQueue(){this.#C=[],this.#N(),n.debug("Grant signal queue cleared")}async sendGrantSignal(e,t){try{if(n.debug("Sending grant signal",{transactionId:e,grantType:t}),!await this.#g.sendGrantSignal(e,t))throw new Error("Grant signal failed (returned false)");n.info("Grant signal sent successfully",{transactionId:e,grantType:t})}catch{n.warn("Failed to send grant signal, adding to queue",{transactionId:e,grantType:t}),this.enqueue(e,t)}}async processQueue(){if(this.#$)n.debug("Queue processing already in progress, skipping");else if(0!==this.#C.length){this.#$=!0,n.info("Processing grant signal queue",{count:this.#C.length});try{for(const e of[...this.#C])await this.#S(e),this.#C.length>1&&await this.#R(100)}finally{this.#$=!1}}}async#S(e){if(e.attempts>=3)return n.error("Grant signal max attempts reached, removing from queue",{transactionId:e.transactionId,grantType:e.grantType,attempts:e.attempts}),void this.dequeue(e);if(e.lastAttemptAt){const t=new Date(e.lastAttemptAt).getTime(),i=Date.now(),r=1e3*Math.pow(2,e.attempts-1),s=i-t;if(s<r)return void n.debug("Skipping signal, waiting for backoff period",{transactionId:e.transactionId,remainingWait:r-s})}e.attempts++,e.lastAttemptAt=(new Date).toISOString(),this.#N();try{n.debug("Attempting to send queued grant signal",{transactionId:e.transactionId,grantType:e.grantType,attempt:e.attempts}),await this.#g.sendGrantSignal(e.transactionId,e.grantType)?(n.info("Queued grant signal sent successfully",{transactionId:e.transactionId,grantType:e.grantType}),this.dequeue(e)):n.warn("Grant signal failed, will retry",{transactionId:e.transactionId,attempt:e.attempts})}catch(t){n.warn("Failed to send queued grant signal, will retry",{transactionId:e.transactionId,attempt:e.attempts,error:t})}}#T(){this.#k=function(e){const t=()=>{n.debug("Network status: online"),e()};return window.addEventListener("online",t),()=>{window.removeEventListener("online",t)}}(()=>{n.debug("Network came online, processing grant signal queue"),this.processQueue()})}destroy(){this.#k&&(this.#k(),this.#k=void 0)}#R(e){return new Promise(t=>setTimeout(t,e))}}class h{#g;#f;#L=[];#D=null;#O=null;constructor(e,t){this.#g=e,this.#f=t}async fetchOffers(e,t=!0){if(t&&this.#L.length>0&&this.#O)return n.debug("Using cached offers",{count:this.#L.length}),{offers:[...this.#L],uiConfiguration:this.#D??void 0};try{n.debug("Fetching offers from API",{userId:this.#f});const t=await this.#g.fetchOffers(this.#f,e);return 0===t.offers?.length?(n.info("No offers available for user"),this.#L=[],this.#D=t.uiConfiguration??null,this.#O=Date.now(),{offers:[],uiConfiguration:t.uiConfiguration}):(this.#L=t.offers,this.#D=t.uiConfiguration??null,this.#O=Date.now(),n.info("Offers fetched successfully",{count:t.offers.length,offerIds:t.offers.map(e=>e.id)}),{offers:[...t.offers],uiConfiguration:t.uiConfiguration})}catch(e){throw n.error("Failed to fetch offers",e),e}}logImpression(e,t){try{const i=window.location.hostname;n.debug("Logging impression",{impressionId:e,campaignId:t.campaignId,creativeId:t.creativeId,appBundleId:i}),this.#g.logImpression(e,this.#f,t.campaignId,t.creativeId,i).then(t=>{t&&n.debug("Impression logged successfully",{impressionId:e})}).catch(t=>{n.error("Failed to log impression (non-blocking)",{impressionId:e,error:t})})}catch(t){n.error("Failed to log impression (non-blocking)",{impressionId:e,error:t})}}async startTransaction(e,t,i){try{n.debug("Starting transaction",{campaignId:e,creativeId:t,impressionId:i});const r=await this.#g.startTransaction(e,this.#f,t,i);return n.info("Transaction started",{transactionId:r,campaignId:e,creativeId:t}),r}catch(i){throw n.error("Failed to start transaction",{campaignId:e,creativeId:t,error:i}),i}}clearCache(){this.#L=[],this.#O=null,n.debug("Offer cache cleared")}setUserId(e){this.#f=e,this.clearCache(),n.debug("OfferManager user ID updated",{userId:e})}}class g{#g;#M;#U;#F=0;#q=1e3;#B=8e3;#K=null;#P=!1;constructor(e,t){this.#g=e,this.#M=t.transactionId,this.#U=t.timeout??3e4}async poll(){return this.#P?(n.warn("Verification polling already in progress",{transactionId:this.#M}),"pending"):(this.#P=!0,this.#F=Date.now(),n.debug("Starting verification polling",{transactionId:this.#M,timeout:this.#U}),this.#_())}stop(){this.#P=!1,null!==this.#K&&(clearTimeout(this.#K),this.#K=null),n.debug("Verification polling stopped",{transactionId:this.#M})}async#_(){for(;this.#P;){const e=Date.now()-this.#F;if(e>=this.#U)return n.warn("Verification polling timeout",{transactionId:this.#M,elapsed:e}),this.stop(),"pending";try{const e=await this.#g.checkVerificationStatus(this.#M);if(n.debug("Verification status checked",{transactionId:this.#M,status:e.status}),"verified"===e.status)return n.info("Transaction verified",{transactionId:this.#M,verifiedAt:e.verifiedAt}),this.stop(),"verified";if("failed"===e.status)return n.warn("Transaction failed verification",{transactionId:this.#M}),this.stop(),"failed";await this.#R(this.#q),this.#q=Math.min(2*this.#q,this.#B)}catch(e){n.error("Error checking verification status",{transactionId:this.#M,error:e}),await this.#R(this.#q)}}return"pending"}async#R(e){return new Promise(t=>{this.#K=window.setTimeout(()=>{this.#K=null,t()},e)})}}class f{#z=null;#G=null;#j=null;#H;constructor(e){this.#H=e}onGranted(e){return this.#z=e,this}onNotGranted(e){return this.#G=e,this}onLoadingStateChange(e){return this.#j=e,this}async show(){try{this.#j&&this.#j(!0),n.debug("PlacementBuilder: Executing presentation");const e=await this.#H();return this.#j&&this.#j(!1),e.granted&&e.entitlement&&this.#z?this.#z(e.entitlement):!e.granted&&this.#G&&e.reason&&this.#G(e.reason),e}catch(t){this.#j&&this.#j(!1),n.error("PlacementBuilder: Error during presentation",t);const i={type:"error",error:{code:e.UNKNOWN_ERROR,message:t instanceof Error?t.message:"Unknown error"}};return this.#G&&this.#G(i),{granted:!1,reason:i}}}}function m(e,t){let n=e;for(const[e,i]of Object.entries(t))n=n.replace(`:${e}`,encodeURIComponent(i));return n}class p{#V;#Q;#W;constructor(e,t){this.#V=e,this.#Q=t,this.#W=new Map}setApiKey(e){this.#V=e}setBaseURL(e){this.#Q=e}async get(e,t){return this.#J({url:`${this.#Q}${e}`,options:{method:"GET",...t},apiKey:this.#V})}async post(e,t,n){return this.#J({url:`${this.#Q}${e}`,options:{method:"POST",body:t,...n},apiKey:this.#V})}async#J(e){const{url:t,options:i,apiKey:r}=e,s=this.#Y(t,i),o=this.#W.get(s);if(o)return n.debug("Deduplicating request:",t),o;const a=this.#Z(t,i,r);this.#W.set(s,a);try{return await a}finally{this.#W.delete(s)}}async#Z(e,t,i){const r=t.retries??3;let s=null;for(let o=0;o<=r;o++)try{if(o>0){const e=1e3*Math.pow(2,o-1);n.debug(`Retrying request (attempt ${o}/${r}) after ${e}ms`),await this.#R(e)}return await this.#X(e,t,i)}catch(e){if(s=e,this.#ee(e))throw e;if(o===r)throw n.error(`Request failed after ${r} retries:`,e),e;n.warn("Request failed, will retry:",e)}throw s??new Error("Request failed")}async#X(e,t,i){const r=t.timeout??3e4,s=new AbortController,o=setTimeout(()=>s.abort(),r);try{const r={"X-API-Key":i,"Content-Type":"application/json","User-Agent":"Encore-Web-SDK/1.0.0",...t.headers},o={method:t.method,headers:r,signal:s.signal};t.body&&(o.body=JSON.stringify(t.body)),n.debug(`${t.method} ${e}`);const a=await fetch(e,o);return a.ok||await this.#te(a),await a.json()}catch(e){if(e instanceof Error){if("AbortError"===e.name)throw new Error("Request timeout");if(this.#ne(e))throw new Error(`Network error: ${e.message}`)}if(e instanceof Error)throw e;throw new Error(String(e))}finally{clearTimeout(o)}}async#te(t){let n,i=`HTTP ${t.status}: ${t.statusText}`;try{const e=await t.json();if("object"==typeof e&&null!==e&&"error"in e&&"object"==typeof e.error&&null!==e.error){const t=e.error;i=("string"==typeof t.message?t.message:void 0)??i,n="string"==typeof t.code?t.code:void 0}}catch{}const r=n?{code:n,message:i}:{code:e.API_ERROR,statusCode:t.status,message:i},s=new Error(i);throw Object.assign(s,r),s}#ee(e){if("object"==typeof e&&null!==e&&"statusCode"in e&&void 0!==e.statusCode){const t=e.statusCode;return t>=400&&t<500}return!1}#ne(e){return e.message.includes("fetch")||e.message.includes("network")||e.message.includes("ECONNREFUSED")||e.message.includes("ETIMEDOUT")}#Y(e,t){const n=t.body?JSON.stringify(t.body):"";return`${t.method}:${e}:${n}`}#R(e){return new Promise(t=>setTimeout(t,e))}async fetchOffers(e,t){try{const n=await this.post("/offers/show",{userId:e,attributes:t}),i=[];for(const e of n.offers){const t=e.campaign;for(const e of t.creatives){const n={id:e.id,title:e.title,description:e.quickInstructions||e.subtitle||e.description||"",imageUrl:e.primaryImageUrl,ctaText:e.ctaText,advertiserUrl:e.destinationUrl,campaignId:t.id,creativeId:e.id,entitlement:{type:"credit",value:100,unit:"dollars"},...t.merchantName&&{merchantName:t.merchantName},...e.logoUrl&&{logoUrl:e.logoUrl},...e.instructions&&{instructions:e.instructions},...e.quickInstructions&&{quickInstructions:e.quickInstructions},...e.trackingParameters&&{trackingParameters:e.trackingParameters}};i.push(n)}}return{offers:i,uiConfiguration:n.uiConfiguration}}catch(e){throw n.error("Failed to fetch offers:",e),e}}async startTransaction(e,t,i,r){try{return(await this.post("/transactions/start",{campaignId:e,userId:t,creativeId:i,...r&&{impressionId:r}})).transactionId}catch(e){throw n.error("Failed to start transaction:",e),e}}async sendGrantSignal(e,t){try{const n=function(e){return m("/transactions/:id/grant",{id:e})}(e);return(await this.post(n,{transactionId:e,grantType:t,timestamp:(new Date).toISOString()})).success}catch(e){throw n.error("Failed to send grant signal:",e),e}}#ie(e){switch(e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())){case"freeTrial":return{type:"freeTrial"};case"discount":return{type:"discount"};case"credit":return{type:"credit"};default:return n.warn(`Unknown entitlement type: ${e}, treating as freeTrial`),{type:"freeTrial"}}}async fetchEntitlements(e){try{const t=await this.get(`/entitlements?userId=${encodeURIComponent(e)}`),i=[];if(t.provisional)for(const[e,n]of Object.entries(t.provisional)){const t=this.#ie(e);i.push({...t,transactionId:"",scope:"provisional",grantedAt:n.started_at,expiresAt:n.expires_at})}if(t.verified)for(const[e,n]of Object.entries(t.verified)){const t=this.#ie(e);i.push({...t,transactionId:"",scope:"verified",grantedAt:n.started_at,expiresAt:n.expires_at})}return n.debug("Transformed entitlements response",{provisionalCount:Object.keys(t.provisional||{}).length,verifiedCount:Object.keys(t.verified||{}).length,totalCount:i.length}),i}catch(e){throw n.error("Failed to fetch entitlements:",e),e}}async checkVerificationStatus(e){try{const t=function(e){return m("/verification/status/:id",{id:e})}(e);return await this.get(t)}catch(e){throw n.error("Failed to check verification status:",e),e}}async logImpression(e,t,i,r,s){try{return(await this.post("/impressions/log",{impressionId:e,userId:t,campaignId:i,creativeId:r,appBundleId:s})).success}catch(e){return n.warn("Failed to log impression (non-blocking):",e),!1}}}const b="encore-sdk-styles",v="encore-";function y(e={}){if(document.getElementById(b))n.debug("Encore styles already injected");else try{const t=document.createElement("style");t.id=b,t.textContent=function(e={}){const t=function(e){const t=[];return e.primaryColor&&t.push(`--encore-primary-color: ${e.primaryColor};`),e.backgroundColor&&t.push(`--encore-bg-color: ${e.backgroundColor};`),e.textColor&&t.push(`--encore-text-color: ${e.textColor};`),e.borderRadius&&t.push(`--encore-border-radius: ${e.borderRadius};`),e.fontFamily&&t.push(`--encore-font-family: ${e.fontFamily};`),t.join("\n ")}(e);return`\n /* CSS Custom Properties (Theme Variables) */\n :root {\n ${t||"/* No custom theme variables */"}\n --encore-primary-color: ${e.primaryColor??"#4F46E5"};\n --encore-bg-color: ${e.backgroundColor??"#ffffff"};\n --encore-text-color: ${e.textColor??"#1F2937"};\n --encore-border-radius: ${e.borderRadius??"12px"};\n --encore-font-family: ${e.fontFamily??'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'};\n }\n\n /* Backdrop */\n .${v}backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(2px);\n z-index: 9998;\n opacity: 0;\n transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .${v}backdrop.${v}visible {\n opacity: 1;\n }\n\n /* Modal Container */\n .${v}modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 9999;\n background-color: var(--encore-bg-color);\n border-radius: 20px;\n box-shadow: 0 24px 48px -12px rgba(0, 0, 0, 0.18), 0 12px 24px -8px rgba(0, 0, 0, 0.08);\n max-width: 800px;\n max-height: 90vh;\n width: calc(100% - 32px);\n overflow-x: hidden;\n overflow-y: auto;\n opacity: 0;\n transform: translate(-50%, -50%) scale(0.96);\n transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1);\n font-family: var(--encore-font-family);\n color: var(--encore-text-color);\n }\n\n .${v}modal.${v}visible {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n /* Close Button */\n .${v}close-button {\n position: absolute;\n top: 20px;\n right: 20px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(255, 255, 255, 0.9);\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #9CA3AF;\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n padding: 0;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n z-index: 10;\n }\n\n .${v}close-button:hover {\n background-color: #FFFFFF;\n color: #6B7280;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n transform: scale(1.05);\n }\n\n .${v}close-button:active {\n transform: scale(0.98);\n }\n\n .${v}close-button:focus {\n outline: 2px solid var(--encore-primary-color);\n outline-offset: 2px;\n }\n\n .${v}close-button svg {\n width: 18px;\n height: 18px;\n }\n\n /* Body scroll lock */\n body.${v}no-scroll {\n overflow: hidden;\n }\n\n /* Modal Header */\n .${v}modal-header {\n padding: 24px 24px 16px;\n border-bottom: 1px solid #E5E7EB;\n }\n\n .${v}modal-title {\n margin: 0;\n font-size: 24px;\n font-weight: 700;\n line-height: 1.25;\n color: var(--encore-text-color);\n }\n\n .${v}modal-subtitle {\n margin: 8px 0 0;\n font-size: 14px;\n color: #6B7280;\n line-height: 1.5;\n }\n\n /* Modal Body */\n .${v}modal-body {\n padding: 0;\n position: relative;\n isolation: isolate;\n }\n\n /* Carousel Container */\n .${v}carousel {\n display: flex;\n flex-direction: column;\n overflow: visible;\n }\n\n /* Carousel Header */\n .${v}carousel-header {\n padding: 36px 36px 28px;\n text-align: center;\n border-bottom: 1px solid #E5E7EB;\n }\n\n .${v}carousel-title {\n font-size: 30px;\n font-weight: 600;\n line-height: 1.15;\n color: #111827;\n margin: 0 0 14px 0;\n letter-spacing: -0.02em;\n }\n\n .${v}carousel-subtitle {\n font-size: 16px;\n line-height: 1.5;\n color: #4B5563;\n margin: 0;\n font-weight: 400;\n }\n\n /* Carousel Cards Container - Horizontal Scroll */\n .${v}carousel-cards {\n display: flex;\n flex-direction: row;\n overflow-x: auto;\n overflow-y: hidden;\n scroll-behavior: smooth;\n scroll-snap-type: x mandatory;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n gap: 20px;\n padding: 20px 80px;\n position: relative;\n }\n\n .${v}carousel-cards::-webkit-scrollbar {\n display: none;\n }\n\n /* Carousel Item Wrapper */\n .${v}carousel-item {\n flex: 0 0 calc(100% - 40px);\n max-width: 640px;\n scroll-snap-align: center;\n scroll-snap-stop: always;\n opacity: 0.4;\n transition: all 400ms cubic-bezier(0.4, 0, 0.2, 1);\n filter: blur(1px);\n pointer-events: auto;\n }\n\n /* Active carousel item */\n .${v}carousel-item.${v}active {\n opacity: 1;\n filter: blur(0);\n z-index: 1;\n }\n\n /* Offer Card */\n .${v}offer-card {\n display: flex;\n flex-direction: column;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n height: 100%;\n }\n\n /* Offer Banner */\n .${v}offer-banner {\n width: 100%;\n background-color: transparent;\n position: relative;\n padding: 20px 20px 0;\n }\n\n .${v}offer-banner-image {\n width: 100%;\n height: auto;\n display: block;\n border-radius: 16px;\n object-fit: contain;\n background-color: #F9FAFB;\n opacity: 0;\n transition: opacity 200ms ease-out;\n }\n\n .${v}offer-banner-image.${v}loaded {\n opacity: 1;\n }\n\n /* Info button on banner */\n .${v}banner-info-button {\n position: absolute;\n top: 32px;\n right: 32px;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background-color: rgba(255, 255, 255, 0.95);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n transition: all 150ms ease;\n }\n\n .${v}banner-info-button:hover {\n background-color: #FFFFFF;\n transform: scale(1.05);\n }\n\n .${v}banner-info-button svg {\n width: 16px;\n height: 16px;\n color: #6B7280;\n }\n\n /* Offer Details */\n .${v}offer-details {\n padding: 28px 36px;\n }\n\n .${v}offer-details-heading {\n font-size: 13px;\n font-weight: 600;\n color: #9CA3AF;\n margin: 0 0 18px 0;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n }\n\n .${v}offer-details-list {\n list-style: disc;\n margin: 0;\n padding: 0 0 0 22px;\n }\n\n .${v}offer-details-list li {\n font-size: 15px;\n line-height: 1.6;\n color: #1F2937;\n margin-bottom: 10px;\n padding-left: 4px;\n }\n\n .${v}offer-details-list li:last-child {\n margin-bottom: 0;\n }\n\n .${v}offer-details-list li::marker {\n color: #D1D5DB;\n font-size: 0.8em;\n }\n\n /* Offer Footer */\n .${v}offer-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24px 36px 30px;\n border-top: 1px solid #E5E7EB;\n gap: 16px;\n }\n\n /* Offer Merchant */\n .${v}offer-merchant {\n display: flex;\n align-items: center;\n gap: 14px;\n flex: 1;\n min-width: 0;\n }\n\n .${v}offer-logo {\n width: 52px;\n height: 52px;\n border-radius: 10px;\n object-fit: contain;\n background-color: #F3F4F6;\n padding: 6px;\n flex-shrink: 0;\n opacity: 0;\n transition: opacity 200ms ease-out;\n }\n\n .${v}offer-logo.${v}loaded {\n opacity: 1;\n }\n\n .${v}offer-merchant-text {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n min-width: 0;\n }\n\n .${v}offer-merchant-name {\n font-size: 16px;\n font-weight: 600;\n color: var(--encore-text-color);\n line-height: 1.2;\n }\n\n .${v}offer-merchant-desc {\n font-size: 14px;\n color: #6B7280;\n line-height: 1.4;\n }\n\n /* Claim Button */\n .${v}button-claim {\n padding: 14px 36px;\n font-size: 15px;\n font-weight: 600;\n border-radius: 28px;\n border: none;\n background: linear-gradient(135deg, #5B68EF 0%, #6B7CF9 100%);\n color: white;\n cursor: pointer;\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n font-family: var(--encore-font-family);\n white-space: nowrap;\n box-shadow: 0 2px 8px rgba(91, 104, 239, 0.25);\n }\n\n .${v}button-claim:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(91, 104, 239, 0.35);\n background: linear-gradient(135deg, #6B7CF9 0%, #7B8CFF 100%);\n }\n\n .${v}button-claim:active {\n transform: translateY(0);\n box-shadow: 0 2px 8px rgba(91, 104, 239, 0.25);\n }\n\n .${v}button-claim:focus {\n outline: 2px solid #5B68EF;\n outline-offset: 2px;\n }\n\n .${v}button-claim:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n\n /* Carousel Navigation */\n .${v}carousel-navigation {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 20px;\n padding: 28px 32px 32px;\n border-top: 1px solid #E5E7EB;\n }\n\n .${v}nav-button {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n border: 2px solid #E5E7EB;\n background-color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #6B7280;\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n padding: 0;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n }\n\n .${v}nav-button:hover:not(:disabled) {\n background-color: #F9FAFB;\n border-color: #D1D5DB;\n color: #374151;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\n transform: scale(1.05);\n }\n\n .${v}nav-button:active:not(:disabled) {\n transform: scale(0.98);\n }\n\n .${v}nav-button:focus {\n outline: 2px solid #5B68EF;\n outline-offset: 2px;\n }\n\n .${v}nav-button svg {\n width: 20px;\n height: 20px;\n stroke-width: 2.5;\n }\n\n .${v}nav-button:disabled,\n .${v}nav-button.${v}disabled {\n opacity: 0.25;\n cursor: not-allowed;\n border-color: #E5E7EB;\n color: #D1D5DB;\n }\n\n .${v}nav-button:disabled:hover,\n .${v}nav-button.${v}disabled:hover {\n background-color: white;\n border-color: #E5E7EB;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n transform: none;\n }\n\n /* Loading State */\n .${v}loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 48px;\n }\n\n .${v}spinner {\n width: 40px;\n height: 40px;\n border: 3px solid #E5E7EB;\n border-top-color: var(--encore-primary-color);\n border-radius: 50%;\n animation: ${v}spin 0.8s linear infinite;\n }\n\n @keyframes ${v}spin {\n to { transform: rotate(360deg); }\n }\n\n /* Responsive: Mobile (0-767px) */\n @media (max-width: 767px) {\n .${v}modal {\n width: calc(100% - 24px);\n max-width: 100%;\n margin: 12px;\n }\n\n .${v}carousel-header {\n padding: 24px 20px 20px;\n }\n\n .${v}carousel-title {\n font-size: 22px;\n }\n\n .${v}carousel-subtitle {\n font-size: 14px;\n }\n\n .${v}carousel-cards {\n padding: 20px 40px;\n }\n\n .${v}carousel-item {\n flex: 0 0 calc(100% - 80px);\n }\n\n .${v}offer-banner {\n padding: 16px 16px 0;\n }\n\n .${v}offer-details {\n padding: 20px 20px;\n }\n\n .${v}offer-footer {\n padding: 16px 20px 24px;\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .${v}offer-merchant {\n flex: 1 1 100%;\n }\n\n .${v}button-claim {\n flex: 1 1 100%;\n }\n\n .${v}carousel-navigation {\n padding: 20px 20px 24px;\n }\n }\n\n /* Responsive: Tablet (768-1023px) */\n @media (min-width: 768px) and (max-width: 1023px) {\n .${v}modal {\n max-width: 600px;\n }\n }\n\n /* Responsive: Desktop (1024px+) */\n @media (min-width: 1024px) {\n .${v}modal {\n max-width: 600px;\n }\n }\n\n /* Accessibility: High Contrast Mode */\n @media (prefers-contrast: high) {\n .${v}button {\n border: 2px solid currentColor;\n }\n }\n\n /* Accessibility: Reduced Motion */\n @media (prefers-reduced-motion: reduce) {\n .${v}backdrop,\n .${v}modal,\n .${v}button,\n .${v}close-button {\n transition: none;\n }\n\n .${v}spinner {\n animation: none;\n }\n }\n\n /* Focus Visible (for keyboard navigation) */\n .${v}button:focus-visible,\n .${v}close-button:focus-visible {\n outline: 2px solid var(--encore-primary-color);\n outline-offset: 2px;\n }\n\n /* ===== Success Screen ===== */\n .${v}success-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n min-height: 400px;\n animation: ${v}fade-in 0.3s ease-out;\n }\n\n .${v}success-icon {\n width: 80px;\n height: 80px;\n background: linear-gradient(135deg, var(--encore-primary-color), #10b981);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 48px;\n color: white;\n margin-bottom: 1.5rem;\n animation: ${v}scale-in 0.5s ease-out;\n }\n\n .${v}success-title {\n font-size: 1.75rem;\n font-weight: 700;\n color: var(--encore-text-color);\n margin: 0 0 0.75rem 0;\n }\n\n .${v}success-subtitle {\n font-size: 1.125rem;\n color: var(--encore-text-muted);\n margin: 0 0 2rem 0;\n line-height: 1.6;\n }\n\n .${v}success-details {\n background: rgba(79, 70, 229, 0.05);\n border-radius: 12px;\n padding: 1.5rem;\n margin-bottom: 2rem;\n min-width: 280px;\n }\n\n .${v}success-detail {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.5rem 0;\n }\n\n .${v}success-detail:not(:last-child) {\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n }\n\n .${v}success-detail-label {\n font-size: 0.875rem;\n color: var(--encore-text-muted);\n font-weight: 500;\n }\n\n .${v}success-detail-value {\n font-size: 1rem;\n color: var(--encore-text-color);\n font-weight: 600;\n }\n\n .${v}success-button {\n background: linear-gradient(135deg, var(--encore-primary-color), #10b981);\n color: white;\n border: none;\n border-radius: var(--encore-border-radius);\n padding: 0.875rem 2.5rem;\n font-size: 1rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n }\n\n .${v}success-button:hover {\n transform: translateY(-2px);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n }\n\n .${v}success-button:active {\n transform: translateY(0);\n }\n\n .${v}success-button:focus-visible {\n outline: 2px solid var(--encore-primary-color);\n outline-offset: 2px;\n }\n\n @keyframes ${v}scale-in {\n from {\n transform: scale(0);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n `}(e),document.head.appendChild(t),n.debug("Encore styles injected successfully")}catch(e){n.error("Failed to inject Encore styles:",e)}}function x(e){return`${v}${e}`}class w{#b;#re=null;#se=null;#oe=null;#ae=null;#le=!1;#ce=null;#de=[];#ue=null;constructor(e={}){this.#b=new o,y(e)}show(){this.#le?n.warn("Modal is already visible"):(this.#ce=document.activeElement,this.#he(),this.#re&&document.body.appendChild(this.#re),this.#se&&document.body.appendChild(this.#se),document.body.classList.add(x("no-scroll")),requestAnimationFrame(()=>{this.#re?.classList.add(x("visible")),this.#se?.classList.add(x("visible"))}),this.#ge(),this.#fe(),this.#me(),this.#le=!0,this.#b.emit("show",void 0),n.debug("Modal shown"))}hide(){this.#le&&(this.#re?.classList.remove(x("visible")),this.#se?.classList.remove(x("visible")),setTimeout(()=>{this.#pe(),document.body.classList.remove(x("no-scroll")),this.#ce instanceof HTMLElement&&this.#ce.focus(),this.#le=!1,this.#b.emit("hide",void 0),n.debug("Modal hidden")},200))}isVisible(){return this.#le}setContent(e){this.#ae?(this.#ae.innerHTML="",this.#ae.appendChild(e),this.#fe()):n.error("Modal body not initialized")}on(e,t){return this.#b.on(e,t)}#he(){this.#re=document.createElement("div"),this.#re.className=x("backdrop"),this.#re.setAttribute("aria-hidden","true"),this.#se=document.createElement("div"),this.#se.className=x("modal"),this.#se.setAttribute("role","dialog"),this.#se.setAttribute("aria-modal","true"),this.#se.setAttribute("aria-labelledby",x("modal-title")),this.#oe=document.createElement("button"),this.#oe.className=x("close-button"),this.#oe.setAttribute("aria-label","Close modal"),this.#oe.innerHTML='\n <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />\n </svg>\n ',this.#ae=document.createElement("div"),this.#ae.className=x("modal-body"),this.#se.appendChild(this.#oe),this.#se.appendChild(this.#ae)}#pe(){this.#re?.remove(),this.#se?.remove(),this.#re=null,this.#se=null,this.#oe=null,this.#ae=null}#ge(){this.#oe?.addEventListener("click",()=>{this.#b.emit("close",void 0),this.hide()}),this.#re?.addEventListener("click",()=>{this.#b.emit("backdropClick",void 0),this.hide()}),this.#ue=this.#be.bind(this),document.addEventListener("keydown",this.#ue)}#be(e){if(this.#le)switch(e.key){case"Escape":e.preventDefault(),this.#b.emit("close",void 0),this.hide();break;case"Tab":e.preventDefault(),this.#ve(e.shiftKey)}}#ve(e){if(0===this.#de.length)return;const t=this.#de.findIndex(e=>e===document.activeElement);let n;n=e?t<=0?this.#de.length-1:t-1:t>=this.#de.length-1?0:t+1,this.#de[n]?.focus()}#fe(){if(!this.#se)return;const e=["button:not([disabled])","a[href]","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(", ");this.#de=Array.from(this.#se.querySelectorAll(e))}#me(){this.#de.length>0&&this.#de[0]?.focus()}destroy(){this.#ue&&document.removeEventListener("keydown",this.#ue),this.#b.removeAllListeners(),this.hide()}}class E{#b;#ye=null;#xe=null;constructor(){this.#b=new o}render(e){this.#ye=e,this.#xe=document.createElement("div"),this.#xe.className=x("offer-card");const t=this.#we(e.imageUrl,e.title);this.#xe.appendChild(t);const n=this.#Ee(e);this.#xe.appendChild(n);const i=this.#Ie(e);return this.#xe.appendChild(i),this.#xe}on(e,t){return this.#b.on(e,t)}#we(e,t){const i=document.createElement("div");i.className=x("offer-banner");const r=document.createElement("img");return r.className=x("offer-banner-image"),r.alt=t??"Offer image",e?(r.src=e,r.complete?r.classList.add(x("loaded")):r.onload=()=>{r.classList.add(x("loaded"))},r.onerror=()=>{n.warn("Failed to load offer image, using fallback"),r.src=this.#Ce(),r.classList.add(x("loaded"))}):(r.src=this.#Ce(),r.classList.add(x("loaded"))),i.appendChild(r),i}#Ce(){return`data:image/svg+xml;base64,${btoa('\n <svg xmlns="http://www.w3.org/2000/svg" width="600" height="240" viewBox="0 0 600 240">\n <rect width="600" height="240" fill="#E5E7EB"/>\n <text x="50%" y="50%" text-anchor="middle" dy=".3em" fill="#9CA3AF" font-family="sans-serif" font-size="18">\n Offer Image\n </text>\n </svg>\n ')}`}#Ee(e){const t=document.createElement("div");t.className=x("offer-details");const n=document.createElement("h3");n.className=x("offer-details-heading"),n.textContent="Offer details";const i=document.createElement("ul");if(i.className=x("offer-details-list"),e.instructions&&e.instructions.length>0)e.instructions.forEach(e=>{const t=document.createElement("li");t.textContent=e.subtitle||e.title,i.appendChild(t)});else if(e.description){const t=document.createElement("li");t.textContent=e.description,i.appendChild(t)}return t.appendChild(n),t.appendChild(i),t}#Ie(e){const t=document.createElement("div");t.className=x("offer-footer");const i=document.createElement("div");if(i.className=x("offer-merchant"),e.logoUrl){const t=document.createElement("img");t.className=x("offer-logo"),t.src=e.logoUrl,t.alt=`${e.merchantName??"Merchant"} logo`,t.complete?t.classList.add(x("loaded")):t.onload=()=>{t.classList.add(x("loaded"))},t.onerror=()=>{n.warn("Failed to load merchant logo",{merchantName:e.merchantName}),t.style.display="none"},i.appendChild(t)}const r=document.createElement("div");if(r.className=x("offer-merchant-text"),e.merchantName){const t=document.createElement("div");t.className=x("offer-merchant-name"),t.textContent=e.merchantName,r.appendChild(t)}if(e.quickInstructions){const t=document.createElement("div");t.className=x("offer-merchant-desc"),t.textContent=e.quickInstructions,r.appendChild(t)}i.appendChild(r);const s=document.createElement("button");return s.className=`${x("button")} ${x("button-claim")}`,s.textContent=e.ctaText??"Claim",s.setAttribute("aria-label",`Claim offer: ${e.title??"offer"}`),s.addEventListener("click",()=>{this.#ye&&this.#b.emit("claim",{offer:this.#ye})}),t.appendChild(i),t.appendChild(s),t}destroy(){this.#b.removeAllListeners(),this.#xe=null,this.#ye=null}}class I{#b;#$e;#ke=0;#xe=null;#Ae=null;#Te=null;#Ne=[];#Se=null;#Re=null;constructor(e){if(this.#b=new o,this.#$e=e,0===e.length)throw new Error("OfferCarousel requires at least one offer");this.#Le()}render(){this.#xe=document.createElement("div"),this.#xe.className=x("carousel"),this.#Se=document.createElement("div"),this.#Se.setAttribute("role","status"),this.#Se.setAttribute("aria-live","polite"),this.#Se.setAttribute("aria-atomic","true"),this.#Se.className="sr-only",this.#Se.style.position="absolute",this.#Se.style.width="1px",this.#Se.style.height="1px",this.#Se.style.padding="0",this.#Se.style.margin="-1px",this.#Se.style.overflow="hidden",this.#Se.style.clip="rect(0, 0, 0, 0)",this.#Se.style.whiteSpace="nowrap",this.#Se.style.border="0";const e=this.#De();if(this.#xe.appendChild(e),this.#Ae=document.createElement("div"),this.#Ae.className=x("carousel-cards"),this.#xe.appendChild(this.#Se),this.#xe.appendChild(this.#Ae),this.#$e.length>1){const e=this.#Oe();this.#xe.appendChild(e)}return this.#Me(),this.#Ue(),this.#Fe(0,!1),this.#xe}on(e,t){return this.#b.on(e,t)}getCurrentIndex(){return this.#ke}getTotalOffers(){return this.#$e.length}next(){this.#ke<this.#$e.length-1&&(this.#ke++,this.#Fe(this.#ke),this.#qe(),this.#Be(`Showing offer ${this.#ke+1} of ${this.#$e.length}`),n.debug(`Navigated to offer ${this.#ke+1}`))}previous(){this.#ke>0&&(this.#ke--,this.#Fe(this.#ke),this.#qe(),this.#Be(`Showing offer ${this.#ke+1} of ${this.#$e.length}`),n.debug(`Navigated to offer ${this.#ke+1}`))}#Me(){if(!this.#Ae)return;const e=this.#Ae;this.#$e.forEach((t,n)=>{const i=new E,r=i.render(t),s=document.createElement("div");s.className=x("carousel-item"),s.setAttribute("data-index",n.toString()),s.appendChild(r),i.on("claim",()=>{this.#b.emit("offerClaim",{offer:t,index:n})}),this.#Ne.push(i),e.appendChild(s)}),requestAnimationFrame(()=>{e.classList.add(x("cards-ready"))})}#Fe(e,t=!0){if(!this.#Ae)return;const n=this.#Ae.querySelectorAll(`.${x("carousel-item")}`),i=n[e];if(i){i.scrollIntoView({behavior:t?"smooth":"auto",block:"nearest",inline:"center"}),n.forEach((t,n)=>{n===e?t.classList.add(x("active")):t.classList.remove(x("active"))});const r=this.#$e[e];r&&this.#b.emit("offerView",{offer:r,index:e})}}#De(){const e=document.createElement("div");e.className=x("carousel-header");const t=document.createElement("h2");t.className=x("carousel-title"),t.id=x("modal-title"),t.textContent="Unlock 10 free articles – choose an offer below";const n=document.createElement("p");return n.className=x("carousel-subtitle"),n.textContent="Activate one of these partner offers and get 10 free articles. No credit card required.",e.appendChild(t),e.appendChild(n),e}#Oe(){const e=document.createElement("div");e.className=x("carousel-navigation");const t=document.createElement("button");t.className=x("nav-button"),t.setAttribute("aria-label","Previous offer"),t.innerHTML='\n <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />\n </svg>\n ',t.addEventListener("click",()=>this.previous());const n=document.createElement("button");return n.className=x("nav-button"),n.setAttribute("aria-label","Next offer"),n.innerHTML='\n <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n ',n.addEventListener("click",()=>this.next()),e.appendChild(t),e.appendChild(n),this.#Te=e,this.#qe(t,n),e}#qe(e,t){if(!this.#Te)return;const n=this.#Te.querySelectorAll(`.${x("nav-button")}`),i=e??n[0],r=t??n[1];i&&(i.disabled=0===this.#ke,i.classList.toggle(x("disabled"),0===this.#ke)),r&&(r.disabled=this.#ke===this.#$e.length-1,r.classList.toggle(x("disabled"),this.#ke===this.#$e.length-1))}#Ue(){this.#Re=this.#Ke.bind(this),document.addEventListener("keydown",this.#Re)}#Ke(e){if(this.#xe)switch(e.key){case"ArrowLeft":e.preventDefault(),this.previous();break;case"ArrowRight":e.preventDefault(),this.next()}}#Be(e){this.#Se&&(this.#Se.textContent=e)}#Le(){this.#$e.forEach(e=>{e.imageUrl&&((new Image).src=e.imageUrl,n.debug("Preloading offer image",{offerId:e.id,url:e.imageUrl})),e.logoUrl&&((new Image).src=e.logoUrl,n.debug("Preloading merchant logo",{offerId:e.id,url:e.logoUrl}))})}destroy(){this.#Re&&document.removeEventListener("keydown",this.#Re),this.#Ne.forEach(e=>e.destroy()),this.#Ne=[],this.#b.removeAllListeners(),this.#xe=null,this.#Ae=null,this.#Te=null,this.#Se=null}}const C=e=>`encore-success-${e}`;class ${#xe=null;#b;#t;#Pe=null;constructor(e){this.#t=e,this.#b=new o}render(){this.#xe=document.createElement("div"),this.#xe.className=C("container");const e=document.createElement("div");e.className=C("icon"),e.innerHTML="✓";const t=document.createElement("h2");t.className=C("title"),t.textContent=this.#t.titleText??"Success!";const i=document.createElement("p");i.className=C("subtitle"),i.textContent=this.#t.subtitleText??this.#_e(this.#t.entitlement);const r=document.createElement("div");r.className=C("details"),r.innerHTML=this.#ze(this.#t.entitlement);const s=document.createElement("button");return s.className=C("button"),s.textContent=this.#t.buttonText??"Continue",s.setAttribute("type","button"),s.addEventListener("click",()=>this.#Ge()),this.#xe.appendChild(e),this.#xe.appendChild(t),this.#xe.appendChild(i),this.#xe.appendChild(r),this.#xe.appendChild(s),this.#t.autoDismissMs&&this.#t.autoDismissMs>0&&this.#je(this.#t.autoDismissMs),n.debug("Success screen rendered"),this.#xe}on(e,t){return this.#b.on(e,t)}destroy(){null!==this.#Pe&&(clearTimeout(this.#Pe),this.#Pe=null),this.#xe&&(this.#xe.remove(),this.#xe=null),this.#b.removeAllListeners(),n.debug("Success screen destroyed")}#Ge(){n.debug("User clicked continue on success screen"),this.#b.emit("continue",void 0)}#je(e){this.#Pe=window.setTimeout(()=>{n.debug("Success screen auto-dismissing"),this.#b.emit("continue",void 0)},e)}#_e(e){switch(e.type){case"freeTrial":return`You've unlocked a ${e.value??""} ${e.unit??"day"} free trial!`;case"discount":return`You've received a ${e.value??""}${"percent"===e.unit?"%":""} discount!`;case"credit":return`You've earned $${e.value??"0"} in credits!`;default:return"You've unlocked a special offer!"}}#ze(e){const t=[];if("freeTrial"===e.type)t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Type:</span>\n <span class="${C("detail-value")}">Free Trial</span>\n </div>`),e.value&&e.unit&&t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Duration:</span>\n <span class="${C("detail-value")}">${e.value} ${e.unit}</span>\n </div>`);else if("discount"===e.type){if(t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Type:</span>\n <span class="${C("detail-value")}">Discount</span>\n </div>`),e.value&&e.unit){const n="percent"===e.unit?`${e.value}%`:`$${e.value}`;t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Amount:</span>\n <span class="${C("detail-value")}">${n}</span>\n </div>`)}}else"credit"===e.type&&(t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Type:</span>\n <span class="${C("detail-value")}">Credit</span>\n </div>`),e.value&&t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Amount:</span>\n <span class="${C("detail-value")}}">$${e.value}</span>\n </div>`));return t.join("")}}class k{#He=null;#Ve=null;#Qe=!1;start(e){this.#Qe?n.warn("FocusDetector already active"):(this.#He=()=>{n.debug("Window focused"),e()},this.#Ve=()=>{"visible"===document.visibilityState&&(n.debug("Document became visible"),e())},window.addEventListener("focus",this.#He),document.addEventListener("visibilitychange",this.#Ve),this.#Qe=!0,n.debug("FocusDetector started"))}stop(){this.#Qe&&(this.#He&&(window.removeEventListener("focus",this.#He),this.#He=null),this.#Ve&&(document.removeEventListener("visibilitychange",this.#Ve),this.#Ve=null),this.#Qe=!1,n.debug("FocusDetector stopped"))}isActive(){return this.#Qe}}function A(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=15&(crypto.getRandomValues(new Uint8Array(1))[0]??0);return("x"===e?t:3&t|8).toString(16)})}const T="1.0.0",N="user_id",S="user_attributes",R=new class{#We;#h;#g=null;#Je=null;#Ye=null;#Ze=null;#Xe=null;#f=null;#et={};#tt=!1;#nt=!1;constructor(){this.#We=new i,this.#h=new s}configure(e){if(this.#We.configure(e)){this.#it();const e=this.#We.getBaseURL();e&&(this.#g=new p(this.#We.getApiKey()??"",e),this.#f&&(this.#Je=new c(this.#h,this.#g,this.#f),this.#Ye=new u(this.#h,this.#g,this.#f),this.#Ze=new h(this.#g,this.#f)),this.#Xe=new k),n.info("Encore SDK initialized successfully",{version:T})}}#it(){const e=this.#h.get(N);e?(this.#f=e,n.debug("Loaded existing user ID:",e)):(this.#f=A(),this.#h.set(N,this.#f),n.debug("Generated new user ID:",this.#f));const t=this.#h.get(S);t&&(this.#et=t,n.debug("Loaded user attributes"))}#rt(){return!!this.#We.isConfigured()||(n.error("SDK not configured. Call Encore.configure() first."),!1)}identify(e,t){if(!this.#rt())return;if(!e||"string"!=typeof e)return void n.error("identify() requires a valid user ID string");const i=this.#f;this.#f=e,this.#h.set(N,e),t&&this.setUserAttributes(t),i!==e&&(n.info("User identified:",e),this.#Je&&this.#Je.setUserId(e),this.#Ye&&this.#Ye.setUserId(e),this.#Ze&&this.#Ze.setUserId(e))}getCurrentUserId(){return this.#f}reset(){this.#rt()&&(n.info("Resetting SDK"),this.#h.clear(),this.#f=A(),this.#h.set(N,this.#f),this.#et={},this.#Je&&(this.#Je.clearCache(),this.#g&&this.#f&&(this.#Je=new c(this.#h,this.#g,this.#f))),this.#Ye&&(this.#Ye.clearQueue(),this.#Ye.destroy(),this.#g&&this.#f&&(this.#Ye=new u(this.#h,this.#g,this.#f))),this.#Ze&&(this.#Ze.clearCache(),this.#g&&this.#f&&(this.#Ze=new h(this.#g,this.#f))),this.#Xe?.isActive()&&this.#Xe.stop(),n.debug("SDK reset complete",{newUserId:this.#f}))}getVersion(){return T}setLogLevel(e){n.setLogLevel(e)}setUserAttributes(e){this.#rt()&&(e&&"object"==typeof e?(this.#et={...this.#et,...e,custom:{...this.#et.custom,...e.custom}},this.#h.set(S,this.#et),n.debug("User attributes updated",this.#et)):n.error("setUserAttributes() requires a valid UserAttributes object"))}getUserAttributes(){return{...this.#et}}async presentOffer(t){if(!this.#rt()){const n={type:"error",error:{code:e.INITIALIZATION_ERROR,message:"SDK not configured"}};return t?.onNotGranted&&t.onNotGranted(n),t?.onError&&t.onError({code:e.INITIALIZATION_ERROR,message:"SDK not configured"}),{granted:!1,reason:n}}if(this.#tt){n.warn("Presentation already in progress");const i={type:"error",error:{code:e.UNKNOWN_ERROR,message:"Presentation already in progress"}};return t?.onNotGranted&&t.onNotGranted(i),{granted:!1,reason:i}}this.#tt=!0;try{const e=await this.#st(t);return e.granted&&e.entitlement&&t?.onGranted?t.onGranted(e.entitlement):!e.granted&&e.reason&&t?.onNotGranted&&t.onNotGranted(e.reason),e}catch(i){n.error("Error during presentation",i);const r={type:"error",error:{code:e.UNKNOWN_ERROR,message:i instanceof Error?i.message:"Unknown error"}};return t?.onError&&"string"!=typeof r&&"error"===r.type&&t.onError(r.error),t?.onNotGranted&&t.onNotGranted(r),{granted:!1,reason:r}}finally{this.#tt=!1}}isActive(e,t){return!!this.#rt()&&(this.#Je?this.#Je.isActive(e,t):(n.error("EntitlementManager not initialized"),!1))}async refreshEntitlements(){this.#rt()&&(this.#Je?await this.#Je.refreshEntitlements():n.error("EntitlementManager not initialized"))}didGrant(e,t){this.#rt()&&(this.#Ye?t&&"string"==typeof t?this.#Ye.sendGrantSignal(t,e):n.error("didGrant() requires a valid transaction ID"):n.error("SignalManager not initialized"))}async waitForVerification(e,t){if(!this.#rt())return n.error("SDK not configured"),"failed";if(!this.#g)return n.error("API client not initialized"),"failed";if(!e)return n.error("waitForVerification() requires a transaction ID"),"failed";try{n.debug("Starting verification wait",{transactionId:e,timeout:t});const i={transactionId:e};void 0!==t&&(i.timeout=t);const r=new g(this.#g,i),s=await r.poll();return"verified"===s&&await this.refreshEntitlements(),s}catch(t){return n.error("Error during verification wait",{transactionId:e,error:t}),"failed"}}on(e,t){return this.#rt()?this.#Je?this.#Je.getEventEmitter().on(e,t):(n.error("EntitlementManager not initialized"),()=>{}):()=>{}}observeEntitlement(e,t){return{subscribe:i=>{if(!this.#rt())return()=>{};if(!this.#Je)return n.error("EntitlementManager not initialized"),()=>{};const r=this.#Je.isActive(e,t);return i(r),this.on("entitlementChanged",n=>{const r=n.scope;JSON.stringify(n.entitlementType)===JSON.stringify(e)&&("verified"===t&&"verified"!==r||i(n.isActive))})}}}placement(){return new f(async()=>this.presentOffer())}async#st(t){if(!this.#Ze||!this.#g)return n.error("Managers not initialized"),{granted:!1,reason:{type:"error",error:{code:e.INITIALIZATION_ERROR,message:"Managers not initialized"}}};try{this.#nt||(y({}),this.#nt=!0),n.debug("Fetching offers");const{offers:t,uiConfiguration:i}=await this.#Ze.fetchOffers(this.#et);if(0===t.length)return n.info("No offers available"),{granted:!1,reason:"noOffersAvailable"};const r={...this.#We.getUIConfiguration(),...i},s=new Map,o=new Set;t.forEach(e=>{s.set(e.id,A())});const a=new w,l=new I(t),c=await new Promise(t=>{l.on("offerClaim",i=>{const o=i.offer;n.debug("User claimed offer",{offerId:o.id}),(async()=>{try{if(!this.#Ze)throw new Error("OfferManager not initialized");const e=s.get(o.id),i=await this.#Ze.startTransaction(o.campaignId,o.creativeId,e);this.#ot(o.advertiserUrl)||n.warn("Failed to open advertiser URL (popup blocked?)"),this.didGrant("provisional",i),await this.refreshEntitlements(),this.#Xe&&!this.#Xe.isActive()&&this.#Xe.start(()=>{(async()=>{n.debug("User returned to app, refreshing entitlements"),await this.refreshEntitlements()})()}),this.#at(a,o.entitlement,()=>{a.hide(),t({granted:!0,entitlement:o.entitlement})},r)}catch(i){n.error("Error starting transaction",{offerId:o.id,error:i}),a.hide(),t({granted:!1,reason:{type:"error",error:{code:e.UNKNOWN_ERROR,message:i instanceof Error?i.message:"Transaction failed"}}})}})()}),l.on("complete",e=>{e.claimed||(n.debug("User declined last offer"),l.destroy(),a.hide(),t({granted:!1,reason:"userDeclinedLastOffer"}))}),a.on("close",()=>{n.debug("User closed modal"),l.destroy(),t({granted:!1,reason:"userClosedModal"})}),a.on("backdropClick",()=>{n.debug("User clicked outside modal"),l.destroy(),a.hide(),t({granted:!1,reason:"userClickedOutside"})}),l.on("offerView",e=>{const{offer:t}=e;if(o.has(t.id))return void n.debug("Impression already logged for this modal session",{offerId:t.id});const i=s.get(t.id);i&&this.#Ze&&(this.#Ze.logImpression(i,t),o.add(t.id))}),a.show();const i=l.render();a.setContent(i)});return a.destroy(),l.destroy(),c}catch(t){return n.error("Error in presentation flow",t),{granted:!1,reason:{type:"error",error:{code:e.UNKNOWN_ERROR,message:t instanceof Error?t.message:"Unknown error"}}}}}#ot(e){try{const t=window.open(e,"_blank","noopener,noreferrer");return!!t&&(t.focus(),!0)}catch(t){return n.error("Failed to open advertiser URL",{url:e,error:t}),!1}}#at(e,t,i,r){try{const s={entitlement:t,autoDismissMs:0};r?.creditClaimedTitleText&&(s.titleText=r.creditClaimedTitleText),r?.creditClaimedSubtitleText&&(s.subtitleText=r.creditClaimedSubtitleText),r?.applyCreditsButtonText&&(s.buttonText=r.applyCreditsButtonText);const o=new $(s);o.on("continue",()=>{o.destroy(),i()});const a=o.render();e.setContent(a),n.debug("Success screen displayed")}catch(e){n.error("Failed to show success screen",e),i()}}};exports.Encore=R,exports.default=R;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/types.ts","../../src/utils/logger.ts","../../src/core/Configuration.ts","../../src/core/StorageManager.ts","../../src/utils/eventEmitter.ts","../../src/core/EntitlementManager.ts","../../src/core/SignalManager.ts","../../src/utils/network.ts","../../src/core/OfferManager.ts","../../src/core/VerificationPoller.ts","../../src/core/PlacementBuilder.ts","../../src/api/endpoints.ts","../../src/api/APIClient.ts","../../src/ui/styles.ts","../../src/ui/OfferModal.ts","../../src/ui/OfferCard.ts","../../src/ui/OfferCarousel.ts","../../src/ui/SuccessScreen.ts","../../src/utils/focusDetection.ts","../../src/utils/uuid.ts","../../src/core/Encore.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["ErrorCode","PREFIX","logger","logLevel","setLogLevel","level","this","getLogLevel","debug","args","console","info","warn","error","critical","Configuration","config","isConfigured","configure","validationError","validateConfig","environment","apiKey","userId","baseURL","getDefaultBaseURL","uiConfiguration","trim","includes","getConfig","getApiKey","getBaseURL","getEnvironment","getUIConfiguration","reset","KEY_PREFIX","StorageManager","storageType","memoryStorage","constructor","Map","detectAvailableStorage","isStorageAvailable","type","storage","localStorage","sessionStorage","testKey","setItem","removeItem","getStorage","prefixKey","key","set","value","undefined","prefixedKey","serialized","JSON","stringify","Error","name","get","getItem","remove","parse","delete","clear","keys","startsWith","keysToRemove","i","length","push","forEach","getStorageType","EventEmitter","listeners","on","event","handler","has","Set","handlers","String","add","off","size","emit","payload","listenerCount","removeAllListeners","hasListeners","ENTITLEMENTS_KEY","ENTITLEMENTS_TIMESTAMP_KEY","EntitlementManager","apiClient","cache","refreshPromise","eventEmitter","loadFromStorage","getEventEmitter","setUserId","userKey","timestampKey","entitlements","timestamp","count","age","Date","now","saveEntitlements","Array","isArray","oldEntitlements","loadEntitlements","emitChanges","newEntitlements","oldMap","ent","scope","newMap","newEnt","oldEnt","entitlementType","getEntitlementType","isActive","isEntitlementActive","entitlement","_","expiresAt","__","grantedAt","___","transactionId","____","rest","isCacheStale","getCacheAge","clearCache","item","itemType","entitlementTypesMatch","a","b","getActiveEntitlements","filter","refreshEntitlements","performRefresh","fetchEntitlements","SIGNAL_QUEUE_KEY","SignalManager","queue","isProcessing","cleanupNetworkListener","loadQueue","setupNetworkListener","processQueue","saveQueue","enqueue","grantType","exists","some","signal","toISOString","attempts","dequeue","index","findIndex","s","splice","getQueue","clearQueue","sendGrantSignal","processSignal","sleep","lastAttemptAt","lastAttempt","getTime","backoffDelay","Math","pow","timeSinceLastAttempt","remainingWait","attempt","callback","window","addEventListener","removeEventListener","onOnline","destroy","ms","Promise","resolve","setTimeout","OfferManager","cachedOffers","cachedUiConfiguration","cacheTimestamp","fetchOffers","userAttributes","useCache","offers","response","offerIds","map","o","id","logImpression","impressionId","offer","appBundleId","location","hostname","campaignId","creativeId","then","success","catch","err","startTransaction","VerificationPoller","timeout","startTime","interval","maxInterval","timeoutHandle","isPolling","options","poll","pollWithBackoff","stop","clearTimeout","elapsed","checkVerificationStatus","status","verifiedAt","min","PlacementBuilder","onGrantedCallback","onNotGrantedCallback","onLoadingStateChangeCallback","executor","onGranted","onNotGranted","onLoadingStateChange","show","result","granted","reason","errorReason","code","UNKNOWN_ERROR","message","replacePathParams","endpoint","params","Object","entries","replace","encodeURIComponent","APIClient","pendingRequests","setApiKey","setBaseURL","request","url","method","post","body","requestKey","getRequestKey","pendingRequest","requestPromise","executeRequest","maxRetries","retries","lastError","delay","fetchWithTimeout","isClientError","controller","AbortController","timeoutId","abort","headers","fetchOptions","fetch","ok","handleHTTPError","json","isNetworkError","errorCode","errorMessage","statusText","errorData","errorObj","API_ERROR","statusCode","errorInstance","assign","attributes","apiOffer","campaign","creative","creatives","title","description","quickInstructions","subtitle","imageUrl","primaryImageUrl","ctaText","advertiserUrl","destinationUrl","unit","merchantName","logoUrl","instructions","trackingParameters","getGrantSignalEndpoint","convertEntitlementType","apiType","letter","toUpperCase","provisional","data","typeObj","started_at","expires_at","verified","provisionalCount","verifiedCount","totalCount","getVerificationStatusEndpoint","STYLE_ID","CLASS_PREFIX","injectStyles","theme","document","getElementById","styleElement","createElement","textContent","themeVars","vars","primaryColor","backgroundColor","textColor","borderRadius","fontFamily","join","generateThemeVars","getBaseStyles","head","appendChild","cls","className","OfferModal","backdrop","modal","closeButton","modalBody","isVisible","previousActiveElement","focusableElements","boundHandleKeyDown","activeElement","createModal","classList","requestAnimationFrame","setupEventListeners","updateFocusableElements","focusFirstElement","hide","removeModal","HTMLElement","focus","setContent","content","innerHTML","setAttribute","handleKeyDown","bind","preventDefault","handleTabKey","shiftKey","currentIndex","el","nextIndex","focusableSelectors","from","querySelectorAll","OfferCard","container","render","imageBanner","createImageBanner","details","createDetails","footer","createFooter","banner","img","alt","src","complete","onload","onerror","createPlaceholderImage","btoa","heading","list","instruction","li","merchantInfo","logo","style","display","textInfo","desc","claimButton","OfferCarousel","cardsContainer","indicatorsContainer","offerCards","announceElement","boundHandleArrowKeys","preloadImages","position","width","height","padding","margin","overflow","clip","whiteSpace","border","header","createHeader","navigation","createNavigation","renderAllOffers","setupKeyboardNavigation","scrollToIndex","getCurrentIndex","getTotalOffers","next","updateNavigationButtons","announce","previous","card","cardElement","itemWrapper","toString","smooth","items","targetItem","scrollIntoView","behavior","block","inline","prevButton","nextButton","buttons","prev","disabled","toggle","handleArrowKeys","Image","offerId","SuccessScreen","autoDismissTimeout","icon","titleText","subtitleText","getDefaultSubtitle","renderEntitlementDetails","button","buttonText","handleContinue","autoDismissMs","setupAutoDismiss","displayValue","FocusDetector","focusCallback","visibilityCallback","start","visibilityState","generateUUID","crypto","randomUUID","c","r","getRandomValues","Uint8Array","SDK_VERSION","USER_ID_KEY","USER_ATTRIBUTES_KEY","Encore","configuration","entitlementManager","signalManager","offerManager","focusDetector","isPresentationInProgress","stylesInjected","initializeUserId","version","storedUserId","storedAttributes","ensureConfigured","identify","previousUserId","setUserAttributes","getCurrentUserId","newUserId","getVersion","custom","getUserAttributes","presentOffer","notInitializedError","INITIALIZATION_ERROR","onError","alreadyInProgressReason","executePresentationFlow","didGrant","access","waitForVerification","pollerOptions","poller","observeEntitlement","subscribe","currentState","eventScope","placement","async","_options","apiUiConfig","mergedUiConfig","impressionIds","loggedImpressions","carousel","openAdvertiserURL","showSuccessScreen","claimed","carouselElement","opened","open","onContinue","uiConfig","successConfig","creditClaimedTitleText","creditClaimedSubtitleText","applyCreditsButtonText","successScreen","successElement"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e;!function(e){e.NETWORK_ERROR="NETWORK_ERROR",e.API_ERROR="API_ERROR",e.CONFIGURATION_ERROR="CONFIGURATION_ERROR",e.INITIALIZATION_ERROR="INITIALIZATION_ERROR",e.STORAGE_ERROR="STORAGE_ERROR",e.INVALID_REQUEST="INVALID_REQUEST",e.UNAUTHORIZED="UNAUTHORIZED",e.NOT_FOUND="NOT_FOUND",e.TIMEOUT="TIMEOUT",e.UNKNOWN_ERROR="UNKNOWN_ERROR"}(e||(e={}));const t="[Encore SDK]",n=new class{#e="none";setLogLevel(e){this.#e=e}getLogLevel(){return this.#e}debug(...e){"debug"===this.#e&&console.debug(t,...e)}info(...e){"debug"===this.#e&&console.info(t,...e)}warn(...e){"debug"===this.#e&&console.warn(t,...e)}error(...e){"debug"===this.#e&&console.error(t,...e)}critical(...e){console.error(t,"[CRITICAL]",...e)}};class i{#t=null;#n=!1;configure(e){if(this.#n)return n.warn("SDK already configured. Ignoring subsequent configure() call."),!1;const t=this.#i(e);if(t)return n.error("Invalid configuration:",t),!1;const i=e.logLevel??"none",r=e.environment??"production";return this.#t={apiKey:e.apiKey,userId:e.userId,environment:r,baseURL:this.#r(r),logLevel:i,uiConfiguration:e.uiConfiguration??{}},n.setLogLevel(i),this.#n=!0,n.debug("SDK configured successfully",this.#t),!0}#i(e){return e.apiKey&&"string"==typeof e.apiKey&&""!==e.apiKey.trim()?e.environment&&!["production","localhost"].includes(e.environment)?"environment must be 'production' or 'localhost'":e.logLevel&&!["none","debug"].includes(e.logLevel)?"logLevel must be 'none' or 'debug'":null:"apiKey is required and must be a non-empty string"}#r(e){return"localhost"===e?"http://localhost:8080/encore/v1":"https://svc.joinyaw.com/product/encore/v1"}getConfig(){return this.#t}isConfigured(){return this.#n}getApiKey(){return this.#t?.apiKey??null}getBaseURL(){return this.#t?.baseURL??null}getEnvironment(){return this.#t?.environment??null}getUIConfiguration(){return this.#t?.uiConfiguration??{}}reset(){this.#t=null,this.#n=!1,n.debug("Configuration reset")}}const r="encore_";class s{#s;#o;constructor(){this.#o=new Map,this.#s=this.#a(),n.debug(`StorageManager initialized with ${this.#s}`)}#a(){return this.#l("localStorage")?"localStorage":this.#l("sessionStorage")?"sessionStorage":(n.warn("Neither localStorage nor sessionStorage available, using in-memory storage"),"memory")}#l(e){try{const t="localStorage"===e?localStorage:sessionStorage,n="__encore_test__";return t.setItem(n,"test"),t.removeItem(n),!0}catch{return!1}}#c(){return"localStorage"===this.#s?localStorage:"sessionStorage"===this.#s?sessionStorage:this.#o}#d(e){return`${r}${e}`}set(e,t){if(void 0===t)return void n.warn(`Attempted to store undefined value for key: ${e}`);const i=this.#d(e),r=JSON.stringify(t);try{const t=this.#c();t instanceof Map?t.set(i,r):t.setItem(i,r),n.debug(`Stored ${e} in ${this.#s}`)}catch(e){e instanceof Error&&"QuotaExceededError"===e.name?n.error("Storage quota exceeded:",e):n.error("Failed to store item:",e),"memory"!==this.#s&&(n.warn("Falling back to memory storage for this item"),this.#o.set(i,r))}}get(e){const t=this.#d(e);try{const i=this.#c();let r=null;return r=i instanceof Map?i.get(t)??null:i.getItem(t),null===r||"undefined"===r?("undefined"===r&&(n.warn(`Found corrupted value "undefined" for key: ${e}, cleaning up`),this.remove(e)),null):JSON.parse(r)}catch(t){return n.error(`Failed to retrieve ${e}:`,t),this.remove(e),null}}remove(e){const t=this.#d(e);try{const i=this.#c();i instanceof Map?i.delete(t):i.removeItem(t),n.debug(`Removed ${e} from ${this.#s}`)}catch(t){n.error(`Failed to remove ${e}:`,t)}}clear(){try{const e=this.#c();if(e instanceof Map)for(const t of e.keys())t.startsWith(r)&&e.delete(t);else{const t=[];for(let n=0;n<e.length;n++){const i=e.key(n);i?.startsWith(r)&&t.push(i)}t.forEach(t=>e.removeItem(t))}n.debug(`Cleared all Encore data from ${this.#s}`)}catch(e){n.error("Failed to clear storage:",e)}}getStorageType(){return this.#s}}class o{#u;constructor(){this.#u=new Map}on(e,t){this.#u.has(e)||this.#u.set(e,new Set);const i=this.#u.get(e);if(!i)throw new Error(`Failed to get handlers for event '${String(e)}'`);return i.add(t),n.debug(`Event listener added for '${String(e)}'`),()=>{this.off(e,t)}}off(e,t){const i=this.#u.get(e);i&&(i.delete(t),n.debug(`Event listener removed for '${String(e)}'`),0===i.size&&this.#u.delete(e))}emit(e,t){const i=this.#u.get(e);if(i&&0!==i.size){n.debug(`Emitting event '${String(e)}'`,{listenerCount:i.size});for(const r of i)try{r(t)}catch(t){n.error(`Error in event handler for '${String(e)}':`,t)}}}removeAllListeners(e){e?(this.#u.delete(e),n.debug(`All listeners removed for '${String(e)}'`)):(this.#u.clear(),n.debug("All event listeners removed"))}listenerCount(e){return this.#u.get(e)?.size??0}hasListeners(e){const t=this.#u.get(e);return void 0!==t&&t.size>0}}const a="entitlements",l="entitlements_timestamp";class c{#h;#g;#f;#m=null;#p=null;#b;constructor(e,t,n){this.#h=e,this.#g=t,this.#f=n,this.#b=new o,this.#v()}getEventEmitter(){return this.#b}setUserId(e){this.#f!==e&&(n.debug("EntitlementManager: User ID changed, clearing cache"),this.#f=e,this.#m=null,this.#v())}#v(){try{const e=`${this.#f}_${a}`,t=`${this.#f}_${l}`,i=this.#h.get(e),r=this.#h.get(t);i&&r&&(this.#m={entitlements:i,timestamp:r},n.debug("Loaded entitlements from storage",{count:i.length,age:Date.now()-r}))}catch(e){n.error("Failed to load entitlements from storage:",e)}}saveEntitlements(e){try{Array.isArray(e)||(n.warn("saveEntitlements called with non-array value, defaulting to empty array"),e=[]);const t=this.loadEntitlements(),i=Date.now(),r=`${this.#f}_${a}`,s=`${this.#f}_${l}`;this.#h.set(r,e),this.#h.set(s,i),this.#m={entitlements:e,timestamp:i},n.debug("Saved entitlements to storage",{count:e.length}),this.#y(t,e)}catch(e){n.error("Failed to save entitlements to storage:",e)}}#y(e,t){Array.isArray(e)||(e=[]),Array.isArray(t)||(t=[]);const n=new Map;for(const t of e){const e=`${String(t.type)}_${t.scope}`;n.set(e,t)}const i=new Map;for(const e of t){const t=`${String(e.type)}_${e.scope}`;i.set(t,e)}for(const[e,t]of i){const i=n.get(e);i&&JSON.stringify(i)===JSON.stringify(t)||this.#b.emit("entitlementChanged",{entitlementType:this.#x(t),scope:t.scope,isActive:this.#w(t),entitlement:t})}for(const[e,t]of n)i.has(e)||this.#b.emit("entitlementChanged",{entitlementType:this.#x(t),scope:t.scope,isActive:!1})}#x(e){const{scope:t,expiresAt:n,grantedAt:i,transactionId:r,...s}=e;return s}#w(e){return!e.expiresAt||new Date(e.expiresAt)>new Date}loadEntitlements(){return this.#m?.entitlements??[]}isCacheStale(){return!this.#m||Date.now()-this.#m.timestamp>3e5}getCacheAge(){return this.#m?Date.now()-this.#m.timestamp:null}clearCache(){this.#m=null,this.#b.removeAllListeners();const e=`${this.#f}_${a}`,t=`${this.#f}_${l}`;this.#h.remove(e),this.#h.remove(t),n.debug("Cleared entitlement cache")}isActive(e,t="all"){const n=this.loadEntitlements();for(const i of n){const n=this.#x(i);if(this.#E(n,e)&&("verified"!==t||"verified"===i.scope)){if(i.expiresAt&&new Date(i.expiresAt)<=new Date)continue;return!0}}return!1}#E(e,t){return JSON.stringify(e)===JSON.stringify(t)}getActiveEntitlements(e="all"){const t=this.loadEntitlements(),n=new Date;return t.filter(t=>("verified"!==e||"verified"===t.scope)&&!(t.expiresAt&&new Date(t.expiresAt)<=n))}async refreshEntitlements(){if(this.#p)return n.debug("Refresh already in progress, waiting..."),this.#p;this.#p=this.#I();try{await this.#p}finally{this.#p=null}}async#I(){try{n.debug("Refreshing entitlements from API");const e=await this.#g.fetchEntitlements(this.#f);if(!Array.isArray(e))return n.warn("Received non-array entitlements from API, defaulting to empty array"),void this.saveEntitlements([]);this.saveEntitlements(e),n.info("Entitlements refreshed successfully",{count:e.length})}catch(e){n.error("Failed to refresh entitlements, keeping cached version:",e)}}}const d="signal_queue";class u{#h;#g;#f;#C=[];#$=!1;#k;constructor(e,t,n){this.#h=e,this.#g=t,this.#f=n,this.#A(),this.#T(),this.processQueue()}setUserId(e){this.#f!==e&&(n.debug("SignalManager: User ID changed, clearing queue"),this.#f=e,this.#C=[],this.#A())}#A(){try{const e=`${this.#f}_${d}`,t=this.#h.get(e);t&&Array.isArray(t)&&(this.#C=t,n.debug("Loaded grant signal queue from storage",{count:t.length}))}catch(e){n.error("Failed to load grant signal queue from storage:",e)}}#N(){try{const e=`${this.#f}_${d}`;this.#h.set(e,this.#C),n.debug("Saved grant signal queue to storage",{count:this.#C.length})}catch(e){n.error("Failed to save grant signal queue to storage:",e)}}enqueue(e,t){const i=this.#C.some(n=>n.transactionId===e&&n.grantType===t);if(i)return void n.debug("Grant signal already in queue, skipping",{transactionId:e,grantType:t});const r={transactionId:e,grantType:t,timestamp:(new Date).toISOString(),attempts:0};this.#C.push(r),this.#N(),n.info("Grant signal added to queue",{transactionId:e,grantType:t})}dequeue(e){const t=this.#C.findIndex(t=>t.transactionId===e.transactionId&&t.grantType===e.grantType);-1!==t&&(this.#C.splice(t,1),this.#N(),n.debug("Grant signal removed from queue",{transactionId:e.transactionId,grantType:e.grantType}))}getQueue(){return[...this.#C]}clearQueue(){this.#C=[],this.#N(),n.debug("Grant signal queue cleared")}async sendGrantSignal(e,t){try{if(n.debug("Sending grant signal",{transactionId:e,grantType:t}),!await this.#g.sendGrantSignal(e,t))throw new Error("Grant signal failed (returned false)");n.info("Grant signal sent successfully",{transactionId:e,grantType:t})}catch{n.warn("Failed to send grant signal, adding to queue",{transactionId:e,grantType:t}),this.enqueue(e,t)}}async processQueue(){if(this.#$)n.debug("Queue processing already in progress, skipping");else if(0!==this.#C.length){this.#$=!0,n.info("Processing grant signal queue",{count:this.#C.length});try{for(const e of[...this.#C])await this.#S(e),this.#C.length>1&&await this.#R(100)}finally{this.#$=!1}}}async#S(e){if(e.attempts>=3)return n.error("Grant signal max attempts reached, removing from queue",{transactionId:e.transactionId,grantType:e.grantType,attempts:e.attempts}),void this.dequeue(e);if(e.lastAttemptAt){const t=new Date(e.lastAttemptAt).getTime(),i=Date.now(),r=1e3*Math.pow(2,e.attempts-1),s=i-t;if(s<r)return void n.debug("Skipping signal, waiting for backoff period",{transactionId:e.transactionId,remainingWait:r-s})}e.attempts++,e.lastAttemptAt=(new Date).toISOString(),this.#N();try{n.debug("Attempting to send queued grant signal",{transactionId:e.transactionId,grantType:e.grantType,attempt:e.attempts}),await this.#g.sendGrantSignal(e.transactionId,e.grantType)?(n.info("Queued grant signal sent successfully",{transactionId:e.transactionId,grantType:e.grantType}),this.dequeue(e)):n.warn("Grant signal failed, will retry",{transactionId:e.transactionId,attempt:e.attempts})}catch(t){n.warn("Failed to send queued grant signal, will retry",{transactionId:e.transactionId,attempt:e.attempts,error:t})}}#T(){this.#k=function(e){const t=()=>{n.debug("Network status: online"),e()};return window.addEventListener("online",t),()=>{window.removeEventListener("online",t)}}(()=>{n.debug("Network came online, processing grant signal queue"),this.processQueue()})}destroy(){this.#k&&(this.#k(),this.#k=void 0)}#R(e){return new Promise(t=>setTimeout(t,e))}}class h{#g;#f;#L=[];#D=null;#O=null;constructor(e,t){this.#g=e,this.#f=t}async fetchOffers(e,t=!0){if(t&&this.#L.length>0&&this.#O)return n.debug("Using cached offers",{count:this.#L.length}),{offers:[...this.#L],uiConfiguration:this.#D??void 0};try{n.debug("Fetching offers from API",{userId:this.#f});const t=await this.#g.fetchOffers(this.#f,e);return 0===t.offers?.length?(n.info("No offers available for user"),this.#L=[],this.#D=t.uiConfiguration??null,this.#O=Date.now(),{offers:[],uiConfiguration:t.uiConfiguration}):(this.#L=t.offers,this.#D=t.uiConfiguration??null,this.#O=Date.now(),n.info("Offers fetched successfully",{count:t.offers.length,offerIds:t.offers.map(e=>e.id)}),{offers:[...t.offers],uiConfiguration:t.uiConfiguration})}catch(e){throw n.error("Failed to fetch offers",e),e}}logImpression(e,t){try{const i=window.location.hostname;n.debug("Logging impression",{impressionId:e,campaignId:t.campaignId,creativeId:t.creativeId,appBundleId:i}),this.#g.logImpression(e,this.#f,t.campaignId,t.creativeId,i).then(t=>{t&&n.debug("Impression logged successfully",{impressionId:e})}).catch(t=>{n.error("Failed to log impression (non-blocking)",{impressionId:e,error:t})})}catch(t){n.error("Failed to log impression (non-blocking)",{impressionId:e,error:t})}}async startTransaction(e,t,i){try{n.debug("Starting transaction",{campaignId:e,creativeId:t,impressionId:i});const r=await this.#g.startTransaction(e,this.#f,t,i);return n.info("Transaction started",{transactionId:r,campaignId:e,creativeId:t}),r}catch(i){throw n.error("Failed to start transaction",{campaignId:e,creativeId:t,error:i}),i}}clearCache(){this.#L=[],this.#O=null,n.debug("Offer cache cleared")}setUserId(e){this.#f=e,this.clearCache(),n.debug("OfferManager user ID updated",{userId:e})}}class g{#g;#M;#U;#F=0;#q=1e3;#B=8e3;#K=null;#P=!1;constructor(e,t){this.#g=e,this.#M=t.transactionId,this.#U=t.timeout??3e4}async poll(){return this.#P?(n.warn("Verification polling already in progress",{transactionId:this.#M}),"pending"):(this.#P=!0,this.#F=Date.now(),n.debug("Starting verification polling",{transactionId:this.#M,timeout:this.#U}),this.#z())}stop(){this.#P=!1,null!==this.#K&&(clearTimeout(this.#K),this.#K=null),n.debug("Verification polling stopped",{transactionId:this.#M})}async#z(){for(;this.#P;){const e=Date.now()-this.#F;if(e>=this.#U)return n.warn("Verification polling timeout",{transactionId:this.#M,elapsed:e}),this.stop(),"pending";try{const e=await this.#g.checkVerificationStatus(this.#M);if(n.debug("Verification status checked",{transactionId:this.#M,status:e.status}),"verified"===e.status)return n.info("Transaction verified",{transactionId:this.#M,verifiedAt:e.verifiedAt}),this.stop(),"verified";if("failed"===e.status)return n.warn("Transaction failed verification",{transactionId:this.#M}),this.stop(),"failed";await this.#R(this.#q),this.#q=Math.min(2*this.#q,this.#B)}catch(e){n.error("Error checking verification status",{transactionId:this.#M,error:e}),await this.#R(this.#q)}}return"pending"}async#R(e){return new Promise(t=>{this.#K=window.setTimeout(()=>{this.#K=null,t()},e)})}}class f{#_=null;#G=null;#j=null;#H;constructor(e){this.#H=e}onGranted(e){return this.#_=e,this}onNotGranted(e){return this.#G=e,this}onLoadingStateChange(e){return this.#j=e,this}async show(){try{this.#j&&this.#j(!0),n.debug("PlacementBuilder: Executing presentation");const e=await this.#H();return this.#j&&this.#j(!1),e.granted&&e.entitlement&&this.#_?this.#_(e.entitlement):!e.granted&&this.#G&&e.reason&&this.#G(e.reason),e}catch(t){this.#j&&this.#j(!1),n.error("PlacementBuilder: Error during presentation",t);const i={type:"error",error:{code:e.UNKNOWN_ERROR,message:t instanceof Error?t.message:"Unknown error"}};return this.#G&&this.#G(i),{granted:!1,reason:i}}}}function m(e,t){let n=e;for(const[e,i]of Object.entries(t))n=n.replace(`:${e}`,encodeURIComponent(i));return n}class p{#V;#Q;#W;constructor(e,t){this.#V=e,this.#Q=t,this.#W=new Map}setApiKey(e){this.#V=e}setBaseURL(e){this.#Q=e}async get(e,t){return this.#J({url:`${this.#Q}${e}`,options:{method:"GET",...t},apiKey:this.#V})}async post(e,t,n){return this.#J({url:`${this.#Q}${e}`,options:{method:"POST",body:t,...n},apiKey:this.#V})}async#J(e){const{url:t,options:i,apiKey:r}=e,s=this.#Y(t,i),o=this.#W.get(s);if(o)return n.debug("Deduplicating request:",t),o;const a=this.#Z(t,i,r);this.#W.set(s,a);try{return await a}finally{this.#W.delete(s)}}async#Z(e,t,i){const r=t.retries??3;let s=null;for(let o=0;o<=r;o++)try{if(o>0){const e=1e3*Math.pow(2,o-1);n.debug(`Retrying request (attempt ${o}/${r}) after ${e}ms`),await this.#R(e)}return await this.#X(e,t,i)}catch(e){if(s=e,this.#ee(e))throw e;if(o===r)throw n.error(`Request failed after ${r} retries:`,e),e;n.warn("Request failed, will retry:",e)}throw s??new Error("Request failed")}async#X(e,t,i){const r=t.timeout??3e4,s=new AbortController,o=setTimeout(()=>s.abort(),r);try{const r={"X-API-Key":i,"Content-Type":"application/json","User-Agent":"Encore-Web-SDK/1.0.0",...t.headers},o={method:t.method,headers:r,signal:s.signal};t.body&&(o.body=JSON.stringify(t.body)),n.debug(`${t.method} ${e}`);const a=await fetch(e,o);return a.ok||await this.#te(a),await a.json()}catch(e){if(e instanceof Error){if("AbortError"===e.name)throw new Error("Request timeout");if(this.#ne(e))throw new Error(`Network error: ${e.message}`)}if(e instanceof Error)throw e;throw new Error(String(e))}finally{clearTimeout(o)}}async#te(t){let n,i=`HTTP ${t.status}: ${t.statusText}`;try{const e=await t.json();if("object"==typeof e&&null!==e&&"error"in e&&"object"==typeof e.error&&null!==e.error){const t=e.error;i=("string"==typeof t.message?t.message:void 0)??i,n="string"==typeof t.code?t.code:void 0}}catch{}const r=n?{code:n,message:i}:{code:e.API_ERROR,statusCode:t.status,message:i},s=new Error(i);throw Object.assign(s,r),s}#ee(e){if("object"==typeof e&&null!==e&&"statusCode"in e&&void 0!==e.statusCode){const t=e.statusCode;return t>=400&&t<500}return!1}#ne(e){return e.message.includes("fetch")||e.message.includes("network")||e.message.includes("ECONNREFUSED")||e.message.includes("ETIMEDOUT")}#Y(e,t){const n=t.body?JSON.stringify(t.body):"";return`${t.method}:${e}:${n}`}#R(e){return new Promise(t=>setTimeout(t,e))}async fetchOffers(e,t){try{const n=await this.post("/offers/show",{userId:e,attributes:t}),i=[];for(const e of n.offers){const t=e.campaign;for(const e of t.creatives){const n={id:e.id,title:e.title,description:e.quickInstructions||e.subtitle||e.description||"",imageUrl:e.primaryImageUrl,ctaText:e.ctaText,advertiserUrl:e.destinationUrl,campaignId:t.id,creativeId:e.id,entitlement:{type:"credit",value:100,unit:"dollars"},...t.merchantName&&{merchantName:t.merchantName},...e.logoUrl&&{logoUrl:e.logoUrl},...e.instructions&&{instructions:e.instructions},...e.quickInstructions&&{quickInstructions:e.quickInstructions},...e.trackingParameters&&{trackingParameters:e.trackingParameters}};i.push(n)}}return{offers:i,uiConfiguration:n.uiConfiguration}}catch(e){throw n.error("Failed to fetch offers:",e),e}}async startTransaction(e,t,i,r){try{return(await this.post("/transactions/start",{campaignId:e,userId:t,creativeId:i,...r&&{impressionId:r}})).transactionId}catch(e){throw n.error("Failed to start transaction:",e),e}}async sendGrantSignal(e,t){try{const n=function(e){return m("/transactions/:id/grant",{id:e})}(e);return(await this.post(n,{transactionId:e,grantType:t,timestamp:(new Date).toISOString()})).success}catch(e){throw n.error("Failed to send grant signal:",e),e}}#ie(e){switch(e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())){case"freeTrial":return{type:"freeTrial"};case"discount":return{type:"discount"};case"credit":return{type:"credit"};default:return n.warn(`Unknown entitlement type: ${e}, treating as freeTrial`),{type:"freeTrial"}}}async fetchEntitlements(e){try{const t=await this.get(`/entitlements?userId=${encodeURIComponent(e)}`),i=[];if(t.provisional)for(const[e,n]of Object.entries(t.provisional)){const t=this.#ie(e);i.push({...t,transactionId:"",scope:"provisional",grantedAt:n.started_at,expiresAt:n.expires_at})}if(t.verified)for(const[e,n]of Object.entries(t.verified)){const t=this.#ie(e);i.push({...t,transactionId:"",scope:"verified",grantedAt:n.started_at,expiresAt:n.expires_at})}return n.debug("Transformed entitlements response",{provisionalCount:Object.keys(t.provisional||{}).length,verifiedCount:Object.keys(t.verified||{}).length,totalCount:i.length}),i}catch(e){throw n.error("Failed to fetch entitlements:",e),e}}async checkVerificationStatus(e){try{const t=function(e){return m("/verification/status/:id",{id:e})}(e);return await this.get(t)}catch(e){throw n.error("Failed to check verification status:",e),e}}async logImpression(e,t,i,r,s){try{return(await this.post("/impressions/log",{impressionId:e,userId:t,campaignId:i,creativeId:r,appBundleId:s})).success}catch(e){return n.warn("Failed to log impression (non-blocking):",e),!1}}}const b="encore-sdk-styles",v="encore-";function y(e={}){if(document.getElementById(b))n.debug("Encore styles already injected");else try{const t=document.createElement("style");t.id=b,t.textContent=function(e={}){const t=function(e){const t=[];return e.primaryColor&&t.push(`--encore-primary-color: ${e.primaryColor};`),e.backgroundColor&&t.push(`--encore-bg-color: ${e.backgroundColor};`),e.textColor&&t.push(`--encore-text-color: ${e.textColor};`),e.borderRadius&&t.push(`--encore-border-radius: ${e.borderRadius};`),e.fontFamily&&t.push(`--encore-font-family: ${e.fontFamily};`),t.join("\n ")}(e);return`\n /* CSS Custom Properties (Theme Variables) */\n :root {\n ${t||"/* No custom theme variables */"}\n --encore-primary-color: ${e.primaryColor??"#4F46E5"};\n --encore-bg-color: ${e.backgroundColor??"#ffffff"};\n --encore-text-color: ${e.textColor??"#1F2937"};\n --encore-border-radius: ${e.borderRadius??"12px"};\n --encore-font-family: ${e.fontFamily??'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'};\n }\n\n /* Backdrop */\n .${v}backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(2px);\n z-index: 9998;\n opacity: 0;\n transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .${v}backdrop.${v}visible {\n opacity: 1;\n }\n\n /* Modal Container */\n .${v}modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 9999;\n background-color: var(--encore-bg-color);\n border-radius: 20px;\n box-shadow: 0 24px 48px -12px rgba(0, 0, 0, 0.18), 0 12px 24px -8px rgba(0, 0, 0, 0.08);\n max-width: 800px;\n max-height: 90vh;\n width: calc(100% - 32px);\n overflow-x: hidden;\n overflow-y: auto;\n opacity: 0;\n transform: translate(-50%, -50%) scale(0.96);\n transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1), transform 250ms cubic-bezier(0.4, 0, 0.2, 1);\n font-family: var(--encore-font-family);\n color: var(--encore-text-color);\n }\n\n .${v}modal.${v}visible {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n /* Close Button */\n .${v}close-button {\n position: absolute;\n top: 20px;\n right: 20px;\n width: 40px;\n height: 40px;\n border: none;\n background-color: rgba(255, 255, 255, 0.9);\n cursor: pointer;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #9CA3AF;\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n padding: 0;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n z-index: 10;\n }\n\n .${v}close-button:hover {\n background-color: #FFFFFF;\n color: #6B7280;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n transform: scale(1.05);\n }\n\n .${v}close-button:active {\n transform: scale(0.98);\n }\n\n .${v}close-button:focus {\n outline: 2px solid var(--encore-primary-color);\n outline-offset: 2px;\n }\n\n .${v}close-button svg {\n width: 18px;\n height: 18px;\n }\n\n /* Body scroll lock */\n body.${v}no-scroll {\n overflow: hidden;\n }\n\n /* Modal Header */\n .${v}modal-header {\n padding: 24px 24px 16px;\n border-bottom: 1px solid #E5E7EB;\n }\n\n .${v}modal-title {\n margin: 0;\n font-size: 24px;\n font-weight: 700;\n line-height: 1.25;\n color: var(--encore-text-color);\n }\n\n .${v}modal-subtitle {\n margin: 8px 0 0;\n font-size: 14px;\n color: #6B7280;\n line-height: 1.5;\n }\n\n /* Modal Body */\n .${v}modal-body {\n padding: 0;\n position: relative;\n isolation: isolate;\n }\n\n /* Carousel Container */\n .${v}carousel {\n display: flex;\n flex-direction: column;\n overflow: visible;\n }\n\n /* Carousel Header */\n .${v}carousel-header {\n padding: 36px 36px 28px;\n text-align: center;\n border-bottom: 1px solid #E5E7EB;\n }\n\n .${v}carousel-title {\n font-size: 30px;\n font-weight: 600;\n line-height: 1.15;\n color: #111827;\n margin: 0 0 14px 0;\n letter-spacing: -0.02em;\n }\n\n .${v}carousel-subtitle {\n font-size: 16px;\n line-height: 1.5;\n color: #4B5563;\n margin: 0;\n font-weight: 400;\n }\n\n /* Carousel Cards Container - Horizontal Scroll */\n .${v}carousel-cards {\n display: flex;\n flex-direction: row;\n overflow-x: auto;\n overflow-y: hidden;\n scroll-behavior: smooth;\n scroll-snap-type: x mandatory;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n gap: 20px;\n padding: 20px 80px;\n position: relative;\n }\n\n .${v}carousel-cards::-webkit-scrollbar {\n display: none;\n }\n\n /* Carousel Item Wrapper */\n .${v}carousel-item {\n flex: 0 0 calc(100% - 40px);\n max-width: 640px;\n scroll-snap-align: center;\n scroll-snap-stop: always;\n opacity: 0.4;\n transition: all 400ms cubic-bezier(0.4, 0, 0.2, 1);\n filter: blur(1px);\n pointer-events: auto;\n }\n\n /* Active carousel item */\n .${v}carousel-item.${v}active {\n opacity: 1;\n filter: blur(0);\n z-index: 1;\n }\n\n /* Offer Card */\n .${v}offer-card {\n display: flex;\n flex-direction: column;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n height: 100%;\n }\n\n /* Offer Banner */\n .${v}offer-banner {\n width: 100%;\n background-color: transparent;\n position: relative;\n padding: 20px 20px 0;\n }\n\n .${v}offer-banner-image {\n width: 100%;\n height: auto;\n display: block;\n border-radius: 16px;\n object-fit: contain;\n background-color: #F9FAFB;\n opacity: 0;\n transition: opacity 200ms ease-out;\n }\n\n .${v}offer-banner-image.${v}loaded {\n opacity: 1;\n }\n\n /* Info button on banner */\n .${v}banner-info-button {\n position: absolute;\n top: 32px;\n right: 32px;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background-color: rgba(255, 255, 255, 0.95);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n transition: all 150ms ease;\n }\n\n .${v}banner-info-button:hover {\n background-color: #FFFFFF;\n transform: scale(1.05);\n }\n\n .${v}banner-info-button svg {\n width: 16px;\n height: 16px;\n color: #6B7280;\n }\n\n /* Offer Details */\n .${v}offer-details {\n padding: 28px 36px;\n }\n\n .${v}offer-details-heading {\n font-size: 13px;\n font-weight: 600;\n color: #9CA3AF;\n margin: 0 0 18px 0;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n }\n\n .${v}offer-details-list {\n list-style: disc;\n margin: 0;\n padding: 0 0 0 22px;\n }\n\n .${v}offer-details-list li {\n font-size: 15px;\n line-height: 1.6;\n color: #1F2937;\n margin-bottom: 10px;\n padding-left: 4px;\n }\n\n .${v}offer-details-list li:last-child {\n margin-bottom: 0;\n }\n\n .${v}offer-details-list li::marker {\n color: #D1D5DB;\n font-size: 0.8em;\n }\n\n /* Offer Footer */\n .${v}offer-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24px 36px 30px;\n border-top: 1px solid #E5E7EB;\n gap: 16px;\n }\n\n /* Offer Merchant */\n .${v}offer-merchant {\n display: flex;\n align-items: center;\n gap: 14px;\n flex: 1;\n min-width: 0;\n }\n\n .${v}offer-logo {\n width: 52px;\n height: 52px;\n border-radius: 10px;\n object-fit: contain;\n background-color: #F3F4F6;\n padding: 6px;\n flex-shrink: 0;\n opacity: 0;\n transition: opacity 200ms ease-out;\n }\n\n .${v}offer-logo.${v}loaded {\n opacity: 1;\n }\n\n .${v}offer-merchant-text {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n min-width: 0;\n }\n\n .${v}offer-merchant-name {\n font-size: 16px;\n font-weight: 600;\n color: var(--encore-text-color);\n line-height: 1.2;\n }\n\n .${v}offer-merchant-desc {\n font-size: 14px;\n color: #6B7280;\n line-height: 1.4;\n }\n\n /* Claim Button */\n .${v}button-claim {\n padding: 14px 36px;\n font-size: 15px;\n font-weight: 600;\n border-radius: 28px;\n border: none;\n background: linear-gradient(135deg, #5B68EF 0%, #6B7CF9 100%);\n color: white;\n cursor: pointer;\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n font-family: var(--encore-font-family);\n white-space: nowrap;\n box-shadow: 0 2px 8px rgba(91, 104, 239, 0.25);\n }\n\n .${v}button-claim:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(91, 104, 239, 0.35);\n background: linear-gradient(135deg, #6B7CF9 0%, #7B8CFF 100%);\n }\n\n .${v}button-claim:active {\n transform: translateY(0);\n box-shadow: 0 2px 8px rgba(91, 104, 239, 0.25);\n }\n\n .${v}button-claim:focus {\n outline: 2px solid #5B68EF;\n outline-offset: 2px;\n }\n\n .${v}button-claim:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n\n /* Carousel Navigation */\n .${v}carousel-navigation {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 20px;\n padding: 28px 32px 32px;\n border-top: 1px solid #E5E7EB;\n }\n\n .${v}nav-button {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n border: 2px solid #E5E7EB;\n background-color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #6B7280;\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n padding: 0;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n }\n\n .${v}nav-button:hover:not(:disabled) {\n background-color: #F9FAFB;\n border-color: #D1D5DB;\n color: #374151;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\n transform: scale(1.05);\n }\n\n .${v}nav-button:active:not(:disabled) {\n transform: scale(0.98);\n }\n\n .${v}nav-button:focus {\n outline: 2px solid #5B68EF;\n outline-offset: 2px;\n }\n\n .${v}nav-button svg {\n width: 20px;\n height: 20px;\n stroke-width: 2.5;\n }\n\n .${v}nav-button:disabled,\n .${v}nav-button.${v}disabled {\n opacity: 0.25;\n cursor: not-allowed;\n border-color: #E5E7EB;\n color: #D1D5DB;\n }\n\n .${v}nav-button:disabled:hover,\n .${v}nav-button.${v}disabled:hover {\n background-color: white;\n border-color: #E5E7EB;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n transform: none;\n }\n\n /* Loading State */\n .${v}loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 48px;\n }\n\n .${v}spinner {\n width: 40px;\n height: 40px;\n border: 3px solid #E5E7EB;\n border-top-color: var(--encore-primary-color);\n border-radius: 50%;\n animation: ${v}spin 0.8s linear infinite;\n }\n\n @keyframes ${v}spin {\n to { transform: rotate(360deg); }\n }\n\n /* Responsive: Mobile (0-767px) */\n @media (max-width: 767px) {\n .${v}modal {\n width: calc(100% - 24px);\n max-width: 100%;\n margin: 12px;\n }\n\n .${v}carousel-header {\n padding: 24px 20px 20px;\n }\n\n .${v}carousel-title {\n font-size: 22px;\n }\n\n .${v}carousel-subtitle {\n font-size: 14px;\n }\n\n .${v}carousel-cards {\n padding: 20px 40px;\n }\n\n .${v}carousel-item {\n flex: 0 0 calc(100% - 80px);\n }\n\n .${v}offer-banner {\n padding: 16px 16px 0;\n }\n\n .${v}offer-details {\n padding: 20px 20px;\n }\n\n .${v}offer-footer {\n padding: 16px 20px 24px;\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .${v}offer-merchant {\n flex: 1 1 100%;\n }\n\n .${v}button-claim {\n flex: 1 1 100%;\n }\n\n .${v}carousel-navigation {\n padding: 20px 20px 24px;\n }\n }\n\n /* Responsive: Tablet (768-1023px) */\n @media (min-width: 768px) and (max-width: 1023px) {\n .${v}modal {\n max-width: 600px;\n }\n }\n\n /* Responsive: Desktop (1024px+) */\n @media (min-width: 1024px) {\n .${v}modal {\n max-width: 600px;\n }\n }\n\n /* Accessibility: High Contrast Mode */\n @media (prefers-contrast: high) {\n .${v}button {\n border: 2px solid currentColor;\n }\n }\n\n /* Accessibility: Reduced Motion */\n @media (prefers-reduced-motion: reduce) {\n .${v}backdrop,\n .${v}modal,\n .${v}button,\n .${v}close-button {\n transition: none;\n }\n\n .${v}spinner {\n animation: none;\n }\n }\n\n /* Focus Visible (for keyboard navigation) */\n .${v}button:focus-visible,\n .${v}close-button:focus-visible {\n outline: 2px solid var(--encore-primary-color);\n outline-offset: 2px;\n }\n\n /* ===== Success Screen ===== */\n .${v}success-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n min-height: 400px;\n animation: ${v}fade-in 0.3s ease-out;\n }\n\n .${v}success-icon {\n width: 80px;\n height: 80px;\n background: linear-gradient(135deg, var(--encore-primary-color), #10b981);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 48px;\n color: white;\n margin-bottom: 1.5rem;\n animation: ${v}scale-in 0.5s ease-out;\n }\n\n .${v}success-title {\n font-size: 1.75rem;\n font-weight: 700;\n color: var(--encore-text-color);\n margin: 0 0 0.75rem 0;\n }\n\n .${v}success-subtitle {\n font-size: 1.125rem;\n color: var(--encore-text-muted);\n margin: 0 0 2rem 0;\n line-height: 1.6;\n }\n\n .${v}success-details {\n background: rgba(79, 70, 229, 0.05);\n border-radius: 12px;\n padding: 1.5rem;\n margin-bottom: 2rem;\n min-width: 280px;\n }\n\n .${v}success-detail {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.5rem 0;\n }\n\n .${v}success-detail:not(:last-child) {\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n }\n\n .${v}success-detail-label {\n font-size: 0.875rem;\n color: var(--encore-text-muted);\n font-weight: 500;\n }\n\n .${v}success-detail-value {\n font-size: 1rem;\n color: var(--encore-text-color);\n font-weight: 600;\n }\n\n .${v}success-button {\n background: linear-gradient(135deg, var(--encore-primary-color), #10b981);\n color: white;\n border: none;\n border-radius: var(--encore-border-radius);\n padding: 0.875rem 2.5rem;\n font-size: 1rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n }\n\n .${v}success-button:hover {\n transform: translateY(-2px);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n }\n\n .${v}success-button:active {\n transform: translateY(0);\n }\n\n .${v}success-button:focus-visible {\n outline: 2px solid var(--encore-primary-color);\n outline-offset: 2px;\n }\n\n @keyframes ${v}scale-in {\n from {\n transform: scale(0);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n `}(e),document.head.appendChild(t),n.debug("Encore styles injected successfully")}catch(e){n.error("Failed to inject Encore styles:",e)}}function x(e){return`${v}${e}`}class w{#b;#re=null;#se=null;#oe=null;#ae=null;#le=!1;#ce=null;#de=[];#ue=null;constructor(e={}){this.#b=new o,y(e)}show(){this.#le?n.warn("Modal is already visible"):(this.#ce=document.activeElement,this.#he(),this.#re&&document.body.appendChild(this.#re),this.#se&&document.body.appendChild(this.#se),document.body.classList.add(x("no-scroll")),requestAnimationFrame(()=>{this.#re?.classList.add(x("visible")),this.#se?.classList.add(x("visible"))}),this.#ge(),this.#fe(),this.#me(),this.#le=!0,this.#b.emit("show",void 0),n.debug("Modal shown"))}hide(){this.#le&&(this.#re?.classList.remove(x("visible")),this.#se?.classList.remove(x("visible")),setTimeout(()=>{this.#pe(),document.body.classList.remove(x("no-scroll")),this.#ce instanceof HTMLElement&&this.#ce.focus(),this.#le=!1,this.#b.emit("hide",void 0),n.debug("Modal hidden")},200))}isVisible(){return this.#le}setContent(e){this.#ae?(this.#ae.innerHTML="",this.#ae.appendChild(e),this.#fe()):n.error("Modal body not initialized")}on(e,t){return this.#b.on(e,t)}#he(){this.#re=document.createElement("div"),this.#re.className=x("backdrop"),this.#re.setAttribute("aria-hidden","true"),this.#se=document.createElement("div"),this.#se.className=x("modal"),this.#se.setAttribute("role","dialog"),this.#se.setAttribute("aria-modal","true"),this.#se.setAttribute("aria-labelledby",x("modal-title")),this.#oe=document.createElement("button"),this.#oe.className=x("close-button"),this.#oe.setAttribute("aria-label","Close modal"),this.#oe.innerHTML='\n <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />\n </svg>\n ',this.#ae=document.createElement("div"),this.#ae.className=x("modal-body"),this.#se.appendChild(this.#oe),this.#se.appendChild(this.#ae)}#pe(){this.#re?.remove(),this.#se?.remove(),this.#re=null,this.#se=null,this.#oe=null,this.#ae=null}#ge(){this.#oe?.addEventListener("click",()=>{this.#b.emit("close",void 0),this.hide()}),this.#re?.addEventListener("click",()=>{this.#b.emit("backdropClick",void 0),this.hide()}),this.#ue=this.#be.bind(this),document.addEventListener("keydown",this.#ue)}#be(e){if(this.#le)switch(e.key){case"Escape":e.preventDefault(),this.#b.emit("close",void 0),this.hide();break;case"Tab":e.preventDefault(),this.#ve(e.shiftKey)}}#ve(e){if(0===this.#de.length)return;const t=this.#de.findIndex(e=>e===document.activeElement);let n;n=e?t<=0?this.#de.length-1:t-1:t>=this.#de.length-1?0:t+1,this.#de[n]?.focus()}#fe(){if(!this.#se)return;const e=["button:not([disabled])","a[href]","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(", ");this.#de=Array.from(this.#se.querySelectorAll(e))}#me(){this.#de.length>0&&this.#de[0]?.focus()}destroy(){this.#ue&&document.removeEventListener("keydown",this.#ue),this.#b.removeAllListeners(),this.hide()}}class E{#b;#ye=null;#xe=null;constructor(){this.#b=new o}render(e){this.#ye=e,this.#xe=document.createElement("div"),this.#xe.className=x("offer-card");const t=this.#we(e.imageUrl,e.title);this.#xe.appendChild(t);const n=this.#Ee(e);this.#xe.appendChild(n);const i=this.#Ie(e);return this.#xe.appendChild(i),this.#xe}on(e,t){return this.#b.on(e,t)}#we(e,t){const i=document.createElement("div");i.className=x("offer-banner");const r=document.createElement("img");return r.className=x("offer-banner-image"),r.alt=t??"Offer image",e?(r.src=e,r.complete?r.classList.add(x("loaded")):r.onload=()=>{r.classList.add(x("loaded"))},r.onerror=()=>{n.warn("Failed to load offer image, using fallback"),r.src=this.#Ce(),r.classList.add(x("loaded"))}):(r.src=this.#Ce(),r.classList.add(x("loaded"))),i.appendChild(r),i}#Ce(){return`data:image/svg+xml;base64,${btoa('\n <svg xmlns="http://www.w3.org/2000/svg" width="600" height="240" viewBox="0 0 600 240">\n <rect width="600" height="240" fill="#E5E7EB"/>\n <text x="50%" y="50%" text-anchor="middle" dy=".3em" fill="#9CA3AF" font-family="sans-serif" font-size="18">\n Offer Image\n </text>\n </svg>\n ')}`}#Ee(e){const t=document.createElement("div");t.className=x("offer-details");const n=document.createElement("h3");n.className=x("offer-details-heading"),n.textContent="Offer details";const i=document.createElement("ul");if(i.className=x("offer-details-list"),e.instructions&&e.instructions.length>0)e.instructions.forEach(e=>{const t=document.createElement("li");t.textContent=e.subtitle||e.title,i.appendChild(t)});else if(e.description){const t=document.createElement("li");t.textContent=e.description,i.appendChild(t)}return t.appendChild(n),t.appendChild(i),t}#Ie(e){const t=document.createElement("div");t.className=x("offer-footer");const i=document.createElement("div");if(i.className=x("offer-merchant"),e.logoUrl){const t=document.createElement("img");t.className=x("offer-logo"),t.src=e.logoUrl,t.alt=`${e.merchantName??"Merchant"} logo`,t.complete?t.classList.add(x("loaded")):t.onload=()=>{t.classList.add(x("loaded"))},t.onerror=()=>{n.warn("Failed to load merchant logo",{merchantName:e.merchantName}),t.style.display="none"},i.appendChild(t)}const r=document.createElement("div");if(r.className=x("offer-merchant-text"),e.merchantName){const t=document.createElement("div");t.className=x("offer-merchant-name"),t.textContent=e.merchantName,r.appendChild(t)}if(e.quickInstructions){const t=document.createElement("div");t.className=x("offer-merchant-desc"),t.textContent=e.quickInstructions,r.appendChild(t)}i.appendChild(r);const s=document.createElement("button");return s.className=`${x("button")} ${x("button-claim")}`,s.textContent=e.ctaText??"Claim",s.setAttribute("aria-label",`Claim offer: ${e.title??"offer"}`),s.addEventListener("click",()=>{this.#ye&&this.#b.emit("claim",{offer:this.#ye})}),t.appendChild(i),t.appendChild(s),t}destroy(){this.#b.removeAllListeners(),this.#xe=null,this.#ye=null}}class I{#b;#$e;#ke=0;#xe=null;#Ae=null;#Te=null;#Ne=[];#Se=null;#Re=null;constructor(e){if(this.#b=new o,this.#$e=e,0===e.length)throw new Error("OfferCarousel requires at least one offer");this.#Le()}render(){this.#xe=document.createElement("div"),this.#xe.className=x("carousel"),this.#Se=document.createElement("div"),this.#Se.setAttribute("role","status"),this.#Se.setAttribute("aria-live","polite"),this.#Se.setAttribute("aria-atomic","true"),this.#Se.className="sr-only",this.#Se.style.position="absolute",this.#Se.style.width="1px",this.#Se.style.height="1px",this.#Se.style.padding="0",this.#Se.style.margin="-1px",this.#Se.style.overflow="hidden",this.#Se.style.clip="rect(0, 0, 0, 0)",this.#Se.style.whiteSpace="nowrap",this.#Se.style.border="0";const e=this.#De();if(this.#xe.appendChild(e),this.#Ae=document.createElement("div"),this.#Ae.className=x("carousel-cards"),this.#xe.appendChild(this.#Se),this.#xe.appendChild(this.#Ae),this.#$e.length>1){const e=this.#Oe();this.#xe.appendChild(e)}return this.#Me(),this.#Ue(),this.#Fe(0,!1),this.#xe}on(e,t){return this.#b.on(e,t)}getCurrentIndex(){return this.#ke}getTotalOffers(){return this.#$e.length}next(){this.#ke<this.#$e.length-1&&(this.#ke++,this.#Fe(this.#ke),this.#qe(),this.#Be(`Showing offer ${this.#ke+1} of ${this.#$e.length}`),n.debug(`Navigated to offer ${this.#ke+1}`))}previous(){this.#ke>0&&(this.#ke--,this.#Fe(this.#ke),this.#qe(),this.#Be(`Showing offer ${this.#ke+1} of ${this.#$e.length}`),n.debug(`Navigated to offer ${this.#ke+1}`))}#Me(){if(!this.#Ae)return;const e=this.#Ae;this.#$e.forEach((t,n)=>{const i=new E,r=i.render(t),s=document.createElement("div");s.className=x("carousel-item"),s.setAttribute("data-index",n.toString()),s.appendChild(r),i.on("claim",()=>{this.#b.emit("offerClaim",{offer:t,index:n})}),this.#Ne.push(i),e.appendChild(s)}),requestAnimationFrame(()=>{e.classList.add(x("cards-ready"))})}#Fe(e,t=!0){if(!this.#Ae)return;const n=this.#Ae.querySelectorAll(`.${x("carousel-item")}`),i=n[e];if(i){i.scrollIntoView({behavior:t?"smooth":"auto",block:"nearest",inline:"center"}),n.forEach((t,n)=>{n===e?t.classList.add(x("active")):t.classList.remove(x("active"))});const r=this.#$e[e];r&&this.#b.emit("offerView",{offer:r,index:e})}}#De(){const e=document.createElement("div");e.className=x("carousel-header");const t=document.createElement("h2");t.className=x("carousel-title"),t.id=x("modal-title"),t.textContent="Unlock 10 free articles – choose an offer below";const n=document.createElement("p");return n.className=x("carousel-subtitle"),n.textContent="Activate one of these partner offers and get 10 free articles. No credit card required.",e.appendChild(t),e.appendChild(n),e}#Oe(){const e=document.createElement("div");e.className=x("carousel-navigation");const t=document.createElement("button");t.className=x("nav-button"),t.setAttribute("aria-label","Previous offer"),t.innerHTML='\n <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />\n </svg>\n ',t.addEventListener("click",()=>this.previous());const n=document.createElement("button");return n.className=x("nav-button"),n.setAttribute("aria-label","Next offer"),n.innerHTML='\n <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />\n </svg>\n ',n.addEventListener("click",()=>this.next()),e.appendChild(t),e.appendChild(n),this.#Te=e,this.#qe(t,n),e}#qe(e,t){if(!this.#Te)return;const n=this.#Te.querySelectorAll(`.${x("nav-button")}`),i=e??n[0],r=t??n[1];i&&(i.disabled=0===this.#ke,i.classList.toggle(x("disabled"),0===this.#ke)),r&&(r.disabled=this.#ke===this.#$e.length-1,r.classList.toggle(x("disabled"),this.#ke===this.#$e.length-1))}#Ue(){this.#Re=this.#Ke.bind(this),document.addEventListener("keydown",this.#Re)}#Ke(e){if(this.#xe)switch(e.key){case"ArrowLeft":e.preventDefault(),this.previous();break;case"ArrowRight":e.preventDefault(),this.next()}}#Be(e){this.#Se&&(this.#Se.textContent=e)}#Le(){this.#$e.forEach(e=>{e.imageUrl&&((new Image).src=e.imageUrl,n.debug("Preloading offer image",{offerId:e.id,url:e.imageUrl})),e.logoUrl&&((new Image).src=e.logoUrl,n.debug("Preloading merchant logo",{offerId:e.id,url:e.logoUrl}))})}destroy(){this.#Re&&document.removeEventListener("keydown",this.#Re),this.#Ne.forEach(e=>e.destroy()),this.#Ne=[],this.#b.removeAllListeners(),this.#xe=null,this.#Ae=null,this.#Te=null,this.#Se=null}}const C=e=>`encore-success-${e}`;class ${#xe=null;#b;#t;#Pe=null;constructor(e){this.#t=e,this.#b=new o}render(){this.#xe=document.createElement("div"),this.#xe.className=C("container");const e=document.createElement("div");e.className=C("icon"),e.innerHTML="✓";const t=document.createElement("h2");t.className=C("title"),t.textContent=this.#t.titleText??"Success!";const i=document.createElement("p");i.className=C("subtitle"),i.textContent=this.#t.subtitleText??this.#ze(this.#t.entitlement);const r=document.createElement("div");r.className=C("details"),r.innerHTML=this.#_e(this.#t.entitlement);const s=document.createElement("button");return s.className=C("button"),s.textContent=this.#t.buttonText??"Continue",s.setAttribute("type","button"),s.addEventListener("click",()=>this.#Ge()),this.#xe.appendChild(e),this.#xe.appendChild(t),this.#xe.appendChild(i),this.#xe.appendChild(r),this.#xe.appendChild(s),this.#t.autoDismissMs&&this.#t.autoDismissMs>0&&this.#je(this.#t.autoDismissMs),n.debug("Success screen rendered"),this.#xe}on(e,t){return this.#b.on(e,t)}destroy(){null!==this.#Pe&&(clearTimeout(this.#Pe),this.#Pe=null),this.#xe&&(this.#xe.remove(),this.#xe=null),this.#b.removeAllListeners(),n.debug("Success screen destroyed")}#Ge(){n.debug("User clicked continue on success screen"),this.#b.emit("continue",void 0)}#je(e){this.#Pe=window.setTimeout(()=>{n.debug("Success screen auto-dismissing"),this.#b.emit("continue",void 0)},e)}#ze(e){switch(e.type){case"freeTrial":return`You've unlocked a ${e.value??""} ${e.unit??"day"} free trial!`;case"discount":return`You've received a ${e.value??""}${"percent"===e.unit?"%":""} discount!`;case"credit":return`You've earned $${e.value??"0"} in credits!`;default:return"You've unlocked a special offer!"}}#_e(e){const t=[];if("freeTrial"===e.type)t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Type:</span>\n <span class="${C("detail-value")}">Free Trial</span>\n </div>`),e.value&&e.unit&&t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Duration:</span>\n <span class="${C("detail-value")}">${e.value} ${e.unit}</span>\n </div>`);else if("discount"===e.type){if(t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Type:</span>\n <span class="${C("detail-value")}">Discount</span>\n </div>`),e.value&&e.unit){const n="percent"===e.unit?`${e.value}%`:`$${e.value}`;t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Amount:</span>\n <span class="${C("detail-value")}">${n}</span>\n </div>`)}}else"credit"===e.type&&(t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Type:</span>\n <span class="${C("detail-value")}">Credit</span>\n </div>`),e.value&&t.push(`<div class="${C("detail")}">\n <span class="${C("detail-label")}">Amount:</span>\n <span class="${C("detail-value")}}">$${e.value}</span>\n </div>`));return t.join("")}}class k{#He=null;#Ve=null;#Qe=!1;start(e){this.#Qe?n.warn("FocusDetector already active"):(this.#He=()=>{n.debug("Window focused"),e()},this.#Ve=()=>{"visible"===document.visibilityState&&(n.debug("Document became visible"),e())},window.addEventListener("focus",this.#He),document.addEventListener("visibilitychange",this.#Ve),this.#Qe=!0,n.debug("FocusDetector started"))}stop(){this.#Qe&&(this.#He&&(window.removeEventListener("focus",this.#He),this.#He=null),this.#Ve&&(document.removeEventListener("visibilitychange",this.#Ve),this.#Ve=null),this.#Qe=!1,n.debug("FocusDetector stopped"))}isActive(){return this.#Qe}}function A(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=15&(crypto.getRandomValues(new Uint8Array(1))[0]??0);return("x"===e?t:3&t|8).toString(16)})}const T="1.0.0",N="user_id",S="user_attributes",R=new class{#We;#h;#g=null;#Je=null;#Ye=null;#Ze=null;#Xe=null;#f=null;#et={};#tt=!1;#nt=!1;constructor(){this.#We=new i,this.#h=new s}configure(e){if(this.#We.configure(e)){this.#it();const e=this.#We.getBaseURL();e&&(this.#g=new p(this.#We.getApiKey()??"",e),this.#f&&(this.#Je=new c(this.#h,this.#g,this.#f),this.#Ye=new u(this.#h,this.#g,this.#f),this.#Ze=new h(this.#g,this.#f)),this.#Xe=new k),n.info("Encore SDK initialized successfully",{version:T})}}#it(){const e=this.#h.get(N);e?(this.#f=e,n.debug("Loaded existing user ID:",e)):(this.#f=A(),this.#h.set(N,this.#f),n.debug("Generated new user ID:",this.#f));const t=this.#h.get(S);t&&(this.#et=t,n.debug("Loaded user attributes"))}#rt(){return!!this.#We.isConfigured()||(n.error("SDK not configured. Call Encore.configure() first."),!1)}identify(e,t){if(!this.#rt())return;if(!e||"string"!=typeof e)return void n.error("identify() requires a valid user ID string");const i=this.#f;this.#f=e,this.#h.set(N,e),t&&this.setUserAttributes(t),i!==e&&(n.info("User identified:",e),this.#Je&&this.#Je.setUserId(e),this.#Ye&&this.#Ye.setUserId(e),this.#Ze&&this.#Ze.setUserId(e))}getCurrentUserId(){return this.#f}reset(){this.#rt()&&(n.info("Resetting SDK"),this.#h.clear(),this.#f=A(),this.#h.set(N,this.#f),this.#et={},this.#Je&&(this.#Je.clearCache(),this.#g&&this.#f&&(this.#Je=new c(this.#h,this.#g,this.#f))),this.#Ye&&(this.#Ye.clearQueue(),this.#Ye.destroy(),this.#g&&this.#f&&(this.#Ye=new u(this.#h,this.#g,this.#f))),this.#Ze&&(this.#Ze.clearCache(),this.#g&&this.#f&&(this.#Ze=new h(this.#g,this.#f))),this.#Xe?.isActive()&&this.#Xe.stop(),n.debug("SDK reset complete",{newUserId:this.#f}))}getVersion(){return T}setLogLevel(e){n.setLogLevel(e)}setUserAttributes(e){this.#rt()&&(e&&"object"==typeof e?(this.#et={...this.#et,...e,custom:{...this.#et.custom,...e.custom}},this.#h.set(S,this.#et),n.debug("User attributes updated",this.#et)):n.error("setUserAttributes() requires a valid UserAttributes object"))}getUserAttributes(){return{...this.#et}}async presentOffer(t){if(!this.#rt()){const n={type:"error",error:{code:e.INITIALIZATION_ERROR,message:"SDK not configured"}};return t?.onNotGranted&&t.onNotGranted(n),t?.onError&&t.onError({code:e.INITIALIZATION_ERROR,message:"SDK not configured"}),{granted:!1,reason:n}}if(this.#tt){n.warn("Presentation already in progress");const i={type:"error",error:{code:e.UNKNOWN_ERROR,message:"Presentation already in progress"}};return t?.onNotGranted&&t.onNotGranted(i),{granted:!1,reason:i}}this.#tt=!0;try{const e=await this.#st(t);return e.granted&&e.entitlement&&t?.onGranted?t.onGranted(e.entitlement):!e.granted&&e.reason&&t?.onNotGranted&&t.onNotGranted(e.reason),e}catch(i){n.error("Error during presentation",i);const r={type:"error",error:{code:e.UNKNOWN_ERROR,message:i instanceof Error?i.message:"Unknown error"}};return t?.onError&&"string"!=typeof r&&"error"===r.type&&t.onError(r.error),t?.onNotGranted&&t.onNotGranted(r),{granted:!1,reason:r}}finally{this.#tt=!1}}isActive(e,t){return!!this.#rt()&&(this.#Je?this.#Je.isActive(e,t):(n.error("EntitlementManager not initialized"),!1))}async refreshEntitlements(){this.#rt()&&(this.#Je?await this.#Je.refreshEntitlements():n.error("EntitlementManager not initialized"))}didGrant(e,t){this.#rt()&&(this.#Ye?t&&"string"==typeof t?this.#Ye.sendGrantSignal(t,e):n.error("didGrant() requires a valid transaction ID"):n.error("SignalManager not initialized"))}async waitForVerification(e,t){if(!this.#rt())return n.error("SDK not configured"),"failed";if(!this.#g)return n.error("API client not initialized"),"failed";if(!e)return n.error("waitForVerification() requires a transaction ID"),"failed";try{n.debug("Starting verification wait",{transactionId:e,timeout:t});const i={transactionId:e};void 0!==t&&(i.timeout=t);const r=new g(this.#g,i),s=await r.poll();return"verified"===s&&await this.refreshEntitlements(),s}catch(t){return n.error("Error during verification wait",{transactionId:e,error:t}),"failed"}}on(e,t){return this.#rt()?this.#Je?this.#Je.getEventEmitter().on(e,t):(n.error("EntitlementManager not initialized"),()=>{}):()=>{}}observeEntitlement(e,t){return{subscribe:i=>{if(!this.#rt())return()=>{};if(!this.#Je)return n.error("EntitlementManager not initialized"),()=>{};const r=this.#Je.isActive(e,t);return i(r),this.on("entitlementChanged",n=>{const r=n.scope;JSON.stringify(n.entitlementType)===JSON.stringify(e)&&("verified"===t&&"verified"!==r||i(n.isActive))})}}}placement(){return new f(async()=>this.presentOffer())}async#st(t){if(!this.#Ze||!this.#g)return n.error("Managers not initialized"),{granted:!1,reason:{type:"error",error:{code:e.INITIALIZATION_ERROR,message:"Managers not initialized"}}};try{this.#nt||(y({}),this.#nt=!0),n.debug("Fetching offers");const{offers:t,uiConfiguration:i}=await this.#Ze.fetchOffers(this.#et);if(0===t.length)return n.info("No offers available"),{granted:!1,reason:"noOffersAvailable"};const r={...this.#We.getUIConfiguration(),...i},s=new Map,o=new Set;t.forEach(e=>{s.set(e.id,A())});const a=new w,l=new I(t),c=await new Promise(t=>{l.on("offerClaim",i=>{const o=i.offer;n.debug("User claimed offer",{offerId:o.id}),(async()=>{try{if(!this.#Ze)throw new Error("OfferManager not initialized");const e=s.get(o.id),i=await this.#Ze.startTransaction(o.campaignId,o.creativeId,e);this.#ot(o.advertiserUrl)||n.warn("Failed to open advertiser URL (popup blocked?)"),this.didGrant("provisional",i),await this.refreshEntitlements(),this.#Xe&&!this.#Xe.isActive()&&this.#Xe.start(()=>{(async()=>{n.debug("User returned to app, refreshing entitlements"),await this.refreshEntitlements()})()}),this.#at(a,o.entitlement,()=>{a.hide(),t({granted:!0,entitlement:o.entitlement})},r)}catch(i){n.error("Error starting transaction",{offerId:o.id,error:i}),a.hide(),t({granted:!1,reason:{type:"error",error:{code:e.UNKNOWN_ERROR,message:i instanceof Error?i.message:"Transaction failed"}}})}})()}),l.on("complete",e=>{e.claimed||(n.debug("User declined last offer"),l.destroy(),a.hide(),t({granted:!1,reason:"userDeclinedLastOffer"}))}),a.on("close",()=>{n.debug("User closed modal"),l.destroy(),t({granted:!1,reason:"userClosedModal"})}),a.on("backdropClick",()=>{n.debug("User clicked outside modal"),l.destroy(),a.hide(),t({granted:!1,reason:"userClickedOutside"})}),l.on("offerView",e=>{const{offer:t}=e;if(o.has(t.id))return void n.debug("Impression already logged for this modal session",{offerId:t.id});const i=s.get(t.id);i&&this.#Ze&&(this.#Ze.logImpression(i,t),o.add(t.id))}),a.show();const i=l.render();a.setContent(i)});return a.destroy(),l.destroy(),c}catch(t){return n.error("Error in presentation flow",t),{granted:!1,reason:{type:"error",error:{code:e.UNKNOWN_ERROR,message:t instanceof Error?t.message:"Unknown error"}}}}}#ot(e){try{const t=window.open(e,"_blank","noopener,noreferrer");return!!t&&(t.focus(),!0)}catch(t){return n.error("Failed to open advertiser URL",{url:e,error:t}),!1}}#at(e,t,i,r){try{const s={entitlement:t,autoDismissMs:0};r?.creditClaimedTitleText&&(s.titleText=r.creditClaimedTitleText),r?.creditClaimedSubtitleText&&(s.subtitleText=r.creditClaimedSubtitleText),r?.applyCreditsButtonText&&(s.buttonText=r.applyCreditsButtonText);const o=new $(s);o.on("continue",()=>{o.destroy(),i()});const a=o.render();e.setContent(a),n.debug("Success screen displayed")}catch(e){n.error("Failed to show success screen",e),i()}}};export{R as Encore,R as default};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|