@fruga/sdk 1.0.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,12 +24,18 @@ export default function MyPage() {
24
24
  }
25
25
  ```
26
26
 
27
- An imperative API (`init`/`mount`/`unmount` from `@fruga/sdk/loader`) and a script-tag build are also available.
27
+ An imperative API (`init`/`mount`/`unmount`/`retry` from `@fruga/sdk/loader`) and a script-tag build are also available. `init()` resolves to a `FrugaHandle`; pass `onError` to be notified if a mount fails (see [docs/INSTALLATION.md](./docs/INSTALLATION.md#load-failures)).
28
+
29
+ > **2026-09-15:** the default `baseUrl` above (production) cannot serve the widget yet — pass `baseUrl="https://api-dev.fruga.co.uk"` until it is promoted. See the Status callout in [docs/INSTALLATION.md](./docs/INSTALLATION.md).
28
30
 
29
31
  ## Documentation
30
32
 
31
33
  Full integration guides, authentication/JWT setup, configuration options, and API reference live at **[docs.fruga.co.uk](https://docs.fruga.co.uk)** — start with the [Relay Getting Started guide](https://docs.fruga.co.uk/relay/guides/start/).
32
34
 
35
+ - [CHANGELOG.md](./CHANGELOG.md) — partner-facing changes by release.
36
+ - [docs/DECISIONS.md](./docs/DECISIONS.md) — why the SDK behaves the way it does.
37
+ - [docs/INSTALLATION.md](./docs/INSTALLATION.md) — install, CDN/script-tag embedding, and upgrade notes.
38
+
33
39
  ## Development
34
40
 
35
41
  ```bash
@@ -37,6 +43,7 @@ pnpm install
37
43
  pnpm dev # Watch mode for all apps/packages
38
44
  pnpm build # Production build
39
45
  pnpm test # Run tests
