@growth-rail/core 2.2.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +2 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +9 -76
- package/dist/index.mjs +8 -75
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -33,7 +33,8 @@ Initialize the singleton instance with your Project Secret Key.
|
|
|
33
33
|
import { GrowthRail } from '@growth-rail/core';
|
|
34
34
|
|
|
35
35
|
GrowthRail.init({
|
|
36
|
-
projectSecretKey: 'your_project_secret_key_here'
|
|
36
|
+
projectSecretKey: 'your_project_secret_key_here',
|
|
37
|
+
debug: true // Enable verbose console logging
|
|
37
38
|
});
|
|
38
39
|
|
|
39
40
|
// Initialize a user session
|
package/dist/index.d.mts
CHANGED
|
@@ -8,6 +8,8 @@ type GrowthRailOptions = {
|
|
|
8
8
|
cookieDomain?: string;
|
|
9
9
|
/** Whether to automatically track page views. */
|
|
10
10
|
autoPageTrack?: boolean;
|
|
11
|
+
/** Whether to enable debug mode for verbose console logging. */
|
|
12
|
+
debug?: boolean;
|
|
11
13
|
};
|
|
12
14
|
/**
|
|
13
15
|
* Information about the current application user.
|
|
@@ -50,12 +52,10 @@ type TriggerButtonPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top
|
|
|
50
52
|
* Configuration for the referral trigger button.
|
|
51
53
|
*/
|
|
52
54
|
type ReferrerTriggerButton = {
|
|
53
|
-
/** Whether to show the button. */
|
|
54
|
-
show: boolean;
|
|
55
55
|
/** Where to position the button on the screen. */
|
|
56
56
|
position: TriggerButtonPosition;
|
|
57
57
|
/** How the button is displayed (floating or attached to the edge). */
|
|
58
|
-
displayMode: 'floating' | 'edge';
|
|
58
|
+
displayMode: 'floating' | 'edge' | 'none';
|
|
59
59
|
};
|
|
60
60
|
/**
|
|
61
61
|
* Configuration for the referral dashboard / modal.
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ type GrowthRailOptions = {
|
|
|
8
8
|
cookieDomain?: string;
|
|
9
9
|
/** Whether to automatically track page views. */
|
|
10
10
|
autoPageTrack?: boolean;
|
|
11
|
+
/** Whether to enable debug mode for verbose console logging. */
|
|
12
|
+
debug?: boolean;
|
|
11
13
|
};
|
|
12
14
|
/**
|
|
13
15
|
* Information about the current application user.
|
|
@@ -50,12 +52,10 @@ type TriggerButtonPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top
|
|
|
50
52
|
* Configuration for the referral trigger button.
|
|
51
53
|
*/
|
|
52
54
|
type ReferrerTriggerButton = {
|
|
53
|
-
/** Whether to show the button. */
|
|
54
|
-
show: boolean;
|
|
55
55
|
/** Where to position the button on the screen. */
|
|
56
56
|
position: TriggerButtonPosition;
|
|
57
57
|
/** How the button is displayed (floating or attached to the edge). */
|
|
58
|
-
displayMode: 'floating' | 'edge';
|
|
58
|
+
displayMode: 'floating' | 'edge' | 'none';
|
|
59
59
|
};
|
|
60
60
|
/**
|
|
61
61
|
* Configuration for the referral dashboard / modal.
|
package/dist/index.js
CHANGED
|
@@ -1,82 +1,15 @@
|
|
|
1
|
-
"use strict";var b=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var P=(p,e,t)=>e in p?b(p,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):p[e]=t;var M=(p,e)=>{for(var t in e)b(p,t,{get:e[t],enumerable:!0})},U=(p,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of T(e))!z.call(p,i)&&i!==t&&b(p,i,{get:()=>e[i],enumerable:!(n=C(e,i))||n.enumerable});return p};var L=p=>U(b({},"__esModule",{value:!0}),p);var a=(p,e,t)=>P(p,typeof e!="symbol"?e+"":e,t);var B={};M(B,{GrowthRail:()=>x,ReferralModal:()=>m});module.exports=L(B);var y=class{constructor(e){a(this,"baseUrl");a(this,"projectSecretKey");let t=typeof process<"u"&&process.env?.ENV_BASE_URL;this.baseUrl=t||"https://api.growthrail.dev",this.projectSecretKey=e.projectSecretKey}async request(e,t,n){let i={"Content-Type":"application/json","X-GrowthRail-ProjectSecret":this.projectSecretKey};try{let o=await fetch(`${this.baseUrl}${e}`,{method:t,headers:i,body:n?JSON.stringify(n):void 0});if(!o.ok)throw new Error(`GrowthRail API Error: ${o.statusText}`);return o.json()}catch(o){throw console.error("GrowthRail SDK Error:",o),o}}async getNewUserExperience(){return this.request("/api/v1/sdk/new-user-experience","POST")}async initAppUser(e){return this.request("/api/v1/sdk/init-app-user","POST",{clientProvidedId:e})}async trackReferral(e,t){return this.request("/api/v1/sdk/track-referral","POST",{referralCode:e,rewardEventName:t})}async trackRewardEvent(e,t,n){return this.request("/api/v1/sdk/track-reward-event","POST",{refereeId:e,referralTrackingId:t,eventName:n})}};var u=class u{constructor(e){a(this,"options",{});e&&(this.options=e)}setCookie(e,t,n=30){if(typeof document>"u")return;let i="";if(n){let s=new Date;s.setTime(s.getTime()+n*24*60*60*1e3),i=`; expires=${s.toUTCString()}`}let o="";this.options.cookieDomain&&(o=`; domain=${this.options.cookieDomain}`),document.cookie=`${e}=${t||""}${i}${o}; path=/; SameSite=Lax`}getCookie(e){if(typeof document>"u")return null;let t=`${e}=`,n=document.cookie.split(";");for(let i=0;i<n.length;i++){let o=n[i];for(;o.charAt(0)===" ";)o=o.substring(1,o.length);if(o.indexOf(t)===0)return o.substring(t.length,o.length)}return null}getReferralCode(){return this.getCookie(u.REFERRAL_CODE_KEY)}setReferralCode(e){this.setCookie(u.REFERRAL_CODE_KEY,e,30)}setTrackedReferral(e){this.setCookie(u.TRACKED_REFERRAL_KEY,e,30)}getTrackedReferral(){return this.getCookie(u.TRACKED_REFERRAL_KEY)}};a(u,"REFERRAL_CODE_KEY","gr_ref_code"),a(u,"TRACKED_REFERRAL_KEY","gr_tracked_referral");var v=u;var m=class{constructor(e,t){a(this,"referrerExperience");a(this,"deps");a(this,"host",null);a(this,"shadow",null);a(this,"overlay",null);a(this,"content",null);this.deps=e,this.referrerExperience=t}show(e,t){this.host||(this.createDom(e,t),this.bindEvents(),t||(document.body.style.overflow="hidden"))}hide(){this.host&&(this.host&&this.host.parentNode&&this.host.parentNode.removeChild(this.host),this.host=null,this.overlay=null,this.content=null,this.shadow=null,document.body.style.overflow="")}createDom(e,t){let n={...this.referrerExperience,modal:{...this.referrerExperience.modal,...e??{},theme:{...this.referrerExperience.modal?.theme,...e?.theme??{}}}},i=this.getTheme(),o={...i,colorPrimary:n.modal?.theme?.primaryColor||i.colorPrimary,colorBackground:n.modal?.theme?.backgroundColor||i.colorBackground,colorTint:n.modal?.theme?.tintColor||i.colorTint,tintAlpha:n.modal?.theme?.tintAlpha??i.tintAlpha},s=!!t;this.host=document.createElement("div"),this.host.style.all="initial",s?(this.host.style.display="block",this.host.style.width="100%",this.host.style.height="100%"):(this.host.style.position="absolute",this.host.style.zIndex="2147483647"),this.host.id="growth-rail-modal-host",this.host.style.setProperty("--gr-primary",o.colorPrimary),this.host.style.setProperty("--gr-text",o.colorText),this.host.style.setProperty("--gr-text-secondary",o.colorTextSecondary),this.host.style.setProperty("--gr-bg",o.colorBackground),this.host.style.setProperty("--gr-tint",o.colorTint);let l=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(o.colorTint),d=o.tintAlpha>1?o.tintAlpha/100:o.tintAlpha,c=l?`rgba(${parseInt(l[1],16)}, ${parseInt(l[2],16)}, ${parseInt(l[3],16)}, ${d})`:`rgba(0, 0, 0, ${d})`;this.host.style.setProperty("--gr-tint-rgba",c),this.host.style.setProperty("--gr-surface",o.colorSurface),this.host.style.setProperty("--gr-border",o.colorBorder),this.host.style.setProperty("--gr-error",o.colorError),this.host.style.setProperty("--gr-radius",o.borderRadius),this.host.style.setProperty("--gr-font",'Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'),this.shadow=this.host.attachShadow({mode:"open"});let g=document.createElement("style");g.textContent=":host{all:initial;display:block}*{box-sizing:border-box}@keyframes gr-fade-in{from{opacity:0}to{opacity:1}}@keyframes gr-slide-up{from{opacity:0;transform:translateY(20px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes gr-slide-in-right{from{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes gr-slide-in-left{from{opacity:0;transform:translateX(-100%)}to{opacity:1;transform:translateX(0)}}.gr-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;display:flex;z-index:2147483647;font-family:var(--gr-font);animation:gr-fade-in .2s ease-out forwards;backdrop-filter:blur(4px);background-color:var(--gr-tint-rgba)}.gr-overlay--modal{align-items:center;justify-content:center}.gr-overlay--drawer{align-items:flex-start;justify-content:flex-start}.gr-container{position:relative;background-color:var(--gr-bg);color:var(--gr-text);padding:32px;box-shadow:0 0 50px -12px rgba(0,0,0,0.25), 0 0 30px -10px rgba(0,0,0,0.15)}.gr-container--embedded{width:100%;height:100%;box-shadow:none;border:1px solid var(--gr-border);border-radius:var(--gr-radius)}.gr-container--modal{width:90%;max-width:480px;border-radius:var(--gr-radius);animation:gr-slide-up .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--drawer{position:absolute;width:400px;max-width:calc(100vw - 20px);max-height:calc(100vh - 40px);overflow-y:auto}.gr-container--right{right:0;border-top-left-radius:var(--gr-radius);border-bottom-left-radius:var(--gr-radius);animation:gr-slide-in-right .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--left{left:0;border-top-right-radius:var(--gr-radius);border-bottom-right-radius:var(--gr-radius);animation:gr-slide-in-left .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--top{top:100px}.gr-container--bottom{bottom:100px}.gr-close-btn{position:absolute;top:20px;right:20px;background:0 0;border:none;cursor:pointer;color:#9ca3af;padding:4px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.gr-close-btn:hover{background-color:var(--gr-surface);color:var(--gr-text)}.gr-header{text-align:center;margin-bottom:28px}.gr-icon-lg{font-size:32px;margin-bottom:12px}.gr-title{margin:0 0 8px 0;font-size:22px;font-weight:700;letter-spacing:-.02em}.gr-subtitle{margin:0;font-size:14px;line-height:1.5;color:var(--gr-text-secondary)}.gr-loading{padding:16px;background-color:var(--gr-surface);border-radius:8px;text-align:center;color:var(--gr-text-secondary);font-size:14px}.gr-label{display:block;font-size:12px;font-weight:600;color:var(--gr-text-secondary);margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em}.gr-share-label{text-align:center;margin-bottom:16px;font-size:13px;font-weight:500;color:var(--gr-text-secondary);display:flex;align-items:center;gap:12px}.gr-divider{flex:1;height:1px;background:var(--gr-border)}.gr-social-container{display:flex;gap:16px;justify-content:center;flex-wrap:wrap}.gr-btn{padding:14px;font-size:15px;font-weight:600;background-color:var(--gr-primary);color:#fff;border:none;border-radius:var(--gr-radius);cursor:pointer;transition:all .2s ease;text-align:center;width:100%;display:block}.gr-btn:hover{transform:translateY(-1px);filter:brightness(1.05)}.gr-btn:active{transform:translateY(0);filter:brightness(.95)}.gr-btn:disabled{opacity:.7;cursor:not-allowed}.gr-btn--sm{padding:8px 16px;font-size:13px;width:auto;border-radius:calc(var(--gr-radius) - 4px)}.gr-input-group{display:flex;align-items:center;background-color:var(--gr-surface);border:1px solid var(--gr-border);border-radius:var(--gr-radius);padding:4px;margin-bottom:24px}.gr-input-group:focus-within{border-color:var(--gr-primary);box-shadow:0 0 0 3px var(--gr-surface)}.gr-input{flex:1;padding:10px 12px;font-size:14px;border:none;background:0 0;color:var(--gr-text);outline:none;font-family:monospace}.gr-social-btn{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background-color:var(--gr-surface);color:var(--gr-text-secondary);border:1px solid var(--gr-border);transition:transform .2s cubic-bezier(.34,1.56,.64,1);cursor:pointer}.gr-social-btn:hover{transform:scale(1.15) rotate(3deg);color:#fff}.gr-powered-by{margin-top:24px;text-align:center;font-size:11px;color:#9ca3af;display:flex;align-items:center;justify-content:center;gap:4px;opacity:.8}.gr-powered-by a{color:inherit;text-decoration:none;font-weight:600;transition:opacity .2s}.gr-powered-by a:hover{opacity:1;text-decoration:underline}",this.shadow.appendChild(g),this.content=document.createElement("div");let h=n.modal.componentType==="drawer",k=n.trigger.position||"top-right",f=["gr-container"];s?(f.push("gr-container--embedded"),this.content.className=f.join(" "),this.renderInternalContent(o,e,s),this.shadow.appendChild(this.content),t&&t.appendChild(this.host)):(this.overlay=document.createElement("div"),this.overlay.className=`gr-overlay ${h?"gr-overlay--drawer":"gr-overlay--modal"}`,h?(f.push("gr-container--drawer"),k.includes("right")?f.push("gr-container--right"):f.push("gr-container--left"),k.includes("bottom")?f.push("gr-container--bottom"):f.push("gr-container--top")):f.push("gr-container--modal"),this.content.className=f.join(" "),this.renderInternalContent(o,e,s),this.overlay.appendChild(this.content),this.shadow.appendChild(this.overlay),document.body.appendChild(this.host),this.overlay.onclick=E=>{E.target===this.overlay&&this.hide()})}getTheme(){return{colorPrimary:"#2563eb",colorText:"#111827",colorTextSecondary:"#6b7280",colorBackground:"#ffffff",colorTint:"#f9fafb",tintAlpha:.8,colorSurface:"#f9fafb",colorBorder:"#e5e7eb",colorError:"#ef4444",borderRadius:"16px"}}async renderInternalContent(e,t,n=!1){if(!this.content)return;if(this.content.innerHTML="",!n){let h=document.createElement("button");h.className="gr-close-btn",h.innerHTML=`
|
|
1
|
+
"use strict";var b=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var P=(p,e,t)=>e in p?b(p,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):p[e]=t;var L=(p,e)=>{for(var t in e)b(p,t,{get:e[t],enumerable:!0})},z=(p,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of T(e))!U.call(p,o)&&o!==t&&b(p,o,{get:()=>e[o],enumerable:!(n=C(e,o))||n.enumerable});return p};var $=p=>z(b({},"__esModule",{value:!0}),p);var l=(p,e,t)=>P(p,typeof e!="symbol"?e+"":e,t);var A={};L(A,{GrowthRail:()=>R,ReferralModal:()=>y});module.exports=$(A);var M="[GrowthRail]",g={log(p,e,t,n){let o=`${M} [${e}] ${t}`;switch(p){case"error":console.error(o,n||"");break;case"warn":console.warn(o,n||"");break;default:console.log(o,n||"");break}}};var x=class{constructor(e){l(this,"baseUrl");l(this,"projectSecretKey");l(this,"_debug",!1);let t=typeof process<"u"&&process.env?.ENV_BASE_URL;this.baseUrl=t||"https://api.growthrail.dev",this.projectSecretKey=e.projectSecretKey}setDebug(e){this._debug=e}async request(e,t,n){let o={"Content-Type":"application/json","X-GrowthRail-ProjectSecret":this.projectSecretKey},i=Date.now();this._debug&&g.log("api","APIClient",`${t} ${e}`,{method:t,endpoint:e,body:n??null});try{let a=await fetch(`${this.baseUrl}${e}`,{method:t,headers:o,body:n?JSON.stringify(n):void 0}),s=Date.now()-i;if(!a.ok){let c="";try{c=await a.text()}catch{}let d=`GrowthRail API Error ${a.status} (${this.baseUrl}${e}): ${a.statusText} - ${c}`;throw this._debug&&g.log("api","APIClient",`\u2717 ${t} ${e}`,{method:t,endpoint:e,status:a.status,duration:s,error:c}),new Error(d)}return this._debug&&g.log("api","APIClient",`\u2713 ${t} ${e}`,{method:t,endpoint:e,status:a.status,duration:s}),a.json()}catch(a){let s=Date.now()-i;throw this._debug&&g.log("api","APIClient",`\u2717 ${t} ${e} \u2014 Network error`,{method:t,endpoint:e,duration:s,error:String(a)}),console.error("GrowthRail SDK Error:",a),a}}async getNewUserExperience(){return this.request("/api/v1/sdk/new-user-experience","POST")}async initAppUser(e){return this.request("/api/v1/sdk/init-app-user","POST",{clientProvidedId:e})}async trackReferral(e,t){return this.request("/api/v1/sdk/track-referral","POST",{referralCode:e,rewardEventName:t})}async trackRewardEvent(e,t,n){return this.request("/api/v1/sdk/track-reward-event","POST",{refereeId:e,referralTrackingId:t,eventName:n})}};var m=class m{constructor(e){l(this,"options",{});e&&(this.options=e)}setCookie(e,t,n=30){if(typeof document>"u")return;let o="";if(n){let a=new Date;a.setTime(a.getTime()+n*24*60*60*1e3),o=`; expires=${a.toUTCString()}`}let i="";this.options.cookieDomain&&(i=`; domain=${this.options.cookieDomain}`),document.cookie=`${e}=${t||""}${o}${i}; path=/; SameSite=Lax`}getCookie(e){if(typeof document>"u")return null;let t=`${e}=`,n=document.cookie.split(";");for(let o=0;o<n.length;o++){let i=n[o];for(;i.charAt(0)===" ";)i=i.substring(1,i.length);if(i.indexOf(t)===0)return i.substring(t.length,i.length)}return null}getReferralCode(){return this.getCookie(m.REFERRAL_CODE_KEY)}setReferralCode(e){this.setCookie(m.REFERRAL_CODE_KEY,e,30)}setTrackedReferral(e){this.setCookie(m.TRACKED_REFERRAL_KEY,e,30)}getTrackedReferral(){return this.getCookie(m.TRACKED_REFERRAL_KEY)}};l(m,"REFERRAL_CODE_KEY","gr_ref_code"),l(m,"TRACKED_REFERRAL_KEY","gr_tracked_referral");var v=m;var y=class{constructor(e,t){l(this,"referrerExperience");l(this,"deps");l(this,"host",null);l(this,"shadow",null);l(this,"overlay",null);l(this,"content",null);this.deps=e,this.referrerExperience=t}show(e,t){this.host||(this.createDom(e,t),this.bindEvents(),t||(document.body.style.overflow="hidden"))}hide(){this.host&&(this.host&&this.host.parentNode&&this.host.parentNode.removeChild(this.host),this.host=null,this.overlay=null,this.content=null,this.shadow=null,document.body.style.overflow="")}createDom(e,t){let n={...this.referrerExperience,modal:{...this.referrerExperience.modal,...e??{},theme:{...this.referrerExperience.modal?.theme,...e?.theme??{}}}},o=this.getTheme(),i={...o,colorPrimary:n.modal?.theme?.primaryColor||o.colorPrimary,colorBackground:n.modal?.theme?.backgroundColor||o.colorBackground,colorTint:n.modal?.theme?.tintColor||o.colorTint,tintAlpha:n.modal?.theme?.tintAlpha??o.tintAlpha},a=!!t;this.host=document.createElement("div"),this.host.style.all="initial",a?(this.host.style.display="block",this.host.style.width="100%",this.host.style.height="100%"):(this.host.style.position="absolute",this.host.style.zIndex="2147483647"),this.host.id="growth-rail-modal-host",this.host.style.setProperty("--gr-primary",i.colorPrimary),this.host.style.setProperty("--gr-text",i.colorText),this.host.style.setProperty("--gr-text-secondary",i.colorTextSecondary),this.host.style.setProperty("--gr-bg",i.colorBackground),this.host.style.setProperty("--gr-tint",i.colorTint);let s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(i.colorTint),c=i.tintAlpha>1?i.tintAlpha/100:i.tintAlpha,d=s?`rgba(${parseInt(s[1],16)}, ${parseInt(s[2],16)}, ${parseInt(s[3],16)}, ${c})`:`rgba(0, 0, 0, ${c})`;this.host.style.setProperty("--gr-tint-rgba",d),this.host.style.setProperty("--gr-surface",i.colorSurface),this.host.style.setProperty("--gr-border",i.colorBorder),this.host.style.setProperty("--gr-error",i.colorError),this.host.style.setProperty("--gr-radius",i.borderRadius),this.host.style.setProperty("--gr-font",'Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'),this.shadow=this.host.attachShadow({mode:"open"});let h=document.createElement("style");h.textContent=":host{all:initial;display:block}*{box-sizing:border-box}@keyframes gr-fade-in{from{opacity:0}to{opacity:1}}@keyframes gr-slide-up{from{opacity:0;transform:translateY(20px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes gr-slide-in-right{from{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes gr-slide-in-left{from{opacity:0;transform:translateX(-100%)}to{opacity:1;transform:translateX(0)}}.gr-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;display:flex;z-index:2147483647;font-family:var(--gr-font);animation:gr-fade-in .2s ease-out forwards;backdrop-filter:blur(4px);background-color:var(--gr-tint-rgba)}.gr-overlay--modal{align-items:center;justify-content:center}.gr-overlay--drawer{align-items:flex-start;justify-content:flex-start}.gr-container{position:relative;background-color:var(--gr-bg);color:var(--gr-text);padding:32px;box-shadow:0 0 50px -12px rgba(0,0,0,0.25), 0 0 30px -10px rgba(0,0,0,0.15)}.gr-container--embedded{width:100%;height:100%;box-shadow:none;border:1px solid var(--gr-border);border-radius:var(--gr-radius)}.gr-container--modal{width:90%;max-width:480px;border-radius:var(--gr-radius);animation:gr-slide-up .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--drawer{position:absolute;width:400px;max-width:calc(100vw - 20px);max-height:calc(100vh - 40px);overflow-y:auto}.gr-container--right{right:0;border-top-left-radius:var(--gr-radius);border-bottom-left-radius:var(--gr-radius);animation:gr-slide-in-right .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--left{left:0;border-top-right-radius:var(--gr-radius);border-bottom-right-radius:var(--gr-radius);animation:gr-slide-in-left .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--top{top:100px}.gr-container--bottom{bottom:100px}.gr-close-btn{position:absolute;top:20px;right:20px;background:0 0;border:none;cursor:pointer;color:#9ca3af;padding:4px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.gr-close-btn:hover{background-color:var(--gr-surface);color:var(--gr-text)}.gr-header{text-align:center;margin-bottom:28px}.gr-icon-lg{font-size:32px;margin-bottom:12px}.gr-title{margin:0 0 8px 0;font-size:22px;font-weight:700;letter-spacing:-.02em}.gr-subtitle{margin:0;font-size:14px;line-height:1.5;color:var(--gr-text-secondary)}.gr-loading{padding:16px;background-color:var(--gr-surface);border-radius:8px;text-align:center;color:var(--gr-text-secondary);font-size:14px}.gr-label{display:block;font-size:12px;font-weight:600;color:var(--gr-text-secondary);margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em}.gr-share-label{text-align:center;margin-bottom:16px;font-size:13px;font-weight:500;color:var(--gr-text-secondary);display:flex;align-items:center;gap:12px}.gr-divider{flex:1;height:1px;background:var(--gr-border)}.gr-social-container{display:flex;gap:16px;justify-content:center;flex-wrap:wrap}.gr-btn{padding:14px;font-size:15px;font-weight:600;background-color:var(--gr-primary);color:#fff;border:none;border-radius:var(--gr-radius);cursor:pointer;transition:all .2s ease;text-align:center;width:100%;display:block}.gr-btn:hover{transform:translateY(-1px);filter:brightness(1.05)}.gr-btn:active{transform:translateY(0);filter:brightness(.95)}.gr-btn:disabled{opacity:.7;cursor:not-allowed}.gr-btn--sm{padding:8px 16px;font-size:13px;width:auto;border-radius:calc(var(--gr-radius) - 4px)}.gr-input-group{display:flex;align-items:center;background-color:var(--gr-surface);border:1px solid var(--gr-border);border-radius:var(--gr-radius);padding:4px;margin-bottom:24px}.gr-input-group:focus-within{border-color:var(--gr-primary);box-shadow:0 0 0 3px var(--gr-surface)}.gr-input{flex:1;padding:10px 12px;font-size:14px;border:none;background:0 0;color:var(--gr-text);outline:none;font-family:monospace}.gr-social-btn{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background-color:var(--gr-surface);color:var(--gr-text-secondary);border:1px solid var(--gr-border);transition:transform .2s cubic-bezier(.34,1.56,.64,1);cursor:pointer}.gr-social-btn:hover{transform:scale(1.15) rotate(3deg);color:#fff}.gr-powered-by{margin-top:24px;text-align:center;font-size:11px;color:#9ca3af;display:flex;align-items:center;justify-content:center;gap:4px;opacity:.8}.gr-powered-by a{color:inherit;text-decoration:none;font-weight:600;transition:opacity .2s}.gr-powered-by a:hover{opacity:1;text-decoration:underline}",this.shadow.appendChild(h),this.content=document.createElement("div");let f=n.modal.componentType==="drawer",k=n.trigger.position||"top-right",u=["gr-container"];a?(u.push("gr-container--embedded"),this.content.className=u.join(" "),this.renderInternalContent(i,e,a),this.shadow.appendChild(this.content),t&&t.appendChild(this.host)):(this.overlay=document.createElement("div"),this.overlay.className=`gr-overlay ${f?"gr-overlay--drawer":"gr-overlay--modal"}`,f?(u.push("gr-container--drawer"),k.includes("right")?u.push("gr-container--right"):u.push("gr-container--left"),k.includes("bottom")?u.push("gr-container--bottom"):u.push("gr-container--top")):u.push("gr-container--modal"),this.content.className=u.join(" "),this.renderInternalContent(i,e,a),this.overlay.appendChild(this.content),this.shadow.appendChild(this.overlay),document.body.appendChild(this.host),this.overlay.onclick=E=>{E.target===this.overlay&&this.hide()})}getTheme(){return{colorPrimary:"#2563eb",colorText:"#111827",colorTextSecondary:"#6b7280",colorBackground:"#ffffff",colorTint:"#f9fafb",tintAlpha:.8,colorSurface:"#f9fafb",colorBorder:"#e5e7eb",colorError:"#ef4444",borderRadius:"16px"}}async renderInternalContent(e,t,n=!1){if(!this.content)return;if(this.content.innerHTML="",!n){let f=document.createElement("button");f.className="gr-close-btn",f.innerHTML=`
|
|
2
2
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
3
3
|
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
4
4
|
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
5
5
|
</svg>
|
|
6
|
-
`,
|
|
6
|
+
`,f.onclick=()=>this.hide(),this.content.appendChild(f)}let o=document.createElement("div");o.className="gr-header";let i=document.createElement("div");i.className="gr-icon-lg",i.innerHTML="\u{1F381}",o.appendChild(i);let a=document.createElement("h3");a.className="gr-title",a.textContent=t?.title??this.referrerExperience.modal.title??"Invite Friends & Earn",o.appendChild(a);let s=document.createElement("p");if(s.className="gr-subtitle",s.textContent="Share your unique link and earn rewards for every friend who signs up.",o.appendChild(s),this.content.appendChild(o),!this.deps.isUserReady()){let f=document.createElement("div");f.className="gr-loading",f.textContent="Please log in to view your referral dashboard.",this.content.appendChild(f);return}let c=this.deps.getReferralLink(),d=document.createElement("div");this.renderLinkView(d,c,e),this.content.appendChild(d),c&&this.renderSocialShare(this.content,c,e);let h=document.createElement("div");h.className="gr-powered-by",h.innerHTML=`
|
|
7
7
|
Powered by <a href="https://growthrail.com" target="_blank" rel="noopener noreferrer">Growth Rail</a>
|
|
8
|
-
`,this.content.appendChild(
|
|
9
|
-
:host { all: initial; display: block; }
|
|
10
|
-
@keyframes gr-shimmer {
|
|
11
|
-
0% { transform: translateX(-150%) skewX(-15deg); }
|
|
12
|
-
50% { transform: translateX(150%) skewX(-15deg); }
|
|
13
|
-
100% { transform: translateX(150%) skewX(-15deg); }
|
|
14
|
-
}
|
|
15
|
-
.gr-btn {
|
|
16
|
-
position: fixed;
|
|
17
|
-
width: 50px;
|
|
18
|
-
height: 50px;
|
|
19
|
-
background: ${this.options.modal?.theme?.primaryColor||"#000"};
|
|
20
|
-
box-shadow: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,0.06);
|
|
21
|
-
cursor: pointer;
|
|
22
|
-
z-index: 2147483646;
|
|
23
|
-
display: flex;
|
|
24
|
-
align-items: center;
|
|
25
|
-
justify-content: center;
|
|
26
|
-
transition: transform .2s cubic-bezier(.34,1.56,.64,1), box-shadow .2s ease, width .2s, border-radius .2s;
|
|
27
|
-
overflow: hidden;
|
|
28
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
29
|
-
box-sizing: border-box;
|
|
30
|
-
}
|
|
31
|
-
.gr-btn * { box-sizing: border-box; }
|
|
32
|
-
.gr-btn:hover {
|
|
33
|
-
transform: scale(1.05);
|
|
34
|
-
box-shadow: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,0.05);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/* Edge Mode Radii */
|
|
38
|
-
.gr-btn--edge.gr-btn--right { border-radius: 8px 0 0 8px; padding-left: 4px; right: 0; }
|
|
39
|
-
.gr-btn--edge.gr-btn--left { border-radius: 0 8px 8px 0; padding-right: 4px; left: 0; }
|
|
40
|
-
|
|
41
|
-
/* Floating Mode Radii & Position */
|
|
42
|
-
.gr-btn--floating {
|
|
43
|
-
border-radius: 50%;
|
|
44
|
-
box-shadow: 0 8px 24px color-mix(in srgb, ${this.options.modal?.theme?.primaryColor||"#000"}, transparent 60%);
|
|
45
|
-
}
|
|
46
|
-
.gr-btn--floating:hover {
|
|
47
|
-
box-shadow: 0 12px 32px color-mix(in srgb, ${this.options.modal?.theme?.primaryColor||"#000"}, transparent 40%);
|
|
48
|
-
}
|
|
49
|
-
.gr-btn--floating.gr-btn--right { right: 20px; }
|
|
50
|
-
.gr-btn--floating.gr-btn--left { left: 20px; }
|
|
51
|
-
|
|
52
|
-
.gr-btn--bottom { bottom: var(--gr-offset-y); }
|
|
53
|
-
.gr-btn--top { top: var(--gr-offset-y); }
|
|
54
|
-
|
|
55
|
-
.gr-btn::after {
|
|
56
|
-
content: '';
|
|
57
|
-
position: absolute;
|
|
58
|
-
top: 0;
|
|
59
|
-
left: 0;
|
|
60
|
-
width: 100%;
|
|
61
|
-
height: 100%;
|
|
62
|
-
background: linear-gradient(to right, transparent 0%, rgba(255,255,255,0.4) 50%, transparent 100%);
|
|
63
|
-
transform: translateX(-150%) skewX(-15deg);
|
|
64
|
-
animation: gr-shimmer 3s infinite;
|
|
65
|
-
}
|
|
66
|
-
.gr-icon { color: #fff; width: 24px; height: 24px; position: relative; z-index: 10; }
|
|
67
|
-
`,this.shadow.appendChild(t),this.element=document.createElement("div");let i=this.options.trigger?.position||"bottom-right",o=["gr-btn",`gr-btn--${n}`];i.includes("right")?o.push("gr-btn--right"):o.push("gr-btn--left"),i.includes("bottom")?o.push("gr-btn--bottom"):o.push("gr-btn--top"),this.element.className=o.join(" "),this.element.innerHTML=`
|
|
68
|
-
<svg class="gr-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
69
|
-
<polyline points="20 12 20 22 4 22 4 12"></polyline>
|
|
70
|
-
<rect x="2" y="7" width="20" height="5"></rect>
|
|
71
|
-
<line x1="12" y1="22" x2="12" y2="7"></line>
|
|
72
|
-
<path d="M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z"></path>
|
|
73
|
-
<path d="M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z"></path>
|
|
74
|
-
</svg>
|
|
75
|
-
`,this.element.onclick=()=>{x.showReferralDashboard()},this.shadow.appendChild(this.element),document.body.appendChild(this.host)}};var R=class{static show(e){if(typeof document>"u")return;let t=document.createElement("div");t.id="gr-banner-host",document.body.appendChild(t);let n=t.attachShadow({mode:"open"}),i=(e.banner.position||"center-top").toLowerCase(),o=i.includes("bottom")?"bottom":"top",s=i.includes("left")?"left":i.includes("right")?"right":"center",l="",d="";s==="center"?(l="left: 50%;",d="translateX(-50%)"):(l=`${s}: 20px;`,d="translateX(0)");let c=e.banner.themeColor||"#0070f3",g=document.createElement("style");g.textContent=`
|
|
8
|
+
`,this.content.appendChild(h)}renderLinkView(e,t,n){let o=document.createElement("label");o.className="gr-label",o.textContent="Your unique link",e.appendChild(o);let i=document.createElement("div");i.className="gr-input-group";let a=document.createElement("input");a.className="gr-input",a.type="text",a.value=t,a.readOnly=!0;let s=document.createElement("button");s.className="gr-btn gr-btn--sm",s.textContent="Copy",s.onclick=async()=>{try{await navigator.clipboard.writeText(t);let c=s.textContent;s.textContent="Copied!",s.style.backgroundColor="#10b981",setTimeout(()=>{s.textContent=c,s.style.backgroundColor=""},2e3)}catch(c){console.error("Failed to copy",c)}},i.appendChild(a),i.appendChild(s),e.appendChild(i)}renderSocialShare(e,t,n){let o=document.createElement("div"),i=document.createElement("div");i.className="gr-share-label",i.innerHTML='<span class="gr-divider"></span>Share via<span class="gr-divider"></span>',o.appendChild(i);let a=document.createElement("div");a.className="gr-social-container",[{name:"Twitter",color:"#000000",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>',url:`https://twitter.com/intent/tweet?url=${encodeURIComponent(t)}&text=Check+this+out!`},{name:"Facebook",color:"#1877F2",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036c-2.648 0-2.928 1.67-2.928 3.403v1.596h3.949l-.577 3.667h-3.372v7.98h-4.938z"/></svg>',url:`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(t)}`},{name:"LinkedIn",color:"#0A66C2",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>',url:`https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(t)}`},{name:"WhatsApp",color:"#25D366",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>',url:`https://api.whatsapp.com/send?text=${encodeURIComponent(t)}`},{name:"Email",color:"#888888",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></svg>',url:`mailto:?subject=Check this out&body=${encodeURIComponent(t)}`}].forEach(c=>{let d=document.createElement("a");d.href=c.url,d.target="_blank",d.rel="noopener noreferrer",d.className="gr-social-btn",d.innerHTML=c.icon,d.title=`Share on ${c.name}`,d.onmouseenter=()=>{d.style.backgroundColor=c.color,d.style.color="#ffffff",d.style.borderColor=c.color},d.onmouseleave=()=>{d.style.backgroundColor="",d.style.color="",d.style.borderColor=""},a.appendChild(d)}),o.appendChild(a),e.appendChild(o)}bindEvents(){this.overlay&&(this.overlay.onclick=e=>{e.target===this.overlay&&this.hide()})}};var w=class{static show(e){if(typeof document>"u")return;let t=document.createElement("div");t.id="gr-banner-host",document.body.appendChild(t);let n=t.attachShadow({mode:"open"}),o=(e.banner.position||"center-top").toLowerCase(),i=o.includes("bottom")?"bottom":"top",a=o.includes("left")?"left":o.includes("right")?"right":"center",s="",c="";a==="center"?(s="left: 50%;",c="translateX(-50%)"):(s=`${a}: 20px;`,c="translateX(0)");let d=e.banner.themeColor||"#0070f3",h=document.createElement("style");h.textContent=`
|
|
76
9
|
.gr-banner {
|
|
77
10
|
position: fixed;
|
|
78
|
-
${
|
|
79
|
-
${
|
|
11
|
+
${i}: 20px;
|
|
12
|
+
${s}
|
|
80
13
|
z-index: 2147483647;
|
|
81
14
|
font-family: Inter, system-ui, -apple-system, sans-serif;
|
|
82
15
|
background: var(--gr-theme-color);
|
|
@@ -96,11 +29,11 @@
|
|
|
96
29
|
@keyframes gr-slide-in {
|
|
97
30
|
from {
|
|
98
31
|
opacity: 0;
|
|
99
|
-
transform: ${
|
|
32
|
+
transform: ${c} translateY(${i==="top"?"-20px":"20px"});
|
|
100
33
|
}
|
|
101
34
|
to {
|
|
102
35
|
opacity: 1;
|
|
103
|
-
transform: ${
|
|
36
|
+
transform: ${c} translateY(0);
|
|
104
37
|
}
|
|
105
38
|
}
|
|
106
39
|
|
|
@@ -126,7 +59,7 @@
|
|
|
126
59
|
flex-shrink: 0;
|
|
127
60
|
}
|
|
128
61
|
.gr-close:hover { background: rgba(255, 255, 255, 0.2); color: #ffffff; }
|
|
129
|
-
`;let
|
|
62
|
+
`;let f=document.createElement("div");f.className="gr-banner",f.style.setProperty("--gr-theme-color",d),f.innerHTML=`
|
|
130
63
|
<svg class="gr-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
131
64
|
<polyline points="20 12 20 22 4 22 4 12"></polyline>
|
|
132
65
|
<rect x="2" y="7" width="20" height="5"></rect>
|
|
@@ -141,4 +74,4 @@
|
|
|
141
74
|
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
142
75
|
</svg>
|
|
143
76
|
</button>
|
|
144
|
-
`,
|
|
77
|
+
`,f.querySelector(".gr-close")?.addEventListener("click",()=>{t.remove()}),n.appendChild(h),n.appendChild(f)}};var r=class r{constructor(){}static init(e){r.initialized||(r.options=e,r.api=new x(e),e.debug&&(r.api.setDebug(!0),g.log("info","Core","SDK Initializing...",e)),r.storage=new v({cookieDomain:e.cookieDomain}),r.initialized=!0,r.autoTrackReferral())}static isInitialized(){return r.initialized}static ensureInitialized(){if(!r.initialized)throw new Error("GrowthRail.init() must be called before using the SDK")}static async loadReferrerExperience(e){try{r.createReferralModal(e),e.trigger.displayMode!=="none"&&r.createTriggerButton(e.trigger)}catch(t){throw console.error("GrowthRail: Failed to load referrer experience",t),t}}static createReferralModal(e){r.referralModal=new y({isUserReady:()=>r.isUserReady(),getReferralLink:()=>r.currentUser?.referralLink||""},e)}static async autoTrackReferral(){if(typeof window>"u")return;let e=new URLSearchParams(window.location.search),t=e.get("referralCode"),n=e.get("rewardEventName");if(t){r.options.debug&&g.log("info","DeepLink",`Found referral code in URL: ${t}`,{refCode:t,refEventName:n});let o=await r.api.getNewUserExperience(),i=await r.trackReferral(t,n??void 0);r.storage.setTrackedReferral(i.referralTrackingId),o.banner.show&&(r.options.debug&&g.log("info","UI","Showing promotional banner"),w.show(o))}}static async initAppUser(e){r.ensureInitialized(),r.options.debug&&g.log("info","User",`Initializing user: ${e}`);let t=await r.api.initAppUser(e);return r.currentUser={...t,id:e},r.experience=t.referrerExperience,r.loadReferrerExperience(t.referrerExperience),r.options.debug&&g.log("success","User",`User initialized: ${e}`,t),r.userReadyResolver?r.userReadyResolver(r.currentUser):r.userReadyPromise=Promise.resolve(r.currentUser),t}static async trackReferral(e,t){r.ensureInitialized(),r.options.debug&&g.log("info","Referral",`Tracking referral: ${e}`,{referralCode:e,rewardEventName:t});let n=await r.api.trackReferral(e,t);return r.options.debug&&g.log("success","Referral","Referral tracked successfully",n),n}static async trackRewardEvent(e){r.ensureInitialized(),r.options.debug&&g.log("info","Reward",`Tracking reward event: ${e||"(default)"}`);let t=r.currentUser?.id;if(!t)throw r.options.debug&&g.log("error","Reward","User not initialized"),new Error("GrowthRail: User must be initialized before tracking a reward event.");let n=r.storage.getTrackedReferral();if(!n)throw r.options.debug&&g.log("error","Reward","Referral tracking ID not found"),new Error("GrowthRail: Referral Tracking Id must be initialized before tracking a reward event.");let o=await r.api.trackRewardEvent(t,n,e);return r.options.debug&&g.log("success","Reward","Reward event tracked successfully"),o}static getReferralLink(){if(!r.currentUser?.referralLink)throw new Error("GrowthRail: Referral Link not loaded or user not initialized");return r.currentUser.referralLink}static getReferralCode(){return r.currentUser?.referralCode}static getUserId(){return r.currentUser?.id}static isUserReady(){return r.currentUser!==null}static ensureUserReady(){return r.currentUser?Promise.resolve(r.currentUser):(r.userReadyPromise||(r.userReadyPromise=new Promise(e=>{r.userReadyResolver=e})),r.userReadyPromise)}static async showReferralDashboard(e){if(r.ensureInitialized(),!r.experience)throw new Error("GrowthRail: Experience not loaded");r.referralModal&&r.referralModal.hide(),r.referralModal?.show(e)}static createTriggerButton(e){if(typeof window>"u")return;if(!r.experience)throw new Error("GrowthRail: Experience not loaded");r.floatingButton&&r.floatingButton.unmount();let t={...r.experience?.trigger,...e},n={modal:{...r.experience.modal},trigger:t};r.floatingButton&&(r.options.debug&&g.log("info","UI","Trigger button shown"),r.floatingButton.mount())}static destroyTriggerButton(){r.floatingButton&&(r.floatingButton.unmount(),r.floatingButton=null)}};l(r,"api"),l(r,"storage"),l(r,"options"),l(r,"currentUser",null),l(r,"initialized",!1),l(r,"referralModal",null),l(r,"floatingButton",null),l(r,"experience",null),l(r,"userReadyPromise",null),l(r,"userReadyResolver",null);var R=r;0&&(module.exports={GrowthRail,ReferralModal});
|
package/dist/index.mjs
CHANGED
|
@@ -1,82 +1,15 @@
|
|
|
1
|
-
var E=Object.defineProperty;var C=(h,e,t)=>e in h?E(h,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):h[e]=t;var a=(h,e,t)=>C(h,typeof e!="symbol"?e+"":e,t);var b=class{constructor(e){a(this,"baseUrl");a(this,"projectSecretKey");let t=typeof process<"u"&&process.env?.ENV_BASE_URL;this.baseUrl=t||"https://api.growthrail.dev",this.projectSecretKey=e.projectSecretKey}async request(e,t,n){let i={"Content-Type":"application/json","X-GrowthRail-ProjectSecret":this.projectSecretKey};try{let o=await fetch(`${this.baseUrl}${e}`,{method:t,headers:i,body:n?JSON.stringify(n):void 0});if(!o.ok)throw new Error(`GrowthRail API Error: ${o.statusText}`);return o.json()}catch(o){throw console.error("GrowthRail SDK Error:",o),o}}async getNewUserExperience(){return this.request("/api/v1/sdk/new-user-experience","POST")}async initAppUser(e){return this.request("/api/v1/sdk/init-app-user","POST",{clientProvidedId:e})}async trackReferral(e,t){return this.request("/api/v1/sdk/track-referral","POST",{referralCode:e,rewardEventName:t})}async trackRewardEvent(e,t,n){return this.request("/api/v1/sdk/track-reward-event","POST",{refereeId:e,referralTrackingId:t,eventName:n})}};var u=class u{constructor(e){a(this,"options",{});e&&(this.options=e)}setCookie(e,t,n=30){if(typeof document>"u")return;let i="";if(n){let s=new Date;s.setTime(s.getTime()+n*24*60*60*1e3),i=`; expires=${s.toUTCString()}`}let o="";this.options.cookieDomain&&(o=`; domain=${this.options.cookieDomain}`),document.cookie=`${e}=${t||""}${i}${o}; path=/; SameSite=Lax`}getCookie(e){if(typeof document>"u")return null;let t=`${e}=`,n=document.cookie.split(";");for(let i=0;i<n.length;i++){let o=n[i];for(;o.charAt(0)===" ";)o=o.substring(1,o.length);if(o.indexOf(t)===0)return o.substring(t.length,o.length)}return null}getReferralCode(){return this.getCookie(u.REFERRAL_CODE_KEY)}setReferralCode(e){this.setCookie(u.REFERRAL_CODE_KEY,e,30)}setTrackedReferral(e){this.setCookie(u.TRACKED_REFERRAL_KEY,e,30)}getTrackedReferral(){return this.getCookie(u.TRACKED_REFERRAL_KEY)}};a(u,"REFERRAL_CODE_KEY","gr_ref_code"),a(u,"TRACKED_REFERRAL_KEY","gr_tracked_referral");var y=u;var m=class{constructor(e,t){a(this,"referrerExperience");a(this,"deps");a(this,"host",null);a(this,"shadow",null);a(this,"overlay",null);a(this,"content",null);this.deps=e,this.referrerExperience=t}show(e,t){this.host||(this.createDom(e,t),this.bindEvents(),t||(document.body.style.overflow="hidden"))}hide(){this.host&&(this.host&&this.host.parentNode&&this.host.parentNode.removeChild(this.host),this.host=null,this.overlay=null,this.content=null,this.shadow=null,document.body.style.overflow="")}createDom(e,t){let n={...this.referrerExperience,modal:{...this.referrerExperience.modal,...e??{},theme:{...this.referrerExperience.modal?.theme,...e?.theme??{}}}},i=this.getTheme(),o={...i,colorPrimary:n.modal?.theme?.primaryColor||i.colorPrimary,colorBackground:n.modal?.theme?.backgroundColor||i.colorBackground,colorTint:n.modal?.theme?.tintColor||i.colorTint,tintAlpha:n.modal?.theme?.tintAlpha??i.tintAlpha},s=!!t;this.host=document.createElement("div"),this.host.style.all="initial",s?(this.host.style.display="block",this.host.style.width="100%",this.host.style.height="100%"):(this.host.style.position="absolute",this.host.style.zIndex="2147483647"),this.host.id="growth-rail-modal-host",this.host.style.setProperty("--gr-primary",o.colorPrimary),this.host.style.setProperty("--gr-text",o.colorText),this.host.style.setProperty("--gr-text-secondary",o.colorTextSecondary),this.host.style.setProperty("--gr-bg",o.colorBackground),this.host.style.setProperty("--gr-tint",o.colorTint);let l=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(o.colorTint),d=o.tintAlpha>1?o.tintAlpha/100:o.tintAlpha,c=l?`rgba(${parseInt(l[1],16)}, ${parseInt(l[2],16)}, ${parseInt(l[3],16)}, ${d})`:`rgba(0, 0, 0, ${d})`;this.host.style.setProperty("--gr-tint-rgba",c),this.host.style.setProperty("--gr-surface",o.colorSurface),this.host.style.setProperty("--gr-border",o.colorBorder),this.host.style.setProperty("--gr-error",o.colorError),this.host.style.setProperty("--gr-radius",o.borderRadius),this.host.style.setProperty("--gr-font",'Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'),this.shadow=this.host.attachShadow({mode:"open"});let g=document.createElement("style");g.textContent=":host{all:initial;display:block}*{box-sizing:border-box}@keyframes gr-fade-in{from{opacity:0}to{opacity:1}}@keyframes gr-slide-up{from{opacity:0;transform:translateY(20px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes gr-slide-in-right{from{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes gr-slide-in-left{from{opacity:0;transform:translateX(-100%)}to{opacity:1;transform:translateX(0)}}.gr-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;display:flex;z-index:2147483647;font-family:var(--gr-font);animation:gr-fade-in .2s ease-out forwards;backdrop-filter:blur(4px);background-color:var(--gr-tint-rgba)}.gr-overlay--modal{align-items:center;justify-content:center}.gr-overlay--drawer{align-items:flex-start;justify-content:flex-start}.gr-container{position:relative;background-color:var(--gr-bg);color:var(--gr-text);padding:32px;box-shadow:0 0 50px -12px rgba(0,0,0,0.25), 0 0 30px -10px rgba(0,0,0,0.15)}.gr-container--embedded{width:100%;height:100%;box-shadow:none;border:1px solid var(--gr-border);border-radius:var(--gr-radius)}.gr-container--modal{width:90%;max-width:480px;border-radius:var(--gr-radius);animation:gr-slide-up .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--drawer{position:absolute;width:400px;max-width:calc(100vw - 20px);max-height:calc(100vh - 40px);overflow-y:auto}.gr-container--right{right:0;border-top-left-radius:var(--gr-radius);border-bottom-left-radius:var(--gr-radius);animation:gr-slide-in-right .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--left{left:0;border-top-right-radius:var(--gr-radius);border-bottom-right-radius:var(--gr-radius);animation:gr-slide-in-left .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--top{top:100px}.gr-container--bottom{bottom:100px}.gr-close-btn{position:absolute;top:20px;right:20px;background:0 0;border:none;cursor:pointer;color:#9ca3af;padding:4px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.gr-close-btn:hover{background-color:var(--gr-surface);color:var(--gr-text)}.gr-header{text-align:center;margin-bottom:28px}.gr-icon-lg{font-size:32px;margin-bottom:12px}.gr-title{margin:0 0 8px 0;font-size:22px;font-weight:700;letter-spacing:-.02em}.gr-subtitle{margin:0;font-size:14px;line-height:1.5;color:var(--gr-text-secondary)}.gr-loading{padding:16px;background-color:var(--gr-surface);border-radius:8px;text-align:center;color:var(--gr-text-secondary);font-size:14px}.gr-label{display:block;font-size:12px;font-weight:600;color:var(--gr-text-secondary);margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em}.gr-share-label{text-align:center;margin-bottom:16px;font-size:13px;font-weight:500;color:var(--gr-text-secondary);display:flex;align-items:center;gap:12px}.gr-divider{flex:1;height:1px;background:var(--gr-border)}.gr-social-container{display:flex;gap:16px;justify-content:center;flex-wrap:wrap}.gr-btn{padding:14px;font-size:15px;font-weight:600;background-color:var(--gr-primary);color:#fff;border:none;border-radius:var(--gr-radius);cursor:pointer;transition:all .2s ease;text-align:center;width:100%;display:block}.gr-btn:hover{transform:translateY(-1px);filter:brightness(1.05)}.gr-btn:active{transform:translateY(0);filter:brightness(.95)}.gr-btn:disabled{opacity:.7;cursor:not-allowed}.gr-btn--sm{padding:8px 16px;font-size:13px;width:auto;border-radius:calc(var(--gr-radius) - 4px)}.gr-input-group{display:flex;align-items:center;background-color:var(--gr-surface);border:1px solid var(--gr-border);border-radius:var(--gr-radius);padding:4px;margin-bottom:24px}.gr-input-group:focus-within{border-color:var(--gr-primary);box-shadow:0 0 0 3px var(--gr-surface)}.gr-input{flex:1;padding:10px 12px;font-size:14px;border:none;background:0 0;color:var(--gr-text);outline:none;font-family:monospace}.gr-social-btn{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background-color:var(--gr-surface);color:var(--gr-text-secondary);border:1px solid var(--gr-border);transition:transform .2s cubic-bezier(.34,1.56,.64,1);cursor:pointer}.gr-social-btn:hover{transform:scale(1.15) rotate(3deg);color:#fff}.gr-powered-by{margin-top:24px;text-align:center;font-size:11px;color:#9ca3af;display:flex;align-items:center;justify-content:center;gap:4px;opacity:.8}.gr-powered-by a{color:inherit;text-decoration:none;font-weight:600;transition:opacity .2s}.gr-powered-by a:hover{opacity:1;text-decoration:underline}",this.shadow.appendChild(g),this.content=document.createElement("div");let p=n.modal.componentType==="drawer",R=n.trigger.position||"top-right",f=["gr-container"];s?(f.push("gr-container--embedded"),this.content.className=f.join(" "),this.renderInternalContent(o,e,s),this.shadow.appendChild(this.content),t&&t.appendChild(this.host)):(this.overlay=document.createElement("div"),this.overlay.className=`gr-overlay ${p?"gr-overlay--drawer":"gr-overlay--modal"}`,p?(f.push("gr-container--drawer"),R.includes("right")?f.push("gr-container--right"):f.push("gr-container--left"),R.includes("bottom")?f.push("gr-container--bottom"):f.push("gr-container--top")):f.push("gr-container--modal"),this.content.className=f.join(" "),this.renderInternalContent(o,e,s),this.overlay.appendChild(this.content),this.shadow.appendChild(this.overlay),document.body.appendChild(this.host),this.overlay.onclick=k=>{k.target===this.overlay&&this.hide()})}getTheme(){return{colorPrimary:"#2563eb",colorText:"#111827",colorTextSecondary:"#6b7280",colorBackground:"#ffffff",colorTint:"#f9fafb",tintAlpha:.8,colorSurface:"#f9fafb",colorBorder:"#e5e7eb",colorError:"#ef4444",borderRadius:"16px"}}async renderInternalContent(e,t,n=!1){if(!this.content)return;if(this.content.innerHTML="",!n){let p=document.createElement("button");p.className="gr-close-btn",p.innerHTML=`
|
|
1
|
+
var E=Object.defineProperty;var C=(f,e,t)=>e in f?E(f,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):f[e]=t;var l=(f,e,t)=>C(f,typeof e!="symbol"?e+"":e,t);var T="[GrowthRail]",p={log(f,e,t,n){let i=`${T} [${e}] ${t}`;switch(f){case"error":console.error(i,n||"");break;case"warn":console.warn(i,n||"");break;default:console.log(i,n||"");break}}};var b=class{constructor(e){l(this,"baseUrl");l(this,"projectSecretKey");l(this,"_debug",!1);let t=typeof process<"u"&&process.env?.ENV_BASE_URL;this.baseUrl=t||"https://api.growthrail.dev",this.projectSecretKey=e.projectSecretKey}setDebug(e){this._debug=e}async request(e,t,n){let i={"Content-Type":"application/json","X-GrowthRail-ProjectSecret":this.projectSecretKey},o=Date.now();this._debug&&p.log("api","APIClient",`${t} ${e}`,{method:t,endpoint:e,body:n??null});try{let a=await fetch(`${this.baseUrl}${e}`,{method:t,headers:i,body:n?JSON.stringify(n):void 0}),s=Date.now()-o;if(!a.ok){let c="";try{c=await a.text()}catch{}let d=`GrowthRail API Error ${a.status} (${this.baseUrl}${e}): ${a.statusText} - ${c}`;throw this._debug&&p.log("api","APIClient",`\u2717 ${t} ${e}`,{method:t,endpoint:e,status:a.status,duration:s,error:c}),new Error(d)}return this._debug&&p.log("api","APIClient",`\u2713 ${t} ${e}`,{method:t,endpoint:e,status:a.status,duration:s}),a.json()}catch(a){let s=Date.now()-o;throw this._debug&&p.log("api","APIClient",`\u2717 ${t} ${e} \u2014 Network error`,{method:t,endpoint:e,duration:s,error:String(a)}),console.error("GrowthRail SDK Error:",a),a}}async getNewUserExperience(){return this.request("/api/v1/sdk/new-user-experience","POST")}async initAppUser(e){return this.request("/api/v1/sdk/init-app-user","POST",{clientProvidedId:e})}async trackReferral(e,t){return this.request("/api/v1/sdk/track-referral","POST",{referralCode:e,rewardEventName:t})}async trackRewardEvent(e,t,n){return this.request("/api/v1/sdk/track-reward-event","POST",{refereeId:e,referralTrackingId:t,eventName:n})}};var m=class m{constructor(e){l(this,"options",{});e&&(this.options=e)}setCookie(e,t,n=30){if(typeof document>"u")return;let i="";if(n){let a=new Date;a.setTime(a.getTime()+n*24*60*60*1e3),i=`; expires=${a.toUTCString()}`}let o="";this.options.cookieDomain&&(o=`; domain=${this.options.cookieDomain}`),document.cookie=`${e}=${t||""}${i}${o}; path=/; SameSite=Lax`}getCookie(e){if(typeof document>"u")return null;let t=`${e}=`,n=document.cookie.split(";");for(let i=0;i<n.length;i++){let o=n[i];for(;o.charAt(0)===" ";)o=o.substring(1,o.length);if(o.indexOf(t)===0)return o.substring(t.length,o.length)}return null}getReferralCode(){return this.getCookie(m.REFERRAL_CODE_KEY)}setReferralCode(e){this.setCookie(m.REFERRAL_CODE_KEY,e,30)}setTrackedReferral(e){this.setCookie(m.TRACKED_REFERRAL_KEY,e,30)}getTrackedReferral(){return this.getCookie(m.TRACKED_REFERRAL_KEY)}};l(m,"REFERRAL_CODE_KEY","gr_ref_code"),l(m,"TRACKED_REFERRAL_KEY","gr_tracked_referral");var x=m;var y=class{constructor(e,t){l(this,"referrerExperience");l(this,"deps");l(this,"host",null);l(this,"shadow",null);l(this,"overlay",null);l(this,"content",null);this.deps=e,this.referrerExperience=t}show(e,t){this.host||(this.createDom(e,t),this.bindEvents(),t||(document.body.style.overflow="hidden"))}hide(){this.host&&(this.host&&this.host.parentNode&&this.host.parentNode.removeChild(this.host),this.host=null,this.overlay=null,this.content=null,this.shadow=null,document.body.style.overflow="")}createDom(e,t){let n={...this.referrerExperience,modal:{...this.referrerExperience.modal,...e??{},theme:{...this.referrerExperience.modal?.theme,...e?.theme??{}}}},i=this.getTheme(),o={...i,colorPrimary:n.modal?.theme?.primaryColor||i.colorPrimary,colorBackground:n.modal?.theme?.backgroundColor||i.colorBackground,colorTint:n.modal?.theme?.tintColor||i.colorTint,tintAlpha:n.modal?.theme?.tintAlpha??i.tintAlpha},a=!!t;this.host=document.createElement("div"),this.host.style.all="initial",a?(this.host.style.display="block",this.host.style.width="100%",this.host.style.height="100%"):(this.host.style.position="absolute",this.host.style.zIndex="2147483647"),this.host.id="growth-rail-modal-host",this.host.style.setProperty("--gr-primary",o.colorPrimary),this.host.style.setProperty("--gr-text",o.colorText),this.host.style.setProperty("--gr-text-secondary",o.colorTextSecondary),this.host.style.setProperty("--gr-bg",o.colorBackground),this.host.style.setProperty("--gr-tint",o.colorTint);let s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(o.colorTint),c=o.tintAlpha>1?o.tintAlpha/100:o.tintAlpha,d=s?`rgba(${parseInt(s[1],16)}, ${parseInt(s[2],16)}, ${parseInt(s[3],16)}, ${c})`:`rgba(0, 0, 0, ${c})`;this.host.style.setProperty("--gr-tint-rgba",d),this.host.style.setProperty("--gr-surface",o.colorSurface),this.host.style.setProperty("--gr-border",o.colorBorder),this.host.style.setProperty("--gr-error",o.colorError),this.host.style.setProperty("--gr-radius",o.borderRadius),this.host.style.setProperty("--gr-font",'Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'),this.shadow=this.host.attachShadow({mode:"open"});let h=document.createElement("style");h.textContent=":host{all:initial;display:block}*{box-sizing:border-box}@keyframes gr-fade-in{from{opacity:0}to{opacity:1}}@keyframes gr-slide-up{from{opacity:0;transform:translateY(20px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes gr-slide-in-right{from{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes gr-slide-in-left{from{opacity:0;transform:translateX(-100%)}to{opacity:1;transform:translateX(0)}}.gr-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;display:flex;z-index:2147483647;font-family:var(--gr-font);animation:gr-fade-in .2s ease-out forwards;backdrop-filter:blur(4px);background-color:var(--gr-tint-rgba)}.gr-overlay--modal{align-items:center;justify-content:center}.gr-overlay--drawer{align-items:flex-start;justify-content:flex-start}.gr-container{position:relative;background-color:var(--gr-bg);color:var(--gr-text);padding:32px;box-shadow:0 0 50px -12px rgba(0,0,0,0.25), 0 0 30px -10px rgba(0,0,0,0.15)}.gr-container--embedded{width:100%;height:100%;box-shadow:none;border:1px solid var(--gr-border);border-radius:var(--gr-radius)}.gr-container--modal{width:90%;max-width:480px;border-radius:var(--gr-radius);animation:gr-slide-up .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--drawer{position:absolute;width:400px;max-width:calc(100vw - 20px);max-height:calc(100vh - 40px);overflow-y:auto}.gr-container--right{right:0;border-top-left-radius:var(--gr-radius);border-bottom-left-radius:var(--gr-radius);animation:gr-slide-in-right .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--left{left:0;border-top-right-radius:var(--gr-radius);border-bottom-right-radius:var(--gr-radius);animation:gr-slide-in-left .3s cubic-bezier(.16,1,.3,1) forwards}.gr-container--top{top:100px}.gr-container--bottom{bottom:100px}.gr-close-btn{position:absolute;top:20px;right:20px;background:0 0;border:none;cursor:pointer;color:#9ca3af;padding:4px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.gr-close-btn:hover{background-color:var(--gr-surface);color:var(--gr-text)}.gr-header{text-align:center;margin-bottom:28px}.gr-icon-lg{font-size:32px;margin-bottom:12px}.gr-title{margin:0 0 8px 0;font-size:22px;font-weight:700;letter-spacing:-.02em}.gr-subtitle{margin:0;font-size:14px;line-height:1.5;color:var(--gr-text-secondary)}.gr-loading{padding:16px;background-color:var(--gr-surface);border-radius:8px;text-align:center;color:var(--gr-text-secondary);font-size:14px}.gr-label{display:block;font-size:12px;font-weight:600;color:var(--gr-text-secondary);margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em}.gr-share-label{text-align:center;margin-bottom:16px;font-size:13px;font-weight:500;color:var(--gr-text-secondary);display:flex;align-items:center;gap:12px}.gr-divider{flex:1;height:1px;background:var(--gr-border)}.gr-social-container{display:flex;gap:16px;justify-content:center;flex-wrap:wrap}.gr-btn{padding:14px;font-size:15px;font-weight:600;background-color:var(--gr-primary);color:#fff;border:none;border-radius:var(--gr-radius);cursor:pointer;transition:all .2s ease;text-align:center;width:100%;display:block}.gr-btn:hover{transform:translateY(-1px);filter:brightness(1.05)}.gr-btn:active{transform:translateY(0);filter:brightness(.95)}.gr-btn:disabled{opacity:.7;cursor:not-allowed}.gr-btn--sm{padding:8px 16px;font-size:13px;width:auto;border-radius:calc(var(--gr-radius) - 4px)}.gr-input-group{display:flex;align-items:center;background-color:var(--gr-surface);border:1px solid var(--gr-border);border-radius:var(--gr-radius);padding:4px;margin-bottom:24px}.gr-input-group:focus-within{border-color:var(--gr-primary);box-shadow:0 0 0 3px var(--gr-surface)}.gr-input{flex:1;padding:10px 12px;font-size:14px;border:none;background:0 0;color:var(--gr-text);outline:none;font-family:monospace}.gr-social-btn{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background-color:var(--gr-surface);color:var(--gr-text-secondary);border:1px solid var(--gr-border);transition:transform .2s cubic-bezier(.34,1.56,.64,1);cursor:pointer}.gr-social-btn:hover{transform:scale(1.15) rotate(3deg);color:#fff}.gr-powered-by{margin-top:24px;text-align:center;font-size:11px;color:#9ca3af;display:flex;align-items:center;justify-content:center;gap:4px;opacity:.8}.gr-powered-by a{color:inherit;text-decoration:none;font-weight:600;transition:opacity .2s}.gr-powered-by a:hover{opacity:1;text-decoration:underline}",this.shadow.appendChild(h),this.content=document.createElement("div");let g=n.modal.componentType==="drawer",R=n.trigger.position||"top-right",u=["gr-container"];a?(u.push("gr-container--embedded"),this.content.className=u.join(" "),this.renderInternalContent(o,e,a),this.shadow.appendChild(this.content),t&&t.appendChild(this.host)):(this.overlay=document.createElement("div"),this.overlay.className=`gr-overlay ${g?"gr-overlay--drawer":"gr-overlay--modal"}`,g?(u.push("gr-container--drawer"),R.includes("right")?u.push("gr-container--right"):u.push("gr-container--left"),R.includes("bottom")?u.push("gr-container--bottom"):u.push("gr-container--top")):u.push("gr-container--modal"),this.content.className=u.join(" "),this.renderInternalContent(o,e,a),this.overlay.appendChild(this.content),this.shadow.appendChild(this.overlay),document.body.appendChild(this.host),this.overlay.onclick=k=>{k.target===this.overlay&&this.hide()})}getTheme(){return{colorPrimary:"#2563eb",colorText:"#111827",colorTextSecondary:"#6b7280",colorBackground:"#ffffff",colorTint:"#f9fafb",tintAlpha:.8,colorSurface:"#f9fafb",colorBorder:"#e5e7eb",colorError:"#ef4444",borderRadius:"16px"}}async renderInternalContent(e,t,n=!1){if(!this.content)return;if(this.content.innerHTML="",!n){let g=document.createElement("button");g.className="gr-close-btn",g.innerHTML=`
|
|
2
2
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
3
3
|
<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
4
4
|
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
5
5
|
</svg>
|
|
6
|
-
`,
|
|
6
|
+
`,g.onclick=()=>this.hide(),this.content.appendChild(g)}let i=document.createElement("div");i.className="gr-header";let o=document.createElement("div");o.className="gr-icon-lg",o.innerHTML="\u{1F381}",i.appendChild(o);let a=document.createElement("h3");a.className="gr-title",a.textContent=t?.title??this.referrerExperience.modal.title??"Invite Friends & Earn",i.appendChild(a);let s=document.createElement("p");if(s.className="gr-subtitle",s.textContent="Share your unique link and earn rewards for every friend who signs up.",i.appendChild(s),this.content.appendChild(i),!this.deps.isUserReady()){let g=document.createElement("div");g.className="gr-loading",g.textContent="Please log in to view your referral dashboard.",this.content.appendChild(g);return}let c=this.deps.getReferralLink(),d=document.createElement("div");this.renderLinkView(d,c,e),this.content.appendChild(d),c&&this.renderSocialShare(this.content,c,e);let h=document.createElement("div");h.className="gr-powered-by",h.innerHTML=`
|
|
7
7
|
Powered by <a href="https://growthrail.com" target="_blank" rel="noopener noreferrer">Growth Rail</a>
|
|
8
|
-
`,this.content.appendChild(
|
|
9
|
-
:host { all: initial; display: block; }
|
|
10
|
-
@keyframes gr-shimmer {
|
|
11
|
-
0% { transform: translateX(-150%) skewX(-15deg); }
|
|
12
|
-
50% { transform: translateX(150%) skewX(-15deg); }
|
|
13
|
-
100% { transform: translateX(150%) skewX(-15deg); }
|
|
14
|
-
}
|
|
15
|
-
.gr-btn {
|
|
16
|
-
position: fixed;
|
|
17
|
-
width: 50px;
|
|
18
|
-
height: 50px;
|
|
19
|
-
background: ${this.options.modal?.theme?.primaryColor||"#000"};
|
|
20
|
-
box-shadow: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,0.06);
|
|
21
|
-
cursor: pointer;
|
|
22
|
-
z-index: 2147483646;
|
|
23
|
-
display: flex;
|
|
24
|
-
align-items: center;
|
|
25
|
-
justify-content: center;
|
|
26
|
-
transition: transform .2s cubic-bezier(.34,1.56,.64,1), box-shadow .2s ease, width .2s, border-radius .2s;
|
|
27
|
-
overflow: hidden;
|
|
28
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
29
|
-
box-sizing: border-box;
|
|
30
|
-
}
|
|
31
|
-
.gr-btn * { box-sizing: border-box; }
|
|
32
|
-
.gr-btn:hover {
|
|
33
|
-
transform: scale(1.05);
|
|
34
|
-
box-shadow: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,0.05);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/* Edge Mode Radii */
|
|
38
|
-
.gr-btn--edge.gr-btn--right { border-radius: 8px 0 0 8px; padding-left: 4px; right: 0; }
|
|
39
|
-
.gr-btn--edge.gr-btn--left { border-radius: 0 8px 8px 0; padding-right: 4px; left: 0; }
|
|
40
|
-
|
|
41
|
-
/* Floating Mode Radii & Position */
|
|
42
|
-
.gr-btn--floating {
|
|
43
|
-
border-radius: 50%;
|
|
44
|
-
box-shadow: 0 8px 24px color-mix(in srgb, ${this.options.modal?.theme?.primaryColor||"#000"}, transparent 60%);
|
|
45
|
-
}
|
|
46
|
-
.gr-btn--floating:hover {
|
|
47
|
-
box-shadow: 0 12px 32px color-mix(in srgb, ${this.options.modal?.theme?.primaryColor||"#000"}, transparent 40%);
|
|
48
|
-
}
|
|
49
|
-
.gr-btn--floating.gr-btn--right { right: 20px; }
|
|
50
|
-
.gr-btn--floating.gr-btn--left { left: 20px; }
|
|
51
|
-
|
|
52
|
-
.gr-btn--bottom { bottom: var(--gr-offset-y); }
|
|
53
|
-
.gr-btn--top { top: var(--gr-offset-y); }
|
|
54
|
-
|
|
55
|
-
.gr-btn::after {
|
|
56
|
-
content: '';
|
|
57
|
-
position: absolute;
|
|
58
|
-
top: 0;
|
|
59
|
-
left: 0;
|
|
60
|
-
width: 100%;
|
|
61
|
-
height: 100%;
|
|
62
|
-
background: linear-gradient(to right, transparent 0%, rgba(255,255,255,0.4) 50%, transparent 100%);
|
|
63
|
-
transform: translateX(-150%) skewX(-15deg);
|
|
64
|
-
animation: gr-shimmer 3s infinite;
|
|
65
|
-
}
|
|
66
|
-
.gr-icon { color: #fff; width: 24px; height: 24px; position: relative; z-index: 10; }
|
|
67
|
-
`,this.shadow.appendChild(t),this.element=document.createElement("div");let i=this.options.trigger?.position||"bottom-right",o=["gr-btn",`gr-btn--${n}`];i.includes("right")?o.push("gr-btn--right"):o.push("gr-btn--left"),i.includes("bottom")?o.push("gr-btn--bottom"):o.push("gr-btn--top"),this.element.className=o.join(" "),this.element.innerHTML=`
|
|
68
|
-
<svg class="gr-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
69
|
-
<polyline points="20 12 20 22 4 22 4 12"></polyline>
|
|
70
|
-
<rect x="2" y="7" width="20" height="5"></rect>
|
|
71
|
-
<line x1="12" y1="22" x2="12" y2="7"></line>
|
|
72
|
-
<path d="M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z"></path>
|
|
73
|
-
<path d="M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z"></path>
|
|
74
|
-
</svg>
|
|
75
|
-
`,this.element.onclick=()=>{x.showReferralDashboard()},this.shadow.appendChild(this.element),document.body.appendChild(this.host)}};var w=class{static show(e){if(typeof document>"u")return;let t=document.createElement("div");t.id="gr-banner-host",document.body.appendChild(t);let n=t.attachShadow({mode:"open"}),i=(e.banner.position||"center-top").toLowerCase(),o=i.includes("bottom")?"bottom":"top",s=i.includes("left")?"left":i.includes("right")?"right":"center",l="",d="";s==="center"?(l="left: 50%;",d="translateX(-50%)"):(l=`${s}: 20px;`,d="translateX(0)");let c=e.banner.themeColor||"#0070f3",g=document.createElement("style");g.textContent=`
|
|
8
|
+
`,this.content.appendChild(h)}renderLinkView(e,t,n){let i=document.createElement("label");i.className="gr-label",i.textContent="Your unique link",e.appendChild(i);let o=document.createElement("div");o.className="gr-input-group";let a=document.createElement("input");a.className="gr-input",a.type="text",a.value=t,a.readOnly=!0;let s=document.createElement("button");s.className="gr-btn gr-btn--sm",s.textContent="Copy",s.onclick=async()=>{try{await navigator.clipboard.writeText(t);let c=s.textContent;s.textContent="Copied!",s.style.backgroundColor="#10b981",setTimeout(()=>{s.textContent=c,s.style.backgroundColor=""},2e3)}catch(c){console.error("Failed to copy",c)}},o.appendChild(a),o.appendChild(s),e.appendChild(o)}renderSocialShare(e,t,n){let i=document.createElement("div"),o=document.createElement("div");o.className="gr-share-label",o.innerHTML='<span class="gr-divider"></span>Share via<span class="gr-divider"></span>',i.appendChild(o);let a=document.createElement("div");a.className="gr-social-container",[{name:"Twitter",color:"#000000",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>',url:`https://twitter.com/intent/tweet?url=${encodeURIComponent(t)}&text=Check+this+out!`},{name:"Facebook",color:"#1877F2",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036c-2.648 0-2.928 1.67-2.928 3.403v1.596h3.949l-.577 3.667h-3.372v7.98h-4.938z"/></svg>',url:`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(t)}`},{name:"LinkedIn",color:"#0A66C2",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>',url:`https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(t)}`},{name:"WhatsApp",color:"#25D366",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>',url:`https://api.whatsapp.com/send?text=${encodeURIComponent(t)}`},{name:"Email",color:"#888888",icon:'<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></svg>',url:`mailto:?subject=Check this out&body=${encodeURIComponent(t)}`}].forEach(c=>{let d=document.createElement("a");d.href=c.url,d.target="_blank",d.rel="noopener noreferrer",d.className="gr-social-btn",d.innerHTML=c.icon,d.title=`Share on ${c.name}`,d.onmouseenter=()=>{d.style.backgroundColor=c.color,d.style.color="#ffffff",d.style.borderColor=c.color},d.onmouseleave=()=>{d.style.backgroundColor="",d.style.color="",d.style.borderColor=""},a.appendChild(d)}),i.appendChild(a),e.appendChild(i)}bindEvents(){this.overlay&&(this.overlay.onclick=e=>{e.target===this.overlay&&this.hide()})}};var v=class{static show(e){if(typeof document>"u")return;let t=document.createElement("div");t.id="gr-banner-host",document.body.appendChild(t);let n=t.attachShadow({mode:"open"}),i=(e.banner.position||"center-top").toLowerCase(),o=i.includes("bottom")?"bottom":"top",a=i.includes("left")?"left":i.includes("right")?"right":"center",s="",c="";a==="center"?(s="left: 50%;",c="translateX(-50%)"):(s=`${a}: 20px;`,c="translateX(0)");let d=e.banner.themeColor||"#0070f3",h=document.createElement("style");h.textContent=`
|
|
76
9
|
.gr-banner {
|
|
77
10
|
position: fixed;
|
|
78
11
|
${o}: 20px;
|
|
79
|
-
${
|
|
12
|
+
${s}
|
|
80
13
|
z-index: 2147483647;
|
|
81
14
|
font-family: Inter, system-ui, -apple-system, sans-serif;
|
|
82
15
|
background: var(--gr-theme-color);
|
|
@@ -96,11 +29,11 @@ var E=Object.defineProperty;var C=(h,e,t)=>e in h?E(h,e,{enumerable:!0,configura
|
|
|
96
29
|
@keyframes gr-slide-in {
|
|
97
30
|
from {
|
|
98
31
|
opacity: 0;
|
|
99
|
-
transform: ${
|
|
32
|
+
transform: ${c} translateY(${o==="top"?"-20px":"20px"});
|
|
100
33
|
}
|
|
101
34
|
to {
|
|
102
35
|
opacity: 1;
|
|
103
|
-
transform: ${
|
|
36
|
+
transform: ${c} translateY(0);
|
|
104
37
|
}
|
|
105
38
|
}
|
|
106
39
|
|
|
@@ -126,7 +59,7 @@ var E=Object.defineProperty;var C=(h,e,t)=>e in h?E(h,e,{enumerable:!0,configura
|
|
|
126
59
|
flex-shrink: 0;
|
|
127
60
|
}
|
|
128
61
|
.gr-close:hover { background: rgba(255, 255, 255, 0.2); color: #ffffff; }
|
|
129
|
-
`;let
|
|
62
|
+
`;let g=document.createElement("div");g.className="gr-banner",g.style.setProperty("--gr-theme-color",d),g.innerHTML=`
|
|
130
63
|
<svg class="gr-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
131
64
|
<polyline points="20 12 20 22 4 22 4 12"></polyline>
|
|
132
65
|
<rect x="2" y="7" width="20" height="5"></rect>
|
|
@@ -141,4 +74,4 @@ var E=Object.defineProperty;var C=(h,e,t)=>e in h?E(h,e,{enumerable:!0,configura
|
|
|
141
74
|
<line x1="6" y1="6" x2="18" y2="18"></line>
|
|
142
75
|
</svg>
|
|
143
76
|
</button>
|
|
144
|
-
`,
|
|
77
|
+
`,g.querySelector(".gr-close")?.addEventListener("click",()=>{t.remove()}),n.appendChild(h),n.appendChild(g)}};var r=class r{constructor(){}static init(e){r.initialized||(r.options=e,r.api=new b(e),e.debug&&(r.api.setDebug(!0),p.log("info","Core","SDK Initializing...",e)),r.storage=new x({cookieDomain:e.cookieDomain}),r.initialized=!0,r.autoTrackReferral())}static isInitialized(){return r.initialized}static ensureInitialized(){if(!r.initialized)throw new Error("GrowthRail.init() must be called before using the SDK")}static async loadReferrerExperience(e){try{r.createReferralModal(e),e.trigger.displayMode!=="none"&&r.createTriggerButton(e.trigger)}catch(t){throw console.error("GrowthRail: Failed to load referrer experience",t),t}}static createReferralModal(e){r.referralModal=new y({isUserReady:()=>r.isUserReady(),getReferralLink:()=>r.currentUser?.referralLink||""},e)}static async autoTrackReferral(){if(typeof window>"u")return;let e=new URLSearchParams(window.location.search),t=e.get("referralCode"),n=e.get("rewardEventName");if(t){r.options.debug&&p.log("info","DeepLink",`Found referral code in URL: ${t}`,{refCode:t,refEventName:n});let i=await r.api.getNewUserExperience(),o=await r.trackReferral(t,n??void 0);r.storage.setTrackedReferral(o.referralTrackingId),i.banner.show&&(r.options.debug&&p.log("info","UI","Showing promotional banner"),v.show(i))}}static async initAppUser(e){r.ensureInitialized(),r.options.debug&&p.log("info","User",`Initializing user: ${e}`);let t=await r.api.initAppUser(e);return r.currentUser={...t,id:e},r.experience=t.referrerExperience,r.loadReferrerExperience(t.referrerExperience),r.options.debug&&p.log("success","User",`User initialized: ${e}`,t),r.userReadyResolver?r.userReadyResolver(r.currentUser):r.userReadyPromise=Promise.resolve(r.currentUser),t}static async trackReferral(e,t){r.ensureInitialized(),r.options.debug&&p.log("info","Referral",`Tracking referral: ${e}`,{referralCode:e,rewardEventName:t});let n=await r.api.trackReferral(e,t);return r.options.debug&&p.log("success","Referral","Referral tracked successfully",n),n}static async trackRewardEvent(e){r.ensureInitialized(),r.options.debug&&p.log("info","Reward",`Tracking reward event: ${e||"(default)"}`);let t=r.currentUser?.id;if(!t)throw r.options.debug&&p.log("error","Reward","User not initialized"),new Error("GrowthRail: User must be initialized before tracking a reward event.");let n=r.storage.getTrackedReferral();if(!n)throw r.options.debug&&p.log("error","Reward","Referral tracking ID not found"),new Error("GrowthRail: Referral Tracking Id must be initialized before tracking a reward event.");let i=await r.api.trackRewardEvent(t,n,e);return r.options.debug&&p.log("success","Reward","Reward event tracked successfully"),i}static getReferralLink(){if(!r.currentUser?.referralLink)throw new Error("GrowthRail: Referral Link not loaded or user not initialized");return r.currentUser.referralLink}static getReferralCode(){return r.currentUser?.referralCode}static getUserId(){return r.currentUser?.id}static isUserReady(){return r.currentUser!==null}static ensureUserReady(){return r.currentUser?Promise.resolve(r.currentUser):(r.userReadyPromise||(r.userReadyPromise=new Promise(e=>{r.userReadyResolver=e})),r.userReadyPromise)}static async showReferralDashboard(e){if(r.ensureInitialized(),!r.experience)throw new Error("GrowthRail: Experience not loaded");r.referralModal&&r.referralModal.hide(),r.referralModal?.show(e)}static createTriggerButton(e){if(typeof window>"u")return;if(!r.experience)throw new Error("GrowthRail: Experience not loaded");r.floatingButton&&r.floatingButton.unmount();let t={...r.experience?.trigger,...e},n={modal:{...r.experience.modal},trigger:t};r.floatingButton&&(r.options.debug&&p.log("info","UI","Trigger button shown"),r.floatingButton.mount())}static destroyTriggerButton(){r.floatingButton&&(r.floatingButton.unmount(),r.floatingButton=null)}};l(r,"api"),l(r,"storage"),l(r,"options"),l(r,"currentUser",null),l(r,"initialized",!1),l(r,"referralModal",null),l(r,"floatingButton",null),l(r,"experience",null),l(r,"userReadyPromise",null),l(r,"userReadyResolver",null);var w=r;export{w as GrowthRail,y as ReferralModal};
|