46
+ pnpm test:coverage # Run tests with coverage (required before a PR; see CONTRIBUTING.md)
40
47
  ```
41
48
 
42
49
  ## License
@@ -27,11 +27,20 @@ interface BootstrapAuth {
27
27
  issuer: string;
28
28
  tokenTtlSeconds: number;
29
29
  }
30
+ /**
31
+ * Who receives the cashback. The wire type is deliberately wider than the two
32
+ * modes the UI knows about: the API may introduce further values, so every
33
+ * consumer narrows through {@link resolvePayoutMode} instead of comparing
34
+ * against a literal.
35
+ */
36
+ type PayoutMode = 'PARTNER' | 'USER';
37
+ /** `partnerPayout` as it arrives on the wire, including values this build does not know. */
38
+ type PartnerPayout = PayoutMode | 'UNKNOWN';
30
39
  interface WidgetBootstrap {
31
40
  partnerEnvId: string;
32
41
  partnerId: string;
33
42
  partnerType: PartnerType;
34
- partnerPayout: 'PARTNER' | 'USER';
43
+ partnerPayout: PartnerPayout;
35
44
  auth: BootstrapAuth;
36
45
  config: {
37
46
  ui: WidgetUiConfig;
@@ -40,6 +49,12 @@ interface WidgetBootstrap {
40
49
  launcherIcon: string[];
41
50
  };
42
51
  };
52
+ /**
53
+ * Absolute URL of the widget document to load. When present the loader uses
54
+ * it instead of its default, which gives ops a kill switch and native
55
+ * wrappers the URL from the same call.
56
+ */
57
+ widgetUrl?: string;
43
58
  }
44
59
  interface RelayConfig {
45
60
  containerId: string;
package/dist/connect.d.ts CHANGED
@@ -27,11 +27,20 @@ interface BootstrapAuth {
27
27
  issuer: string;
28
28
  tokenTtlSeconds: number;
29
29
  }
30
+ /**
31
+ * Who receives the cashback. The wire type is deliberately wider than the two
32
+ * modes the UI knows about: the API may introduce further values, so every
33
+ * consumer narrows through {@link resolvePayoutMode} instead of comparing
34
+ * against a literal.
35
+ */
36
+ type PayoutMode = 'PARTNER' | 'USER';
37
+ /** `partnerPayout` as it arrives on the wire, including values this build does not know. */
38
+ type PartnerPayout = PayoutMode | 'UNKNOWN';
30
39
  interface WidgetBootstrap {
31
40
  partnerEnvId: string;
32
41
  partnerId: string;
33
42
  partnerType: PartnerType;
34
- partnerPayout: 'PARTNER' | 'USER';
43
+ partnerPayout: PartnerPayout;
35
44
  auth: BootstrapAuth;
36
45
  config: {
37
46
  ui: WidgetUiConfig;
@@ -40,6 +49,12 @@ interface WidgetBootstrap {
40
49
  launcherIcon: string[];
41
50
  };
42
51
  };
52
+ /**
53
+ * Absolute URL of the widget document to load. When present the loader uses
54
+ * it instead of its default, which gives ops a kill switch and native
55
+ * wrappers the URL from the same call.
56
+ */
57
+ widgetUrl?: string;
43
58
  }
44
59
  interface RelayConfig {
45
60
  containerId: string;
package/dist/connect.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var fe=Object.create;var U=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var ce=Object.getOwnPropertyNames;var ne=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var me=(e,a)=>{for(var t in a)U(e,t,{get:a[t],enumerable:!0})},z=(e,a,t,u)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of ce(a))!pe.call(e,o)&&o!==t&&U(e,o,{get:()=>a[o],enumerable:!(u=ie(a,o))||u.enumerable});return e};var G=(e,a,t)=>(t=e!=null?fe(ne(e)):{},z(a||!e||!e.__esModule?U(t,"default",{value:e,enumerable:!0}):t,e)),Le=e=>z(U({},"__esModule",{value:!0}),e);var Me={};me(Me,{default:()=>Be,mount:()=>se});module.exports=Le(Me);var le=G(require("react")),re=G(require("react-dom/client"));var P={widgetTitle:"Savings Box",launcherLabel:"Insurance Savings",launcherIcon:"arrow",showLauncher:!0,mode:"light",allowUserThemeControl:!1,defaultTheme:"light",uiVersion:"current",primary:"#1E40AF",accent:"#2648C9",accentTextLight:"#FFFFFF",accentTextDark:"#FFFFFF",bg:"#0B1220",panel:"#0F1A2E",panel2:"#111F38",itemBg:"rgba(255,255,255,0.03)",text:"#E6EDF7",muted:"#A7B3C6",border:"rgba(255,255,255,0.08)",success:"#34D399",danger:"#EF4444",warning:"#FBBF24",lightBg:"#F8FAFC",lightPanel:"#FFFFFF",lightPanel2:"#F1F5F9",lightItemBg:"rgba(0,0,0,0.04)",lightText:"#0F172A",lightMuted:"#64748B",lightBorder:"rgba(0,0,0,0.1)"};function X(e){let a=e.mode==="light",t=a?e.textColorLight?.trim()||e.lightText:e.textColorDark?.trim()||e.text;return{...e,bg:a?e.lightBg:e.bg,panel:a?e.lightPanel:e.panel,panel2:a?e.lightPanel2:e.panel2,itemBg:a?e.lightItemBg:e.itemBg,text:t,muted:a?e.lightMuted:e.muted,border:a?e.lightBorder:e.border,subtleBg:a?"rgba(0,0,0,0.02)":"rgba(255,255,255,0.03)",tooltipBg:a?"#FFFFFF":"#0B1220",tooltipBorder:a?"rgba(0,0,0,0.12)":"rgba(255,255,255,0.12)",accentText:a?e.accentTextLight?.trim()||"#0F172A":e.accentTextDark?.trim()||"#FFFFFF",isLight:a,mode:e.mode}}var xe=require("react/jsx-runtime");var L=require("react");var H=require("react");var v=(...e)=>e.filter((a,t,u)=>!!a&&a.trim()!==""&&u.indexOf(a)===t).join(" ").trim();var N=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var K=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(a,t,u)=>u?u.toUpperCase():t.toLowerCase());var W=e=>{let a=K(e);return a.charAt(0).toUpperCase()+a.slice(1)};var M=require("react");var O={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var Z=e=>{for(let a in e)if(a.startsWith("aria-")||a==="role"||a==="title")return!0;return!1};var k=require("react");var Ce=(0,k.createContext)({});var Q=()=>(0,k.useContext)(Ce);var J=(0,M.forwardRef)(({color:e,size:a,strokeWidth:t,absoluteStrokeWidth:u,className:o="",children:f,iconNode:g,...l},r)=>{let{size:i=24,strokeWidth:d=2,absoluteStrokeWidth:m=!1,color:A="currentColor",className:c=""}=Q()??{},w=u??m?Number(t??d)*24/Number(a??i):t??d;return(0,M.createElement)("svg",{ref:r,...O,width:a??i??O.width,height:a??i??O.height,stroke:e??A,strokeWidth:w,className:v("lucide",c,o),...!f&&!Z(l)&&{"aria-hidden":"true"},...l},[...g.map(([F,h])=>(0,M.createElement)(F,h)),...Array.isArray(f)?f:[f]])});var p=(e,a)=>{let t=(0,H.forwardRef)(({className:u,...o},f)=>(0,H.createElement)(J,{ref:f,iconNode:a,className:v(`lucide-${N(W(e))}`,`lucide-${e}`,u),...o}));return t.displayName=W(e),t};var ge=[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]],D=p("credit-card",ge);var he=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8",key:"1sqzm4"}],["path",{d:"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5",key:"kc0143"}],["rect",{x:"3",y:"7",width:"18",height:"4",rx:"1",key:"1hberx"}]],y=p("gift",he);var Se=[["path",{d:"M13 5H19V11",key:"1n1gyv"}],["path",{d:"M19 5L5 19",key:"72u4yj"}]],R=p("move-up-right",Se);var we=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],x=p("sparkles",we);var Pe=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],T=p("x",Pe);var b=require("react/jsx-runtime");function _({theme:e}){return e.launcherIcon==="none"?null:e.launcherIcon==="sparkles"?(0,b.jsx)(x,{size:20}):e.launcherIcon==="credit"?(0,b.jsx)(D,{size:20}):e.launcherIcon==="arrow"?(0,b.jsx)(R,{size:20}):(0,b.jsx)(y,{size:20})}var E=require("react");var j=e=>{let a,t=new Set,u=(i,d)=>{let m=typeof i=="function"?i(a):i;if(!Object.is(m,a)){let A=a;a=d??(typeof m!="object"||m===null)?m:Object.assign({},a,m),t.forEach(c=>c(a,A))}},o=()=>a,l={setState:u,getState:o,getInitialState:()=>r,subscribe:i=>(t.add(i),()=>t.delete(i))},r=a=e(u,o,l);return l},$=(e=>e?j(e):j);var q=G(require("react"),1);var ke=e=>e;function Ae(e,a=ke){let t=q.default.useSyncExternalStore(e.subscribe,q.default.useCallback(()=>a(e.getState()),[e,a]),q.default.useCallback(()=>a(e.getInitialState()),[e,a]));return q.default.useDebugValue(t),t}var Y=e=>{let a=$(e),t=u=>Ae(a,u);return Object.assign(t,a),t},ee=(e=>e?Y(e):Y);var S=ee(e=>({isOpen:!1,isFocused:!0,isIdle:!1,available:0,pending:0,mode:"light",token:null,partnerPayout:null,isAddingPayoutFromAlert:!1,showPayoutSuccess:!1,toggle:()=>e(a=>({isOpen:!a.isOpen})),setOpen:a=>e({isOpen:a}),setFocused:a=>e({isFocused:a}),setIdle:a=>e({isIdle:a}),setBalances:(a,t)=>e({available:a,pending:t}),setMode:a=>e({mode:a}),setToken:a=>e({token:a}),setPartnerPayout:a=>e({partnerPayout:a}),setIsAddingPayoutFromAlert:a=>e({isAddingPayoutFromAlert:a}),setShowPayoutSuccess:a=>e({showPayoutSuccess:a})}));function ae(){let{setFocused:e,setIdle:a}=S(),t=(0,E.useRef)(null);(0,E.useEffect)(()=>{let u=()=>e(!0),o=()=>e(!1),f=()=>{a(!1),t.current&&clearTimeout(t.current),t.current=setTimeout(()=>{a(!0)},6e4)},g=()=>{f()};f(),e(document.hasFocus()),window.addEventListener("focus",u),window.addEventListener("blur",o);let l=["mousemove","keydown","scroll","touchstart","mousedown"];return l.forEach(r=>{window.addEventListener(r,g,r==="scroll"?!0:void 0)}),()=>{window.removeEventListener("focus",u),window.removeEventListener("blur",o),l.forEach(r=>{window.removeEventListener(r,g,r==="scroll"?!0:void 0)}),t.current&&clearTimeout(t.current)}},[e,a])}var s=require("react/jsx-runtime"),te=({children:e,theme:a,hostHeight:t=800,isMobile:u=!1})=>{ae();let{isOpen:o,toggle:f,mode:g}=S(),l=a||P,[r,i]=(0,L.useState)(t),[d,m]=(0,L.useState)(u),A=l.allowUserThemeControl?{...l,mode:g}:{...l,mode:l.mode||"light"},c=X(A),w=(0,L.useRef)(null),F=(0,L.useRef)(null);return(0,L.useEffect)(()=>{let h=n=>{if(n.data?.type==="FRUGA_HOST_RESIZE"&&(i(n.data.hostHeight),m(n.data.isHostMobile)),n.data?.type==="FRUGA_TOKEN_UPDATE"){let{setToken:I}=S.getState();I(n.data.token)}if(n.data?.type==="FRUGA_GET_BALANCE"){let{available:I,pending:B}=S.getState();console.log("FRUGA_GET_BALANCE",I,B),window.parent.postMessage({type:"FRUGA_BALANCE_RESPONSE",requestId:n.data.requestId,available:I,pending:B},"*")}};return window.addEventListener("message",h),()=>window.removeEventListener("message",h)},[]),(0,L.useEffect)(()=>{if(!w.current)return;let h=()=>{if(!w.current)return;let I=o?450:100;!o&&F.current&&(I=F.current.offsetWidth+40);let B=o?Math.max(200,r-100):100;d&&o&&(I=window.innerWidth,B=r),window.parent.postMessage({type:"FRUGA_RESIZE",height:B,width:I,isFullscreen:d&&o},"*")},n=new ResizeObserver(()=>h());return n.observe(w.current),h(),()=>n.disconnect()},[o,r,d]),(0,s.jsxs)("div",{ref:w,className:c.mode==="dark"?"dark":"",style:{fontFamily:'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',color:c.text,display:"flex",flexDirection:"column",alignItems:"flex-end",justifyContent:"flex-end",padding:d&&o?"0":"20px",boxSizing:"border-box",height:"100%",margin:0,overscrollBehavior:"contain"},children:[o&&(0,s.jsx)("div",{style:{width:d?"100vw":"410px",minWidth:d?"100vw":"410px",flexShrink:0,maxHeight:d?"100vh":`${Math.max(100,r-100)}px`,height:"100%",marginBottom:d?"0":"20px",backgroundColor:c.accent,borderRadius:d?"0":"16px",boxShadow:d?"none":"0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 0 1px rgba(0,0,0,0.1)",display:"flex",flexDirection:"column",overflow:"hidden",zIndex:9998},children:(0,s.jsx)("div",{className:"fruga-scrollbar",style:{flex:1,minHeight:0,backgroundColor:c.isLight?"#f9f9f9":"#111",display:"flex",flexDirection:"column",boxShadow:d?"none":"0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 0 1px rgba(0,0,0,0.1)"},children:e})}),(0,s.jsxs)("button",{ref:F,onClick:f,style:{backgroundColor:c.accent,color:c.accentText,border:"none",cursor:"pointer",boxShadow:"0 12px 30px -5px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0,0,0, 0.1)",display:o?"none":"flex",alignItems:"center",justifyContent:"center",zIndex:9999,flexShrink:0,borderRadius:"20px",padding:"10px 16px",transition:"transform 0.3s ease-in-out"},className:"flex h-15 items-center gap-2 rounded-xl px-4 active:scale-[0.99]","aria-label":o?"Close widget":"Open widget",children:[l.launcherLabel&&!o?(0,s.jsxs)(s.Fragment,{children:[l.launcherLabel!=="none"&&(0,s.jsx)("div",{className:"text-sm font-semibold",children:l.launcherLabel}),(0,s.jsx)("div",{className:"flex h-6 w-5 shrink-0 items-center justify-center",children:(0,s.jsx)(_,{theme:c})})]}):null,o?(0,s.jsx)(T,{}):null]})]})};var oe=require("react/jsx-runtime");var ue=require("react");var $a=typeof process<"u"&&process.env.VITE_FRUGA_API_URL||"https://api-dev.fruga.co.uk";var C=require("react/jsx-runtime"),de=({partnerKey:e,theme:a,userId:t})=>{let u={...P,primary:a?.primaryColor??P.primary,mode:a?.mode??P.mode};return(0,C.jsx)(te,{theme:u,children:(0,C.jsxs)("div",{style:{padding:"20px",fontFamily:'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'},children:[(0,C.jsx)("h2",{style:{marginTop:0},children:t?`Welcome back, ${t}`:"Connect Widget"}),(0,C.jsx)("p",{children:"This is the Connect widget loaded from the SDK."}),(0,C.jsxs)("p",{children:["Partner Key: ",e]}),t&&(0,C.jsxs)("p",{children:["User Context: ",t]})]})})};var V=require("react/jsx-runtime"),se=(e,a)=>{let t=re.default.createRoot(e);return t.render((0,V.jsx)(le.default.StrictMode,{children:(0,V.jsx)(de,{...a})})),{unmount:()=>{t.unmount()}}},Be={mount:se};0&&(module.exports={mount});
1
+ "use strict";var Te=Object.create;var b=Object.defineProperty;var De=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,be=Object.prototype.hasOwnProperty;var qe=(a,e,t)=>e in a?b(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Oe=(a,e)=>{for(var t in e)b(a,t,{get:e[t],enumerable:!0})},ae=(a,e,t,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ye(e))!be.call(a,o)&&o!==t&&b(a,o,{get:()=>e[o],enumerable:!(u=De(e,o))||u.enumerable});return a};var J=(a,e,t)=>(t=a!=null?Te(Re(a)):{},ae(e||!a||!a.__esModule?b(t,"default",{value:a,enumerable:!0}):t,a)),ve=a=>ae(b({},"__esModule",{value:!0}),a);var m=(a,e,t)=>qe(a,typeof e!="symbol"?e+"":e,t);var aa={};Oe(aa,{default:()=>ea,mount:()=>Be});module.exports=ve(aa);var F=J(require("react")),Ae=J(require("react-dom/client"));var P={widgetTitle:"Savings Box",launcherLabel:"Insurance Savings",launcherIcon:"arrow",showLauncher:!0,mode:"light",allowUserThemeControl:!1,defaultTheme:"light",uiVersion:"current",primary:"#1E40AF",accent:"#2648C9",accentTextLight:"#FFFFFF",accentTextDark:"#FFFFFF",bg:"#0B1220",panel:"#0F1A2E",panel2:"#111F38",itemBg:"rgba(255,255,255,0.03)",text:"#E6EDF7",muted:"#A7B3C6",border:"rgba(255,255,255,0.08)",success:"#34D399",danger:"#EF4444",warning:"#FBBF24",lightBg:"#F8FAFC",lightPanel:"#FFFFFF",lightPanel2:"#F1F5F9",lightItemBg:"rgba(0,0,0,0.04)",lightText:"#0F172A",lightMuted:"#64748B",lightBorder:"rgba(0,0,0,0.1)"};function te(a){let e=a.mode==="light",t=e?a.textColorLight?.trim()||a.lightText:a.textColorDark?.trim()||a.text;return{...a,bg:e?a.lightBg:a.bg,panel:e?a.lightPanel:a.panel,panel2:e?a.lightPanel2:a.panel2,itemBg:e?a.lightItemBg:a.itemBg,text:t,muted:e?a.lightMuted:a.muted,border:e?a.lightBorder:a.border,subtleBg:e?"rgba(0,0,0,0.02)":"rgba(255,255,255,0.03)",tooltipBg:e?"#FFFFFF":"#0B1220",tooltipBorder:e?"rgba(0,0,0,0.12)":"rgba(255,255,255,0.12)",accentText:e?a.accentTextLight?.trim()||"#0F172A":a.accentTextDark?.trim()||"#FFFFFF",isLight:e,mode:a.mode}}var Ue=["NEED_TOKEN","FRUGA_TOKEN_UPDATE","FRUGA_GET_BALANCE","FRUGA_BALANCE_RESPONSE","FRUGA_RESIZE","FRUGA_HOST_RESIZE","FRUGA_READY","FRUGA_INIT"],He=a=>typeof a=="string"&&Ue.includes(a),Ee=["ttl","unauthorized"],oe=a=>{if(typeof a!="object"||a===null)return!1;let e=a;if(!He(e.type)||e.version!==void 0&&typeof e.version!="string")return!1;if(e.type==="NEED_TOKEN"){let{reason:t}=a;return typeof t=="string"&&Ee.includes(t)}return!0};var ue=a=>a==="PARTNER"||a==="USER"?a:null;var We="*",V=class{constructor(e){m(this,"target");m(this,"acceptSource");m(this,"listenOn");m(this,"handlers",new Set);m(this,"pinOriginFrom");m(this,"targetOrigin");m(this,"acceptOrigin");m(this,"pinned",null);m(this,"disposed",!1);m(this,"onMessage",e=>{if(this.disposed||this.acceptSource&&e.source!==this.acceptSource||this.acceptOrigin&&e.origin!==this.acceptOrigin||!oe(e.data)||!this.admitWhileUnpinned(e.data.type,e.origin))return;let t=typeof e.data.version=="string"&&e.data.version.length>0?e.data:{...e.data,version:"1.0"};for(let u of[...this.handlers])u(t)});let t=e.listenOn??(typeof window<"u"?window:void 0);if(!t)throw new Error("PostMessageTransport: no window to listen on; pass options.listenOn");this.target=e.target,this.targetOrigin=e.targetOrigin,this.acceptSource=e.acceptSource,this.acceptOrigin=e.acceptOrigin,this.pinOriginFrom=e.pinOriginFrom,this.listenOn=t,this.listenOn.addEventListener("message",this.onMessage)}get pinnedOrigin(){return this.pinned}pinOrigin(e){this.targetOrigin=e,this.acceptOrigin=e,this.pinned=e}send(e){if(this.disposed)return;let t=typeof e.version=="string"&&e.version.length>0?e:{...e,version:"1.0"};this.target.postMessage(t,this.targetOrigin)}subscribe(e){if(this.disposed)throw new Error("PostMessageTransport: cannot subscribe after dispose()");return this.handlers.add(e),()=>{this.handlers.delete(e)}}dispose(){this.disposed||(this.disposed=!0,this.handlers.clear(),this.listenOn.removeEventListener("message",this.onMessage))}admitWhileUnpinned(e,t){return!this.pinOriginFrom||this.pinned!==null?!0:e!==this.pinOriginFrom?!1:t&&t!=="null"?(this.pinOrigin(t),!0):(this.pinned=We,!0)}};var de=a=>{let e=a?.listenOn??(typeof window<"u"?window:void 0);if(!e)throw new Error("createHostTransport: no window available; pass options.listenOn");let t=e.parent!==e;return new V({target:e.parent,targetOrigin:"*",pinOriginFrom:"FRUGA_INIT",listenOn:e,...t?{acceptSource:e.parent}:{}})};var g=require("react");var X=require("react");var z=(...a)=>a.filter((e,t,u)=>!!e&&e.trim()!==""&&u.indexOf(e)===t).join(" ").trim();var re=a=>a.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var le=a=>a.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,u)=>u?u.toUpperCase():t.toLowerCase());var $=a=>{let e=le(a);return e.charAt(0).toUpperCase()+e.slice(1)};var q=require("react");var N={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var se=a=>{for(let e in a)if(e.startsWith("aria-")||e==="role"||e==="title")return!0;return!1};var A=require("react");var Ve=(0,A.createContext)({});var fe=()=>(0,A.useContext)(Ve);var ie=(0,q.forwardRef)(({color:a,size:e,strokeWidth:t,absoluteStrokeWidth:u,className:o="",children:i,iconNode:p,...r},s)=>{let{size:l=24,strokeWidth:d=2,absoluteStrokeWidth:L=!1,color:D="currentColor",className:y=""}=fe()??{},K=u??L?Number(t??d)*24/Number(e??l):t??d;return(0,q.createElement)("svg",{ref:s,...N,width:e??l??N.width,height:e??l??N.height,stroke:a??D,strokeWidth:K,className:z("lucide",y,o),...!i&&!se(r)&&{"aria-hidden":"true"},...r},[...p.map(([x,M])=>(0,q.createElement)(x,M)),...Array.isArray(i)?i:[i]])});var I=(a,e)=>{let t=(0,X.forwardRef)(({className:u,...o},i)=>(0,X.createElement)(ie,{ref:i,iconNode:e,className:z(`lucide-${re($(a))}`,`lucide-${a}`,u),...o}));return t.displayName=$(a),t};var ze=[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]],O=I("credit-card",ze);var Ne=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8",key:"1sqzm4"}],["path",{d:"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5",key:"kc0143"}],["rect",{x:"3",y:"7",width:"18",height:"4",rx:"1",key:"1hberx"}]],v=I("gift",Ne);var Xe=[["path",{d:"M13 5H19V11",key:"1n1gyv"}],["path",{d:"M19 5L5 19",key:"72u4yj"}]],U=I("move-up-right",Xe);var _e=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],S=I("sparkles",_e);var Ke=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],H=I("x",Ke);var E=require("react/jsx-runtime");function ne({theme:a}){return a.launcherIcon==="none"?null:a.launcherIcon==="sparkles"?(0,E.jsx)(S,{size:20}):a.launcherIcon==="credit"?(0,E.jsx)(O,{size:20}):a.launcherIcon==="arrow"?(0,E.jsx)(U,{size:20}):(0,E.jsx)(v,{size:20})}var _=require("react");var ce=a=>{let e,t=new Set,u=(l,d)=>{let L=typeof l=="function"?l(e):l;if(!Object.is(L,e)){let D=e;e=d??(typeof L!="object"||L===null)?L:Object.assign({},e,L),t.forEach(y=>y(e,D))}},o=()=>e,r={setState:u,getState:o,getInitialState:()=>s,subscribe:l=>(t.add(l),()=>t.delete(l))},s=e=a(u,o,r);return r},pe=(a=>a?ce(a):ce);var G=J(require("react"),1);var Ze=a=>a;function Qe(a,e=Ze){let t=G.default.useSyncExternalStore(a.subscribe,G.default.useCallback(()=>e(a.getState()),[a,e]),G.default.useCallback(()=>e(a.getInitialState()),[a,e]));return G.default.useDebugValue(t),t}var me=a=>{let e=pe(a),t=u=>Qe(e,u);return Object.assign(t,e),t},Le=(a=>a?me(a):me);var c=Le(a=>({isOpen:!1,isFocused:!0,isIdle:!1,available:0,pending:0,mode:"light",token:null,tokenEpoch:0,authStatus:"pending",partnerPayout:null,isAddingPayoutFromAlert:!1,showPayoutSuccess:!1,toggle:()=>a(e=>({isOpen:!e.isOpen})),setOpen:e=>a({isOpen:e}),setFocused:e=>a({isFocused:e}),setIdle:e=>a({isIdle:e}),setBalances:(e,t)=>a({available:e,pending:t}),setMode:e=>a({mode:e}),setToken:e=>a(t=>({token:e,tokenEpoch:t.token===e?t.tokenEpoch:t.tokenEpoch+1,authStatus:e?"authenticated":"pending"})),setPartnerPayout:e=>a({partnerPayout:ue(e)}),setIsAddingPayoutFromAlert:e=>a({isAddingPayoutFromAlert:e}),setShowPayoutSuccess:e=>a({showPayoutSuccess:e})}));function Ie(){let{setFocused:a,setIdle:e}=c(),t=(0,_.useRef)(null);(0,_.useEffect)(()=>{let u=()=>a(!0),o=()=>a(!1),i=()=>{e(!1),t.current&&clearTimeout(t.current),t.current=setTimeout(()=>{e(!0)},6e4)},p=()=>{i()};i(),a(document.hasFocus()),window.addEventListener("focus",u),window.addEventListener("blur",o);let r=["mousemove","keydown","scroll","touchstart","mousedown"];return r.forEach(s=>{window.addEventListener(s,p,s==="scroll"?!0:void 0)}),()=>{window.removeEventListener("focus",u),window.removeEventListener("blur",o),r.forEach(s=>{window.removeEventListener(s,p,s==="scroll"?!0:void 0)}),t.current&&clearTimeout(t.current)}},[a,e])}var B=require("react");var xe=require("react"),Ce=require("react/jsx-runtime"),Y=(0,xe.createContext)(null),ge=({transport:a,children:e})=>(0,Ce.jsx)(Y.Provider,{value:a,children:e});var W=()=>{let a=(0,B.useContext)(Y);if(!a)throw new Error("useMessageTransport: no transport in context. Wrap the widget tree in <MessageTransportProvider transport={...}>.");return a},k=(a,e)=>{let t=W(),u=(0,B.useRef)(e);u.current=e,(0,B.useEffect)(()=>t.subscribe(o=>{o.type===a&&u.current(o)}),[t,a])};var n=require("react/jsx-runtime"),he=({children:a,theme:e,hostHeight:t=800,isMobile:u=!1})=>{Ie();let{isOpen:o,toggle:i,mode:p}=c(),r=e||P,[s,l]=(0,g.useState)(t),[d,L]=(0,g.useState)(u),[D,y]=(0,g.useState)(void 0),K=r.allowUserThemeControl?{...r,mode:p}:{...r,mode:D??r.mode??"light"},x=te(K),M=(0,g.useRef)(null),Z=(0,g.useRef)(null),Q=W();return k("FRUGA_HOST_RESIZE",f=>{l(f.hostHeight),L(f.isHostMobile)}),k("FRUGA_TOKEN_UPDATE",f=>{c.getState().setToken(f.token)}),k("FRUGA_GET_BALANCE",f=>{let{available:C,pending:R}=c.getState();Q.send({type:"FRUGA_BALANCE_RESPONSE",version:"1.0",requestId:f.requestId,available:C,pending:R})}),k("FRUGA_INIT",f=>{l(f.host.height),L(f.host.isMobile),f.token&&c.getState().setToken(f.token),f.overrides?.panelOpen&&c.getState().setOpen(!0);let C=f.overrides?.theme;C&&(y(C),c.getState().setMode(C))}),(0,g.useEffect)(()=>{if(!M.current)return;let f=()=>{if(!M.current)return;let R=o?450:100;!o&&Z.current&&(R=Z.current.offsetWidth+40);let ee=o?Math.max(200,s-100):100;d&&o&&(R=window.innerWidth,ee=s),Q.send({type:"FRUGA_RESIZE",version:"1.0",height:ee,width:R,isFullscreen:d&&o})},C=new ResizeObserver(()=>f());return C.observe(M.current),f(),()=>C.disconnect()},[o,s,d,Q]),(0,n.jsxs)("div",{ref:M,className:x.mode==="dark"?"dark":"",style:{fontFamily:'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',color:x.text,display:"flex",flexDirection:"column",alignItems:"flex-end",justifyContent:"flex-end",padding:d&&o?"0":"20px",boxSizing:"border-box",height:"100%",margin:0,overscrollBehavior:"contain"},children:[o&&(0,n.jsx)("div",{style:{width:d?"100vw":"410px",minWidth:d?"100vw":"410px",flexShrink:0,maxHeight:d?"100vh":`${Math.max(100,s-100)}px`,height:"100%",marginBottom:d?"0":"20px",backgroundColor:x.accent,borderRadius:d?"0":"16px",boxShadow:d?"none":"0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 0 1px rgba(0,0,0,0.1)",display:"flex",flexDirection:"column",overflow:"hidden",zIndex:9998},children:(0,n.jsx)("div",{className:"fruga-scrollbar",style:{flex:1,minHeight:0,backgroundColor:x.isLight?"#f9f9f9":"#111",display:"flex",flexDirection:"column",boxShadow:d?"none":"0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 0 1px rgba(0,0,0,0.1)"},children:a})}),(0,n.jsxs)("button",{ref:Z,onClick:i,style:{backgroundColor:x.accent,color:x.accentText,border:"none",cursor:"pointer",boxShadow:"0 12px 30px -5px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0,0,0, 0.1)",display:o?"none":"flex",alignItems:"center",justifyContent:"center",zIndex:9999,flexShrink:0,borderRadius:"20px",padding:"10px 16px",transition:"transform 0.3s ease-in-out"},className:"flex h-15 items-center gap-2 rounded-xl px-4 active:scale-[0.99]","aria-label":o?"Close widget":"Open widget",children:[r.launcherLabel&&!o?(0,n.jsxs)(n.Fragment,{children:[r.launcherLabel!=="none"&&(0,n.jsx)("div",{className:"text-sm font-semibold",children:r.launcherLabel}),(0,n.jsx)("div",{className:"flex h-6 w-5 shrink-0 items-center justify-center",children:(0,n.jsx)(ne,{theme:x})})]}):null,o?(0,n.jsx)(H,{}):null]})]})};var Se=require("react/jsx-runtime");var we=require("react");var Pe=require("react");var w=require("react/jsx-runtime"),ke=({partnerKey:a,theme:e,userId:t})=>{let u=c(d=>d.setToken),[o,i]=(0,Pe.useState)(null);k("FRUGA_INIT",d=>{u(d.token??null),i(d)});let p=o?.bootstrap.config.ui,r=o?.overrides,s={...P,primary:r?.primaryColor??p?.accent??e?.primaryColor??P.primary,accent:r?.primaryColor??p?.accent??e?.primaryColor??P.accent,mode:r?.theme??p?.defaultTheme??e?.mode??P.mode},l=r?.userId??t;return(0,w.jsx)(he,{theme:s,isMobile:o?.host.isMobile,hostHeight:o?.host.height,children:(0,w.jsxs)("div",{style:{padding:"20px",fontFamily:'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'},children:[(0,w.jsx)("h2",{style:{marginTop:0},children:l?`Welcome back, ${l}`:"Connect Widget"}),(0,w.jsx)("p",{children:"This is the Connect widget loaded from the SDK."}),(0,w.jsxs)("p",{children:["Partner Key: ",a]}),l&&(0,w.jsxs)("p",{children:["User Context: ",l]})]})})};var Fe="1.3.0";var Me=Fe;var T=require("react/jsx-runtime"),$e=({config:a})=>{let e=W();return(0,F.useEffect)(()=>{e.send({type:"FRUGA_READY",version:"1.0",protocolVersion:"1.0",widgetVersion:Me})},[e]),(0,T.jsx)(ke,{...a})},Ye=({config:a})=>{let[e,t]=(0,F.useState)(null);return(0,F.useEffect)(()=>{let u=de();return t(u),()=>u.dispose()},[]),e?(0,T.jsx)(ge,{transport:e,children:(0,T.jsx)($e,{config:a})}):null},Be=(a,e)=>{let t=Ae.default.createRoot(a);return t.render((0,T.jsx)(F.default.StrictMode,{children:(0,T.jsx)(Ye,{config:e})})),{unmount:()=>{t.unmount()}}},ea={mount:Be};0&&(module.exports={mount});
2
2
  /*! Bundled license information:
3
3
 
4
4
  lucide-react/dist/esm/shared/src/utils/mergeClasses.js:
package/dist/connect.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import he from"react";import Se from"react-dom/client";var h={widgetTitle:"Savings Box",launcherLabel:"Insurance Savings",launcherIcon:"arrow",showLauncher:!0,mode:"light",allowUserThemeControl:!1,defaultTheme:"light",uiVersion:"current",primary:"#1E40AF",accent:"#2648C9",accentTextLight:"#FFFFFF",accentTextDark:"#FFFFFF",bg:"#0B1220",panel:"#0F1A2E",panel2:"#111F38",itemBg:"rgba(255,255,255,0.03)",text:"#E6EDF7",muted:"#A7B3C6",border:"rgba(255,255,255,0.08)",success:"#34D399",danger:"#EF4444",warning:"#FBBF24",lightBg:"#F8FAFC",lightPanel:"#FFFFFF",lightPanel2:"#F1F5F9",lightItemBg:"rgba(0,0,0,0.04)",lightText:"#0F172A",lightMuted:"#64748B",lightBorder:"rgba(0,0,0,0.1)"};function O(e){let a=e.mode==="light",t=a?e.textColorLight?.trim()||e.lightText:e.textColorDark?.trim()||e.text;return{...e,bg:a?e.lightBg:e.bg,panel:a?e.lightPanel:e.panel,panel2:a?e.lightPanel2:e.panel2,itemBg:a?e.lightItemBg:e.itemBg,text:t,muted:a?e.lightMuted:e.muted,border:a?e.lightBorder:e.border,subtleBg:a?"rgba(0,0,0,0.02)":"rgba(255,255,255,0.03)",tooltipBg:a?"#FFFFFF":"#0B1220",tooltipBorder:a?"rgba(0,0,0,0.12)":"rgba(255,255,255,0.12)",accentText:a?e.accentTextLight?.trim()||"#0F172A":e.accentTextDark?.trim()||"#FFFFFF",isLight:a,mode:e.mode}}import{jsx as We}from"react/jsx-runtime";import{useState as _,useEffect as j,useRef as $}from"react";import{forwardRef as re,createElement as se}from"react";var D=(...e)=>e.filter((a,t,u)=>!!a&&a.trim()!==""&&u.indexOf(a)===t).join(" ").trim();var H=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var E=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(a,t,u)=>u?u.toUpperCase():t.toLowerCase());var b=e=>{let a=E(e);return a.charAt(0).toUpperCase()+a.slice(1)};import{forwardRef as le,createElement as V}from"react";var y={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var G=e=>{for(let a in e)if(a.startsWith("aria-")||a==="role"||a==="title")return!0;return!1};import{createContext as oe,useContext as ue,useMemo as je,createElement as $e}from"react";var de=oe({});var W=()=>ue(de);var z=le(({color:e,size:a,strokeWidth:t,absoluteStrokeWidth:u,className:o="",children:s,iconNode:I,...l},r)=>{let{size:f=24,strokeWidth:d=2,absoluteStrokeWidth:p=!1,color:w="currentColor",className:i=""}=W()??{},g=u??p?Number(t??d)*24/Number(a??f):t??d;return V("svg",{ref:r,...y,width:a??f??y.width,height:a??f??y.height,stroke:e??w,strokeWidth:g,className:D("lucide",i,o),...!s&&!G(l)&&{"aria-hidden":"true"},...l},[...I.map(([P,x])=>V(P,x)),...Array.isArray(s)?s:[s]])});var n=(e,a)=>{let t=re(({className:u,...o},s)=>se(z,{ref:s,iconNode:a,className:D(`lucide-${H(b(e))}`,`lucide-${e}`,u),...o}));return t.displayName=b(e),t};var fe=[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]],A=n("credit-card",fe);var ie=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8",key:"1sqzm4"}],["path",{d:"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5",key:"kc0143"}],["rect",{x:"3",y:"7",width:"18",height:"4",rx:"1",key:"1hberx"}]],F=n("gift",ie);var ce=[["path",{d:"M13 5H19V11",key:"1n1gyv"}],["path",{d:"M19 5L5 19",key:"72u4yj"}]],B=n("move-up-right",ce);var ne=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],L=n("sparkles",ne);var pe=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],M=n("x",pe);import{jsx as R}from"react/jsx-runtime";function X({theme:e}){return e.launcherIcon==="none"?null:e.launcherIcon==="sparkles"?R(L,{size:20}):e.launcherIcon==="credit"?R(A,{size:20}):e.launcherIcon==="arrow"?R(B,{size:20}):R(F,{size:20})}import{useEffect as xe,useRef as Ce}from"react";var N=e=>{let a,t=new Set,u=(f,d)=>{let p=typeof f=="function"?f(a):f;if(!Object.is(p,a)){let w=a;a=d??(typeof p!="object"||p===null)?p:Object.assign({},a,p),t.forEach(i=>i(a,w))}},o=()=>a,l={setState:u,getState:o,getInitialState:()=>r,subscribe:f=>(t.add(f),()=>t.delete(f))},r=a=e(u,o,l);return l},K=(e=>e?N(e):N);import T from"react";var me=e=>e;function Le(e,a=me){let t=T.useSyncExternalStore(e.subscribe,T.useCallback(()=>a(e.getState()),[e,a]),T.useCallback(()=>a(e.getInitialState()),[e,a]));return T.useDebugValue(t),t}var Z=e=>{let a=K(e),t=u=>Le(a,u);return Object.assign(t,a),t},Q=(e=>e?Z(e):Z);var C=Q(e=>({isOpen:!1,isFocused:!0,isIdle:!1,available:0,pending:0,mode:"light",token:null,partnerPayout:null,isAddingPayoutFromAlert:!1,showPayoutSuccess:!1,toggle:()=>e(a=>({isOpen:!a.isOpen})),setOpen:a=>e({isOpen:a}),setFocused:a=>e({isFocused:a}),setIdle:a=>e({isIdle:a}),setBalances:(a,t)=>e({available:a,pending:t}),setMode:a=>e({mode:a}),setToken:a=>e({token:a}),setPartnerPayout:a=>e({partnerPayout:a}),setIsAddingPayoutFromAlert:a=>e({isAddingPayoutFromAlert:a}),setShowPayoutSuccess:a=>e({showPayoutSuccess:a})}));function J(){let{setFocused:e,setIdle:a}=C(),t=Ce(null);xe(()=>{let u=()=>e(!0),o=()=>e(!1),s=()=>{a(!1),t.current&&clearTimeout(t.current),t.current=setTimeout(()=>{a(!0)},6e4)},I=()=>{s()};s(),e(document.hasFocus()),window.addEventListener("focus",u),window.addEventListener("blur",o);let l=["mousemove","keydown","scroll","touchstart","mousedown"];return l.forEach(r=>{window.addEventListener(r,I,r==="scroll"?!0:void 0)}),()=>{window.removeEventListener("focus",u),window.removeEventListener("blur",o),l.forEach(r=>{window.removeEventListener(r,I,r==="scroll"?!0:void 0)}),t.current&&clearTimeout(t.current)}},[e,a])}import{Fragment as ge,jsx as S,jsxs as q}from"react/jsx-runtime";var Y=({children:e,theme:a,hostHeight:t=800,isMobile:u=!1})=>{J();let{isOpen:o,toggle:s,mode:I}=C(),l=a||h,[r,f]=_(t),[d,p]=_(u),w=l.allowUserThemeControl?{...l,mode:I}:{...l,mode:l.mode||"light"},i=O(w),g=$(null),P=$(null);return j(()=>{let x=c=>{if(c.data?.type==="FRUGA_HOST_RESIZE"&&(f(c.data.hostHeight),p(c.data.isHostMobile)),c.data?.type==="FRUGA_TOKEN_UPDATE"){let{setToken:m}=C.getState();m(c.data.token)}if(c.data?.type==="FRUGA_GET_BALANCE"){let{available:m,pending:k}=C.getState();console.log("FRUGA_GET_BALANCE",m,k),window.parent.postMessage({type:"FRUGA_BALANCE_RESPONSE",requestId:c.data.requestId,available:m,pending:k},"*")}};return window.addEventListener("message",x),()=>window.removeEventListener("message",x)},[]),j(()=>{if(!g.current)return;let x=()=>{if(!g.current)return;let m=o?450:100;!o&&P.current&&(m=P.current.offsetWidth+40);let k=o?Math.max(200,r-100):100;d&&o&&(m=window.innerWidth,k=r),window.parent.postMessage({type:"FRUGA_RESIZE",height:k,width:m,isFullscreen:d&&o},"*")},c=new ResizeObserver(()=>x());return c.observe(g.current),x(),()=>c.disconnect()},[o,r,d]),q("div",{ref:g,className:i.mode==="dark"?"dark":"",style:{fontFamily:'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',color:i.text,display:"flex",flexDirection:"column",alignItems:"flex-end",justifyContent:"flex-end",padding:d&&o?"0":"20px",boxSizing:"border-box",height:"100%",margin:0,overscrollBehavior:"contain"},children:[o&&S("div",{style:{width:d?"100vw":"410px",minWidth:d?"100vw":"410px",flexShrink:0,maxHeight:d?"100vh":`${Math.max(100,r-100)}px`,height:"100%",marginBottom:d?"0":"20px",backgroundColor:i.accent,borderRadius:d?"0":"16px",boxShadow:d?"none":"0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 0 1px rgba(0,0,0,0.1)",display:"flex",flexDirection:"column",overflow:"hidden",zIndex:9998},children:S("div",{className:"fruga-scrollbar",style:{flex:1,minHeight:0,backgroundColor:i.isLight?"#f9f9f9":"#111",display:"flex",flexDirection:"column",boxShadow:d?"none":"0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 0 1px rgba(0,0,0,0.1)"},children:e})}),q("button",{ref:P,onClick:s,style:{backgroundColor:i.accent,color:i.accentText,border:"none",cursor:"pointer",boxShadow:"0 12px 30px -5px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0,0,0, 0.1)",display:o?"none":"flex",alignItems:"center",justifyContent:"center",zIndex:9999,flexShrink:0,borderRadius:"20px",padding:"10px 16px",transition:"transform 0.3s ease-in-out"},className:"flex h-15 items-center gap-2 rounded-xl px-4 active:scale-[0.99]","aria-label":o?"Close widget":"Open widget",children:[l.launcherLabel&&!o?q(ge,{children:[l.launcherLabel!=="none"&&S("div",{className:"text-sm font-semibold",children:l.launcherLabel}),S("div",{className:"flex h-6 w-5 shrink-0 items-center justify-center",children:S(X,{theme:i})})]}):null,o?S(M,{}):null]})]})};import{Fragment as at,jsx as tt}from"react/jsx-runtime";import{useEffect as dt,useState as lt}from"react";var ft=typeof process<"u"&&process.env.VITE_FRUGA_API_URL||"https://api-dev.fruga.co.uk";import{jsx as U,jsxs as v}from"react/jsx-runtime";var ee=({partnerKey:e,theme:a,userId:t})=>{let u={...h,primary:a?.primaryColor??h.primary,mode:a?.mode??h.mode};return U(Y,{theme:u,children:v("div",{style:{padding:"20px",fontFamily:'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'},children:[U("h2",{style:{marginTop:0},children:t?`Welcome back, ${t}`:"Connect Widget"}),U("p",{children:"This is the Connect widget loaded from the SDK."}),v("p",{children:["Partner Key: ",e]}),t&&v("p",{children:["User Context: ",t]})]})})};import{jsx as ae}from"react/jsx-runtime";var we=(e,a)=>{let t=Se.createRoot(e);return t.render(ae(he.StrictMode,{children:ae(ee,{...a})})),{unmount:()=>{t.unmount()}}},Ht={mount:we};export{Ht as default,we as mount};
1
+ var ge=Object.defineProperty;var Ce=(a,e,t)=>e in a?ge(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var p=(a,e,t)=>Ce(a,typeof e!="symbol"?e+"":e,t);import Je,{useEffect as xe,useState as je}from"react";import $e from"react-dom/client";var h={widgetTitle:"Savings Box",launcherLabel:"Insurance Savings",launcherIcon:"arrow",showLauncher:!0,mode:"light",allowUserThemeControl:!1,defaultTheme:"light",uiVersion:"current",primary:"#1E40AF",accent:"#2648C9",accentTextLight:"#FFFFFF",accentTextDark:"#FFFFFF",bg:"#0B1220",panel:"#0F1A2E",panel2:"#111F38",itemBg:"rgba(255,255,255,0.03)",text:"#E6EDF7",muted:"#A7B3C6",border:"rgba(255,255,255,0.08)",success:"#34D399",danger:"#EF4444",warning:"#FBBF24",lightBg:"#F8FAFC",lightPanel:"#FFFFFF",lightPanel2:"#F1F5F9",lightItemBg:"rgba(0,0,0,0.04)",lightText:"#0F172A",lightMuted:"#64748B",lightBorder:"rgba(0,0,0,0.1)"};function Q(a){let e=a.mode==="light",t=e?a.textColorLight?.trim()||a.lightText:a.textColorDark?.trim()||a.text;return{...a,bg:e?a.lightBg:a.bg,panel:e?a.lightPanel:a.panel,panel2:e?a.lightPanel2:a.panel2,itemBg:e?a.lightItemBg:a.itemBg,text:t,muted:e?a.lightMuted:a.muted,border:e?a.lightBorder:a.border,subtleBg:e?"rgba(0,0,0,0.02)":"rgba(255,255,255,0.03)",tooltipBg:e?"#FFFFFF":"#0B1220",tooltipBorder:e?"rgba(0,0,0,0.12)":"rgba(255,255,255,0.12)",accentText:e?a.accentTextLight?.trim()||"#0F172A":a.accentTextDark?.trim()||"#FFFFFF",isLight:e,mode:a.mode}}var he=["NEED_TOKEN","FRUGA_TOKEN_UPDATE","FRUGA_GET_BALANCE","FRUGA_BALANCE_RESPONSE","FRUGA_RESIZE","FRUGA_HOST_RESIZE","FRUGA_READY","FRUGA_INIT"],Se=a=>typeof a=="string"&&he.includes(a),we=["ttl","unauthorized"],J=a=>{if(typeof a!="object"||a===null)return!1;let e=a;if(!Se(e.type)||e.version!==void 0&&typeof e.version!="string")return!1;if(e.type==="NEED_TOKEN"){let{reason:t}=a;return typeof t=="string"&&we.includes(t)}return!0};var j=a=>a==="PARTNER"||a==="USER"?a:null;var ke="*",b=class{constructor(e){p(this,"target");p(this,"acceptSource");p(this,"listenOn");p(this,"handlers",new Set);p(this,"pinOriginFrom");p(this,"targetOrigin");p(this,"acceptOrigin");p(this,"pinned",null);p(this,"disposed",!1);p(this,"onMessage",e=>{if(this.disposed||this.acceptSource&&e.source!==this.acceptSource||this.acceptOrigin&&e.origin!==this.acceptOrigin||!J(e.data)||!this.admitWhileUnpinned(e.data.type,e.origin))return;let t=typeof e.data.version=="string"&&e.data.version.length>0?e.data:{...e.data,version:"1.0"};for(let u of[...this.handlers])u(t)});let t=e.listenOn??(typeof window<"u"?window:void 0);if(!t)throw new Error("PostMessageTransport: no window to listen on; pass options.listenOn");this.target=e.target,this.targetOrigin=e.targetOrigin,this.acceptSource=e.acceptSource,this.acceptOrigin=e.acceptOrigin,this.pinOriginFrom=e.pinOriginFrom,this.listenOn=t,this.listenOn.addEventListener("message",this.onMessage)}get pinnedOrigin(){return this.pinned}pinOrigin(e){this.targetOrigin=e,this.acceptOrigin=e,this.pinned=e}send(e){if(this.disposed)return;let t=typeof e.version=="string"&&e.version.length>0?e:{...e,version:"1.0"};this.target.postMessage(t,this.targetOrigin)}subscribe(e){if(this.disposed)throw new Error("PostMessageTransport: cannot subscribe after dispose()");return this.handlers.add(e),()=>{this.handlers.delete(e)}}dispose(){this.disposed||(this.disposed=!0,this.handlers.clear(),this.listenOn.removeEventListener("message",this.onMessage))}admitWhileUnpinned(e,t){return!this.pinOriginFrom||this.pinned!==null?!0:e!==this.pinOriginFrom?!1:t&&t!=="null"?(this.pinOrigin(t),!0):(this.pinned=ke,!0)}};var $=a=>{let e=a?.listenOn??(typeof window<"u"?window:void 0);if(!e)throw new Error("createHostTransport: no window available; pass options.listenOn");let t=e.parent!==e;return new b({target:e.parent,targetOrigin:"*",pinOriginFrom:"FRUGA_INIT",listenOn:e,...t?{acceptSource:e.parent}:{}})};import{useState as N,useEffect as _e,useRef as ce}from"react";import{forwardRef as Te,createElement as De}from"react";var q=(...a)=>a.filter((e,t,u)=>!!e&&e.trim()!==""&&u.indexOf(e)===t).join(" ").trim();var Y=a=>a.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var ee=a=>a.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,u)=>u?u.toUpperCase():t.toLowerCase());var V=a=>{let e=ee(a);return e.charAt(0).toUpperCase()+e.slice(1)};import{forwardRef as Be,createElement as oe}from"react";var O={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var ae=a=>{for(let e in a)if(e.startsWith("aria-")||e==="role"||e==="title")return!0;return!1};import{createContext as Fe,useContext as Me,useMemo as za,createElement as Na}from"react";var Ae=Fe({});var te=()=>Me(Ae);var ue=Be(({color:a,size:e,strokeWidth:t,absoluteStrokeWidth:u,className:o="",children:i,iconNode:c,...r},s)=>{let{size:l=24,strokeWidth:d=2,absoluteStrokeWidth:m=!1,color:k="currentColor",className:F=""}=te()??{},H=u??m?Number(t??d)*24/Number(e??l):t??d;return oe("svg",{ref:s,...O,width:e??l??O.width,height:e??l??O.height,stroke:a??k,strokeWidth:H,className:q("lucide",F,o),...!i&&!ae(r)&&{"aria-hidden":"true"},...r},[...c.map(([I,w])=>oe(I,w)),...Array.isArray(i)?i:[i]])});var L=(a,e)=>{let t=Te(({className:u,...o},i)=>De(ue,{ref:i,iconNode:e,className:q(`lucide-${Y(V(a))}`,`lucide-${a}`,u),...o}));return t.displayName=V(a),t};var ye=[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]],A=L("credit-card",ye);var Re=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8",key:"1sqzm4"}],["path",{d:"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5",key:"kc0143"}],["rect",{x:"3",y:"7",width:"18",height:"4",rx:"1",key:"1hberx"}]],B=L("gift",Re);var be=[["path",{d:"M13 5H19V11",key:"1n1gyv"}],["path",{d:"M19 5L5 19",key:"72u4yj"}]],T=L("move-up-right",be);var qe=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],C=L("sparkles",qe);var Oe=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],D=L("x",Oe);import{jsx as v}from"react/jsx-runtime";function de({theme:a}){return a.launcherIcon==="none"?null:a.launcherIcon==="sparkles"?v(C,{size:20}):a.launcherIcon==="credit"?v(A,{size:20}):a.launcherIcon==="arrow"?v(T,{size:20}):v(B,{size:20})}import{useEffect as Ee,useRef as Ge}from"react";var re=a=>{let e,t=new Set,u=(l,d)=>{let m=typeof l=="function"?l(e):l;if(!Object.is(m,e)){let k=e;e=d??(typeof m!="object"||m===null)?m:Object.assign({},e,m),t.forEach(F=>F(e,k))}},o=()=>e,r={setState:u,getState:o,getInitialState:()=>s,subscribe:l=>(t.add(l),()=>t.delete(l))},s=e=a(u,o,r);return r},le=(a=>a?re(a):re);import U from"react";var ve=a=>a;function Ue(a,e=ve){let t=U.useSyncExternalStore(a.subscribe,U.useCallback(()=>e(a.getState()),[a,e]),U.useCallback(()=>e(a.getInitialState()),[a,e]));return U.useDebugValue(t),t}var se=a=>{let e=le(a),t=u=>Ue(e,u);return Object.assign(t,e),t},fe=(a=>a?se(a):se);var n=fe(a=>({isOpen:!1,isFocused:!0,isIdle:!1,available:0,pending:0,mode:"light",token:null,tokenEpoch:0,authStatus:"pending",partnerPayout:null,isAddingPayoutFromAlert:!1,showPayoutSuccess:!1,toggle:()=>a(e=>({isOpen:!e.isOpen})),setOpen:e=>a({isOpen:e}),setFocused:e=>a({isFocused:e}),setIdle:e=>a({isIdle:e}),setBalances:(e,t)=>a({available:e,pending:t}),setMode:e=>a({mode:e}),setToken:e=>a(t=>({token:e,tokenEpoch:t.token===e?t.tokenEpoch:t.tokenEpoch+1,authStatus:e?"authenticated":"pending"})),setPartnerPayout:e=>a({partnerPayout:j(e)}),setIsAddingPayoutFromAlert:e=>a({isAddingPayoutFromAlert:e}),setShowPayoutSuccess:e=>a({showPayoutSuccess:e})}));function ie(){let{setFocused:a,setIdle:e}=n(),t=Ge(null);Ee(()=>{let u=()=>a(!0),o=()=>a(!1),i=()=>{e(!1),t.current&&clearTimeout(t.current),t.current=setTimeout(()=>{e(!0)},6e4)},c=()=>{i()};i(),a(document.hasFocus()),window.addEventListener("focus",u),window.addEventListener("blur",o);let r=["mousemove","keydown","scroll","touchstart","mousedown"];return r.forEach(s=>{window.addEventListener(s,c,s==="scroll"?!0:void 0)}),()=>{window.removeEventListener("focus",u),window.removeEventListener("blur",o),r.forEach(s=>{window.removeEventListener(s,c,s==="scroll"?!0:void 0)}),t.current&&clearTimeout(t.current)}},[a,e])}import{useContext as ze,useEffect as Ne,useRef as Xe}from"react";import{createContext as We}from"react";import{jsx as Ve}from"react/jsx-runtime";var z=We(null),ne=({transport:a,children:e})=>Ve(z.Provider,{value:a,children:e});var y=()=>{let a=ze(z);if(!a)throw new Error("useMessageTransport: no transport in context. Wrap the widget tree in <MessageTransportProvider transport={...}>.");return a},S=(a,e)=>{let t=y(),u=Xe(e);u.current=e,Ne(()=>t.subscribe(o=>{o.type===a&&u.current(o)}),[t,a])};import{Fragment as Ke,jsx as P,jsxs as X}from"react/jsx-runtime";var pe=({children:a,theme:e,hostHeight:t=800,isMobile:u=!1})=>{ie();let{isOpen:o,toggle:i,mode:c}=n(),r=e||h,[s,l]=N(t),[d,m]=N(u),[k,F]=N(void 0),H=r.allowUserThemeControl?{...r,mode:c}:{...r,mode:k??r.mode??"light"},I=Q(H),w=ce(null),E=ce(null),G=y();return S("FRUGA_HOST_RESIZE",f=>{l(f.hostHeight),m(f.isHostMobile)}),S("FRUGA_TOKEN_UPDATE",f=>{n.getState().setToken(f.token)}),S("FRUGA_GET_BALANCE",f=>{let{available:x,pending:M}=n.getState();G.send({type:"FRUGA_BALANCE_RESPONSE",version:"1.0",requestId:f.requestId,available:x,pending:M})}),S("FRUGA_INIT",f=>{l(f.host.height),m(f.host.isMobile),f.token&&n.getState().setToken(f.token),f.overrides?.panelOpen&&n.getState().setOpen(!0);let x=f.overrides?.theme;x&&(F(x),n.getState().setMode(x))}),_e(()=>{if(!w.current)return;let f=()=>{if(!w.current)return;let M=o?450:100;!o&&E.current&&(M=E.current.offsetWidth+40);let Z=o?Math.max(200,s-100):100;d&&o&&(M=window.innerWidth,Z=s),G.send({type:"FRUGA_RESIZE",version:"1.0",height:Z,width:M,isFullscreen:d&&o})},x=new ResizeObserver(()=>f());return x.observe(w.current),f(),()=>x.disconnect()},[o,s,d,G]),X("div",{ref:w,className:I.mode==="dark"?"dark":"",style:{fontFamily:'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',color:I.text,display:"flex",flexDirection:"column",alignItems:"flex-end",justifyContent:"flex-end",padding:d&&o?"0":"20px",boxSizing:"border-box",height:"100%",margin:0,overscrollBehavior:"contain"},children:[o&&P("div",{style:{width:d?"100vw":"410px",minWidth:d?"100vw":"410px",flexShrink:0,maxHeight:d?"100vh":`${Math.max(100,s-100)}px`,height:"100%",marginBottom:d?"0":"20px",backgroundColor:I.accent,borderRadius:d?"0":"16px",boxShadow:d?"none":"0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 0 1px rgba(0,0,0,0.1)",display:"flex",flexDirection:"column",overflow:"hidden",zIndex:9998},children:P("div",{className:"fruga-scrollbar",style:{flex:1,minHeight:0,backgroundColor:I.isLight?"#f9f9f9":"#111",display:"flex",flexDirection:"column",boxShadow:d?"none":"0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 0 1px rgba(0,0,0,0.1)"},children:a})}),X("button",{ref:E,onClick:i,style:{backgroundColor:I.accent,color:I.accentText,border:"none",cursor:"pointer",boxShadow:"0 12px 30px -5px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0,0,0, 0.1)",display:o?"none":"flex",alignItems:"center",justifyContent:"center",zIndex:9999,flexShrink:0,borderRadius:"20px",padding:"10px 16px",transition:"transform 0.3s ease-in-out"},className:"flex h-15 items-center gap-2 rounded-xl px-4 active:scale-[0.99]","aria-label":o?"Close widget":"Open widget",children:[r.launcherLabel&&!o?X(Ke,{children:[r.launcherLabel!=="none"&&P("div",{className:"text-sm font-semibold",children:r.launcherLabel}),P("div",{className:"flex h-6 w-5 shrink-0 items-center justify-center",children:P(de,{theme:I})})]}):null,o?P(D,{}):null]})]})};import{Fragment as oo,jsx as uo}from"react/jsx-runtime";import{useEffect as so,useState as fo}from"react";import{useState as Ze}from"react";import{jsx as _,jsxs as K}from"react/jsx-runtime";var me=({partnerKey:a,theme:e,userId:t})=>{let u=n(d=>d.setToken),[o,i]=Ze(null);S("FRUGA_INIT",d=>{u(d.token??null),i(d)});let c=o?.bootstrap.config.ui,r=o?.overrides,s={...h,primary:r?.primaryColor??c?.accent??e?.primaryColor??h.primary,accent:r?.primaryColor??c?.accent??e?.primaryColor??h.accent,mode:r?.theme??c?.defaultTheme??e?.mode??h.mode},l=r?.userId??t;return _(pe,{theme:s,isMobile:o?.host.isMobile,hostHeight:o?.host.height,children:K("div",{style:{padding:"20px",fontFamily:'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'},children:[_("h2",{style:{marginTop:0},children:l?`Welcome back, ${l}`:"Connect Widget"}),_("p",{children:"This is the Connect widget loaded from the SDK."}),K("p",{children:["Partner Key: ",a]}),l&&K("p",{children:["User Context: ",l]})]})})};var Le="1.3.0";var Ie=Le;import{jsx as R}from"react/jsx-runtime";var Ye=({config:a})=>{let e=y();return xe(()=>{e.send({type:"FRUGA_READY",version:"1.0",protocolVersion:"1.0",widgetVersion:Ie})},[e]),R(me,{...a})},ea=({config:a})=>{let[e,t]=je(null);return xe(()=>{let u=$();return t(u),()=>u.dispose()},[]),e?R(ne,{transport:e,children:R(Ye,{config:a})}):null},aa=(a,e)=>{let t=$e.createRoot(a);return t.render(R(Je.StrictMode,{children:R(ea,{config:e})})),{unmount:()=>{t.unmount()}}},jo={mount:aa};export{jo as default,aa as mount};
2
2
  /*! Bundled license information:
3
3
 
4
4
  lucide-react/dist/esm/shared/src/utils/mergeClasses.js: