PageSourceSearch

https://cashbackstacks.com/_nuxt/CPqp3UJG.js

js cashbackstacks.com collected 2026-10-02 00:51:21 UTC 35,455 bytes, 1 lines download raw bytes

1import{b8 as ze,d as N,b9 as be,ba as ve,bb as ee,o as i,a as O,b as k,V as j,f as e,J as M,m as Y,W as he,bc as ne,c as $,bd as $e,e as u,be as Ie,bf as ge,bg as ie,bh as Me,bi as Ve,r as P,bj as Oe,h as x,g as t,H as te,F as J,j as Q,aB as ye,t as _,aD as _e,n as I,S as Z,l as re,am as xe,i as de,bk as Ae,K as Be,L as Ue,bl as Ee,bm as Pe,bn as Te,M as Ne,G as T,X as ce,Z as ue,bo as le,C as Ge,aZ as De,b4 as Le,ac as me,p as W,bp as Fe,bq as pe,br as je,I as ke,bs as Ke,bt as We,aj as Ye,x as He,A as Xe,B as Ze,U as Je,bu as Qe,k as et,E as tt}from"./B03Hv0XP.js";import{_ as at}from"./Dz4-OvAJ.js";import Ce from"./sVKLN2S_.js";import st from"./bjSbd_Lp.js";import ot from"./8JrEt-oQ.js";import{u as lt}from"./tL1pGFV_.js";import{L as fe}from"./BqY0wNHg.js";import{u as Se}from"./8hQgiiV3.js";import{V as qe}from"./DLD0l_xD.js";import{R as rt}from"./Dl49huN-.js";import{_ as we}from"./BLQUpAxu.js";import dt from"./BtRjvkMM.js";import{g as nt}from"./BwnmOcie.js";import{b as it}from"./Ct1RrZQl.js";import"./CgSr4kdc.js";import ct from"./Dr_Bv2Rf.js";import{i as ut}from"./CaTqJTMz.js";import"./jFYhBC76.js";import"./kRIii9yh.js";import"./TjNT4reZ.js";import"./CkZp6zAD.js";import"./DHTVlAID.js";import"./o81KeIgW.js";import"./CYAWG65o.js";import"./DOJrsyx0.js";import"./va6Sfi9J.js";import"./CZfndVWl.js";import"./BMDCvmvc.js";import"./CSUhsg0Z.js";import"./CBq59kQn.js";import"./CCfLtCpj.js";import"./B_DA8d3V.js";import"./CNZFoi2r.js";import"./DkUv7QSA.js";import"./DGbwkVPd.js";import"./BiTA7Ir4.js";import"./C83IEKOy.js";import"./BA-6w_tE.js";import"./CMBweDAm.js";import"./BCtfhdjq.js";import"./CrL9SBzO.js";const mt="radio.select";function pt(a,d,l){ze(mt,l,{originalEvent:a,value:d})}var ft=N({__name:"Radio",props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},checked:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:checked","select"],setup(a,{emit:d}){const l=a,c=d,r=be(l,"checked",c,{passive:l.checked===void 0}),{value:s}=ve(l),{forwardRef:f,currentElement:v}=ee(),h=Se(v),y=$(()=>l.id&&v.value?document.querySelector(`[for="${l.id}"]`)?.innerText??l.value:void 0);function m(b){l.disabled||pt(b,l.value,S=>{c("select",S),!S?.defaultPrevented&&(r.value=!0,h.value&&S.stopPropagation())})}return(b,S)=>(i(),O(e(ne),Y(b.$attrs,{id:b.id,ref:e(f),role:"radio",type:b.as==="button"?"button":void 0,as:b.as,"aria-checked":e(r),"aria-label":y.value,"as-child":b.asChild,disabled:b.disabled?"":void 0,"data-state":e(r)?"checked":"unchecked","data-disabled":b.disabled?"":void 0,value:e(s),required:b.required,name:b.name,onClick:he(m,["stop"])}),{default:k(()=>[j(b.$slots,"default",{checked:e(r)}),e(h)&&b.name?(i(),O(e(qe),{key:0,type:"radio",tabindex:"-1",value:e(s),checked:!!e(r),name:b.name,disabled:b.disabled,required:b.required},null,8,["value","checked","name","disabled","required"])):M("v-if",!0)]),_:3},16,["id","type","as","aria-checked","aria-label","as-child","disabled","data-state","data-disabled","value","required","name"]))}}),bt=ft;const[vt,ht]=ge("RadioGroupRoot");var gt=N({__name:"RadioGroupRoot",props:{modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},orientation:{type:String,required:!1,default:void 0},dir:{type:String,required:!1},loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1,default:!1}},emits:["update:modelValue"],setup(a,{emit:d}){const l=a,c=d,{forwardRef:r,currentElement:s}=ee(),f=be(l,"modelValue",c,{defaultValue:l.defaultValue,passive:l.modelValue===void 0}),{disabled:v,loop:h,orientation:y,name:m,required:b,dir:S}=ve(l),q=$e(S),n=Se(s);return ht({modelValue:f,changeModelValue:C=>{f.value=C},disabled:v,loop:h,orientation:y,name:m?.value,required:b}),(C,G)=>(i(),O(e(Ie),{"as-child":"",orientation:e(y),dir:e(q),loop:e(h)},{default:k(()=>[u(e(ne),{ref:e(r),role:"radiogroup","data-disabled":e(v)?"":void 0,"as-child":C.asChild,as:C.as,"aria-orientation":e(y),"aria-required":e(b),dir:e(q)},{default:k(()=>[j(C.$slots,"default",{modelValue:e(f)}),e(n)&&e(m)?(i(),O(e(qe),{key:0,required:e(b),disabled:e(v),value:e(f),name:e(m)},null,8,["required","disabled","value","name"])):M("v-if",!0)]),_:3},8,["data-disabled","as-child","as","aria-orientation","aria-required","dir"])]),_:3},8,["orientation","dir","loop"]))}}),yt=gt;const[_t,xt]=ge("RadioGroupItem");var kt=N({inheritAttrs:!1,__name:"RadioGroupItem",props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["select"],setup(a,{emit:d}){const l=a,c=d,{forwardRef:r,currentElement:s}
1=ee(),f=vt(),v=$(()=>f.disabled.value||l.disabled),h=$(()=>f.required.value||l.required),y=$(()=>Ve(f.modelValue?.value,l.value));xt({disabled:v,checked:y});const m=P(!1),b=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"];ie("keydown",q=>{b.includes(q.key)&&(m.value=!0)}),ie("keyup",()=>{m.value=!1});function S(){setTimeout(()=>{m.value&&s.value?.click()},0)}return(q,n)=>(i(),O(e(rt),{checked:y.value,disabled:v.value,"as-child":"",focusable:!v.value,active:y.value},{default:k(()=>[u(bt,Y({...q.$attrs,...l},{ref:e(r),checked:y.value,required:h.value,disabled:v.value,"onUpdate:checked":n[0]||(n[0]=C=>e(f).changeModelValue(q.value)),onSelect:n[1]||(n[1]=C=>c("select",C)),onKeydown:n[2]||(n[2]=Me(he(()=>{},["prevent"]),["enter"])),onFocus:S}),{default:k(()=>[j(q.$slots,"default",{checked:y.value,required:h.value,disabled:v.value})]),_:3},16,["checked","required","disabled"])]),_:3},8,["checked","disabled","focusable","active"]))}}),Ct=kt,St=N({__name:"RadioGroupIndicator",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(a){const{forwardRef:d}=ee(),l=_t();return(c,r)=>(i(),O(e(Oe),{present:c.forceMount||e(l).checked.value},{default:k(()=>[u(e(ne),Y({ref:e(d),"data-state":e(l).checked.value?"checked":"unchecked","data-disabled":e(l).disabled.value?"":void 0,"as-child":c.asChild,as:c.as},c.$attrs),{default:k(()=>[j(c.$slots,"default")]),_:3},16,["data-state","data-disabled","as-child","as"])]),_:3},8,["present"]))}}),qt=St;const wt={class:"store-list-input"},Rt={class:"mb-6"},zt={key:0,class:"space-y-3"},$t={class:"flex-1 min-w-0"},It={class:"font-medium text-highlighted truncate"},Mt={class:"flex items-center gap-1.5"},Vt=["onClick"],Ot={class:"flex items-center justify-between pt-3 border-t border-default"},At=N({__name:"StoreListInput",props:{stores:{},totalMonthlySpend:{}},emits:["add-store","remove-store","update-spending"],setup(a,{emit:d}){const l=d,c=P(!1),{searchTerm:r,searchPending:s,groups:f}=lt({limit:20,onSelect:y=>{y.domain&&(l("add-store",{domain:y.domain,name:y.name,slug:y.slug,monthlySpend:100}),r.value="")}});function v(y){l("remove-store",y)}function h(y,m){l("update-spending",y,m)}return(y,m)=>{const b=te,S=ye,q=at,n=_e,C=Ce,G=st,B=ot,V=xe;return i(),x("div",wt,[t("div",Rt,[m[4]||(m[4]=t("label",{class:"block text-sm font-medium text-toned mb-2"}," Add stores you shop at ",-1)),t("button",{class:"w-full flex items-center gap-3 px-4 py-3 rounded-lg border border-accented bg-default hover:border-accented transition-colors",onClick:m[0]||(m[0]=w=>c.value=!0)},[u(b,{name:"i-lucide-search",class:"size-5 text-muted"}),m[3]||(m[3]=t("span",{class:"text-muted"},"Search for a store...",-1))])]),a.stores.length>0?(i(),x("div",zt,[(i(!0),x(J,null,Q(a.stores,w=>(i(),x("div",{key:w.domain,class:"flex items-center gap-4 p-4 rounded-lg border border-default bg-default"},[u(S,{"store-name":w.name,"store-domain":w.domain,size:"lg"},null,8,["store-name","store-domain"]),t("div",$t,[t("p",It,_(w.name),1)]),t("div",Mt,[u(q,{"model-value":w.monthlySpend,min:0,step:10,placeholder:"0",size:"sm",increment:!1,decrement:!1,"format-options":{style:"currency",currency:"USD",currencyDisplay:"symbol",maximumFractionDigits:0},class:"w-28","onUpdate:modelValue":D=>h(w.domain,D??0)},null,8,["model-value","onUpdate:modelValue"]),m[5]||(m[5]=t("span",{class:"text-sm text-muted"},"/mo",-1))]),u(n,{text:`Remove ${w.name}`},{default:k(()=>[t("button",{class:"p-2 rounded-lg text-muted hover:text-error-600 dark:hover:text-error-400 hover:bg-error-50 dark:hover:bg-error-950/30 transition-colors",onClick:D=>v(w.domain)},[u(b,{name:"i-lucide-x",class:"size-4.5"})],8,Vt)]),_:2},1032,["text"])]))),128)),t("div",Ot,[m[6]||(m[6]=t("span",{class:"text-sm font-medium text-toned"}," Total Monthly Spend ",-1)),t("span",{class:I(e(Z))}," $"+_(e(re)(a.totalMonthlySpend)),3)])])):(i(),O(C,{key:1,icon:"cart",title:"No stores added",description:"Add stores to get started"})),u(V,null,{default:k(()=>[u(B,{open:e(c),"onUpdate:open":m[1]||(m[1]=w=>de(c)?c.value=w:null),"search-term":e(r),"onUpdate:searchTerm":m[2]||(m[2]=w=>de(r)?r.value=w:null),groups:e(f),placeholder:"Search stores...","color-mode":!1},{"item-leading":k(({item:w})=>[u(S,{"store-name":w.label||"","store-domain":w.domain||null,size:"lg"},null,8,["store-name","store-domain"])]),empty:k(()=>[u(G,{"search-term":e(r),loading:e(s),"idle-text":"Search for stores to add to your list"},null,8,["search-term","loading"])]),_:1},8,["open","search-term","groups"])]),_:1})])}}}),Bt=Object.assign(At,{__name:"StoreListInput"}),Ut={slots:{root:"relative",fieldset:"flex gap-x-2",legend:"mb-1 block font-medium text-default",item:"flex items-start",container:"flex items-center",base:"rounded-full ring ring-inset ring-accented overflow-hidden focu
1s-visible:outline-2 focus-visible:outline-offset-2",indicator:"flex items-center justify-center size-full after:bg-default after:rounded-full",wrapper:"w-full",label:"block font-medium text-default",description:"text-muted"},variants:{color:{primary:{base:"focus-visible:outline-primary",indicator:"bg-primary"},secondary:{base:"focus-visible:outline-secondary",indicator:"bg-secondary"},success:{base:"focus-visible:outline-success",indicator:"bg-success"},info:{base:"focus-visible:outline-info",indicator:"bg-info"},warning:{base:"focus-visible:outline-warning",indicator:"bg-warning"},error:{base:"focus-visible:outline-error",indicator:"bg-error"},neutral:{base:"focus-visible:outline-inverted",indicator:"bg-inverted"}},variant:{list:{item:""},card:{item:"border border-muted rounded-lg"},table:{item:"border border-muted"}},orientation:{horizontal:{fieldset:"flex-row"},vertical:{fieldset:"flex-col"}},indicator:{start:{item:"flex-row",wrapper:"ms-2"},end:{item:"flex-row-reverse",wrapper:"me-2"},hidden:{base:"sr-only",wrapper:"text-center"}},size:{xs:{fieldset:"gap-y-0.5",legend:"text-xs",base:"size-3",item:"text-xs",container:"h-4",indicator:"after:size-1"},sm:{fieldset:"gap-y-0.5",legend:"text-xs",base:"size-3.5",item:"text-xs",container:"h-4",indicator:"after:size-1"},md:{fieldset:"gap-y-1",legend:"text-sm",base:"size-4",item:"text-sm",container:"h-5",indicator:"after:size-1.5"},lg:{fieldset:"gap-y-1",legend:"text-sm",base:"size-4.5",item:"text-sm",container:"h-5",indicator:"after:size-1.5"},xl:{fieldset:"gap-y-1.5",legend:"text-base",base:"size-5",item:"text-base",container:"h-6",indicator:"after:size-2"}},highlight:{true:""},disabled:{true:{item:"opacity-75",base:"cursor-not-allowed",label:"cursor-not-allowed",description:"cursor-not-allowed"}},required:{true:{legend:"after:content-['*'] after:ms-0.5 after:text-error"}}},compoundVariants:[{size:"xs",variant:["card","table"],class:{item:"p-2.5"}},{size:"sm",variant:["card","table"],class:{item:"p-3"}},{size:"md",variant:["card","table"],class:{item:"p-3.5"}},{size:"lg",variant:["card","table"],class:{item:"p-4"}},{size:"xl",variant:["card","table"],class:{item:"p-4.5"}},{orientation:"horizontal",variant:"table",class:{item:"first-of-type:rounded-s-lg last-of-type:rounded-e-lg",fieldset:"gap-0 -space-x-px"}},{orientation:"vertical",variant:"table",class:{item:"first-of-type:rounded-t-lg last-of-type:rounded-b-lg",fieldset:"gap-0 -space-y-px"}},{color:"primary",variant:"card",class:{item:"has-data-[state=checked]:border-primary"}},{color:"secondary",variant:"card",class:{item:"has-data-[state=checked]:border-secondary"}},{color:"success",variant:"card",class:{item:"has-data-[state=checked]:border-success"}},{color:"info",variant:"card",class:{item:"has-data-[state=checked]:border-info"}},{color:"warning",variant:"card",class:{item:"has-data-[state=checked]:border-warning"}},{color:"error",variant:"card",class:{item:"has-data-[state=checked]:border-error"}},{color:"neutral",variant:"card",class:{item:"has-data-[state=checked]:border-inverted"}},{color:"primary",variant:"table",class:{item:"has-data-[state=checked]:bg-primary/10 has-data-[state=checked]:border-primary/50 has-data-[state=checked]:z-[1]"}},{color:"secondary",variant:"table",class:{item:"has-data-[state=checked]:bg-secondary/10 has-data-[state=checked]:border-secondary/50 has-data-[state=checked]:z-[1]"}},{color:"success",variant:"table",class:{item:"has-data-[state=checked]:bg-success/10 has-data-[state=checked]:border-success/50 has-data-[state=checked]:z-[1]"}},{color:"info",variant:"table",class:{item:"has-data-[state=checked]:bg-info/10 has-data-[state=checked]:border-info/50 has-data-[state=checked]:z-[1]"}},{color:"warning",variant:"table",class:{item:"has-data-[state=checked]:bg-warning/10 has-data-[state=checked]:border-warning/50 has-data-[state=checked]:z-[1]"}},{color:"error",variant:"table",class:{item:"has-data-[state=checked]:bg-error/10 has-data-[state=checked]:border-error/50 has-data-[state=checked]:z-[1]"}},{color:"neutral",variant:"table",class:{item:"has-data-[state=checked]:bg-elevated has-data-[state=checked]:border-inverted/50 has-data-[state=checked]:z-[1]"}},{variant:["card","table"],disabled:!0,class:{item:"cursor-not-allowed"}},{color:"primary",highlight:!0,class:{base:"ring-primary"}}
1,{color:"secondary",highlight:!0,class:{base:"ring-secondary"}},{color:"success",highlight:!0,class:{base:"ring-success"}},{color:"info",highlight:!0,class:{base:"ring-info"}},{color:"warning",highlight:!0,class:{base:"ring-warning"}},{color:"error",highlight:!0,class:{base:"ring-error"}},{color:"neutral",highlight:!0,class:{base:"ring-inverted"}}],defaultVariants:{size:"md",color:"primary",variant:"list",indicator:"start"}},Et={__name:"URadioGroup",props:{as:{type:null,required:!1},legend:{type:String,required:!1},valueKey:{type:null,required:!1,default:"value"},labelKey:{type:null,required:!1,default:"label"},descriptionKey:{type:null,required:!1,default:"description"},items:{type:null,required:!1},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},size:{type:null,required:!1},variant:{type:null,required:!1},color:{type:null,required:!1},highlight:{type:Boolean,required:!1},orientation:{type:null,required:!1,default:"vertical"},indicator:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},disabled:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["change","update:modelValue"],setup(a,{emit:d}){const l=a,c=d,r=Ae(),s=Be("radioGroup",l),f=Ue(),v=Ee(Pe(s,"as","loop","required"),c),{emitFormChange:h,emitFormInput:y,color:m,name:b,size:S,highlight:q,id:n,disabled:C,ariaAttrs:G}=Te(l,{bind:!1}),B=n.value??Ne(),V=$(()=>ue({extend:ue(Ut),...f.ui?.radioGroup||{}})({size:S.value??s.size,color:m.value??s.color,highlight:q.value??s.highlight,disabled:C.value,required:s.required,orientation:s.orientation,variant:s.variant,indicator:s.indicator}));function w(z){if(z===null)return{id:`${B}:null`,value:void 0,label:void 0};if(typeof z=="string"||typeof z=="number"||typeof z=="bigint")return{id:`${B}:${z}`,value:String(z),label:String(z)};const E=le(z,s.valueKey),g=le(z,s.labelKey),L=le(z,s.descriptionKey);return{...z,value:E,label:g,description:L,id:`${B}:${E}`}}const D=$(()=>s.items?s.items.map(w):[]);function K(z){const E=new Event("change",{target:{value:z}});c("change",E),h(),y()}return(z,E)=>(i(),O(e(yt),Y({id:e(B)},e(v),{"model-value":e(s).modelValue,"default-value":e(s).defaultValue,orientation:e(s).orientation,name:e(b),disabled:e(C),"data-slot":"root",class:V.value.root({class:[e(s).ui?.root,e(s).class]}),"onUpdate:modelValue":K}),{default:k(()=>[t("fieldset",Y({"data-slot":"fieldset",class:V.value.fieldset({class:e(s).ui?.fieldset})},e(G)),[e(s).legend||r.legend?(i(),x("legend",{key:0,"data-slot":"legend",class:I(V.value.legend({class:e(s).ui?.legend}))},[j(z.$slots,"legend",{},()=>[T(_(e(s).legend),1)])],2)):M("",!0),(i(!0),x(J,null,Q(D.value,g=>(i(),O(ce(!e(s).variant||e(s).variant==="list"?"div":e(fe)),{key:g.value,"data-slot":"item",class:I(V.value.item({class:[e(s).ui?.item,g.ui?.item,g.class],disabled:g.disabled||e(C)}))},{default:k(()=>[t("div",{"data-slot":"container",class:I(V.value.container({class:[e(s).ui?.container,g.ui?.container]}))},[u(e(Ct),{id:g.id,value:g.value,disabled:g.disabled||e(C),"data-slot":"base",class:I(V.value.base({class:[e(s).ui?.base,g.ui?.base],disabled:g.disabled||e(C)}))},{default:k(()=>[u(e(qt),{"data-slot":"indicator",class:I(V.value.indicator({class:[e(s).ui?.indicator,g.ui?.indicator]}))},null,8,["class"])]),_:2},1032,["id","value","disabled","class"])],2),g.label||r.label||g.description||r.description?(i(),x("div",{key:0,"data-slot":"wrapper",class:I(V.value.wrapper({class:[e(s).ui?.wrapper,g.ui?.wrapper]}))},[g.label||r.label?(i(),O(ce(!e(s).variant||e(s).variant==="list"?e(fe):"p"),{key:0,for:g.id,"data-slot":"label",class:I(V.value.label({class:[e(s).ui?.label,g.ui?.label],disabled:g.disabled||e(C)}))},{default:k(()=>[j(z.$slots,"label",{item:g,modelValue:e(s).modelValue},()=>[T(_(g.label),1)])]),_:2},1032,["for","class"])):M("",!0),g.description||r.description?(i(),x("p",{key:1,"data-slot":"description",class:I(V.value.description({class:[e(s).ui?.description,g.ui?.description],disabled:g.disabled||e(C)}))},[j(z.$slots,"description",{item:g,modelValue:e(s).modelValue},()=>[T(_(g.description),1)])],2)):M("",!0)],2)):M("",!0)]),_:2},1032,["class"]))),128))],16)]),_:3},16,["id","model-value","default-value","orientation","name","disabled","class"]))}},Pt={class:"optimization-controls space-y-4"},Tt={class:"flex items-center justify-between gap-4 flex-wrap"},Nt={class:"flex items-center gap-3"},Gt={key:0,class:"text-xs text-muted"},Dt={key:0,class:"text-sm text-muted"},Lt=N({__name:"OptimizationControls",props:{maxCards:{},canOptimize:{type:Boolean},mode:{},maxCardsDisabled:{type:Boolean,default:!1},calculating:{type:Boolean,default:!1},needsRecalculation:{type:Boolean,default:!0}},emits:["update:max-cards","update:mode","calculate"],setup(a,{emit:d}){const l=a,c=d,r=[{label:"Greedy (Fewer Cards)",description:"Stops when adding cards doesn't improve much",value:"greedy"},{label:"Maximize Cashback",description:"Use up to N cards for highest returns",value:"maximize"}],s=[{value:1,label:"1 card"},{value:2,label:"2 cards"},{value:3,label:"3 cards"},{value:4,label:"4 cards"},{value:5,label:"5 cards"}],f=$({get:()=>l.maxCards,set:v=>c("update:max-cards",v)});return(v,h)=>{const y=Et,m=we,b=te,S=Ge;return i(),x("div",Pt,[u(y,{"model-value":a.mode,items:r,legend:"Optimization Strategy",orientation:"horizontal",variant:"card","onUpdate:modelValue":h[0]||(h[0]=q=>v.$emit("update:mode",q))},null,8,["model-value"]),t("div",Tt,[t("div",Nt,[t("label",{for:"max-cards",class:I(["text-sm font-medium",a.maxCardsDisabled?"text-dimmed":"text-toned"])}," Maximum cards: ",2),u(m,{id:"max-cards",modelValue:e(f),"onUpdate:modelValue":h[1]||(h[1]=q=>de(f)?f.value=q:null),items:s,"label-key":"label","value-key":"value",size:"sm",class:"w-28",disabled:a.maxCardsDisabled},null,8,["modelValue","disabled"]),a.maxCardsDisabled?(i(),x("span",Gt," (auto) ")):M("",!0)]),u(S,{color:"primary",size:"lg",disabled:!a.canOptimize,loading:a.calculating,onClick:h[2]||(h[2]=q=>v.$emit("calculate"))},De({default:k(()=>[T(" "+_(a.calculating?"Calculating...":a.needsRecalculation?"Calculate Portfolio":"Recalculate"),1)]),_:2},[a.calculating?void 0:{name:"leading",fn:k(()=>[u(b,{name:"i-lucide-sparkles",class:"size-4.5"})]),key:"0"}]),1032,["disabled","loading"])]),!a.canOptimize&&!a.calculating?(i(),x("p",Dt," Add at least one store to get recommendations ")):M("",!0)])}}}),Ft=Object.assign(Lt,{__name:"OptimizationControls"}),jt={class:"portfolio-results"},Kt={key:0,class:"grid grid-cols-1 sm:grid-cols-3 gap-4 mb-8"},Wt={class:"p-4 rounded-lg bg-success-50 dark:bg-success-950/30 border border-success-200 dark:border-success-900/50"},Yt={class:"flex items-center gap-2 mb-1"},Ht={class:"p-4 rounded-lg bg-primary-50 dark:bg-primary-950/30 border border-primary-200 dark:border-primary-900/50"},Xt={class:"flex items-center gap-2 mb-1"},Zt={class:"p-4 rounded-lg bg-muted/50 border border-default"},Jt={class:"flex items-center gap-2 mb-1"},Qt={class:"text-2xl font-bold text-highlighted tabular-nums"},ea={class:"text-xs text-muted"},ta={class:"flex items-center gap-2 mb-4"},aa={class:"flex flex-wrap gap-3"},sa={class:"w-12 h-8 rounded overflow-hidden bg-elevated shadow-sm"},oa={key:2,class:"space-y-3"},la={class:"flex items-center gap-3 flex-wrap"},ra={class:"flex items-center gap-3 flex-1 min-w-[140px]"},da={class:"font-medium text-highlighted"},na={class:"text-xs text-muted"},ia={class:"flex flex-col gap-1"},ca={class:"min-w-[180px]"},ua={class:"w-5 h-3 rounded overflow-hidden bg-elevated"},ma={key:1,class:"flex items-center gap-2 px-2 py-1.5 rounded bg-muted border border-default"},pa={class:"w-5 h-3 rounded overflow-hidden bg-elevated flex-shrink-0"},fa={class:"text-xs text-toned truncate"},ba={key:2,class:"px-2 py-1.5 rounded bg-elevated text-xs text-muted"},va={class:"text-right min-w-[80px]"},ha={class:"text-xs text-muted"},ga={key:0,class:"mt-2 text-xs text-muted"},ya=N({__name:"PortfolioResults",props:{resolvedStores:{},selectedCards:{},totalMonthlyCashback:{},totalMonthlySpend:{},coverageScore:{},storeCount:{},hasResults:{type:Boolean}},emits:["selectCard"],setup(a,{emit:d}){const l=d;return(c,r)=>{const s=te,f=ke,v=dt,h=Ye,y=ye,m=we,b=_e,S=Le("ArrowLeftRight"),q=Ce;return i(),x("div",jt,[a.hasResults?(i(),x("div",Kt,[t("div",Wt,[t("div",Yt,[u(s,{name:"i-lucide-target",class:I(["size-4",e(me)])},null,8,["class"]),r[0]||(r[0]=t("span",{class:"text-sm font-medium text-success-700 dark:text-success-300"}," Coverage ",-1))]),t("p",{class:I(["text-2xl font-bold tabular-nums",e(me)])},_(e(W)(a.coverageScore)),3),r[1]||(r[1]=t("p",{class:"text-xs text-success-600/80 dark:text-success-400/80"}," of spending optimized ",-1))]),t("div",Ht,[t("div",Xt,[u(s,{name:"i-lucide-dollar-sign",class:"size-4 text-primary"}),r[2]||(r[2]=t("span",{class:"text-sm font-medium text-primary"}," Monthly Savings ",-1))]),t("p",{class:I([e(Fe),"tabular-nums"])}," $"+_(e(pe)(a.totalMonthlyCashback)),3),r[3]||(r[3]=t("p",{class:"text-xs text-primary/80"}," per month ",-1))]),t("div",Zt,[t("div",Jt,[u(s,{name:"i-lucide-trending-up",class:"size-4 text-muted"}),r[4]||(r[4]=t("span",{class:"text-sm font-medium text-toned"}," Monthly Spend ",-1))]),t("p",Qt," $"+_(e(re)(a.totalMonthlySpend)),1),t("p",ea," across "+_(a.storeCount)+" stores ",1)])])):M("",!0),a.hasResults?(i(),x("div",{key:1,class:I([e(je),"mb-8 p-5 rounded-xl border border-primary-200 dark:border-primary-800"])},[t("div",ta,[u(s,{name:"i-lucide-wallet",class:"size-5 text-primary"}),r[5]||(r[5]=t("h3",{class:"text-base font-semibold text-highlighted"}," Suggested Credit Card Portfolio ",-1)),u(f,{color:"primary",variant:"soft",size:"sm"},{default:k(()=>[T(_(a.selectedCards.length)+" card"+_(a.selectedCards.length!==1?"s":""),1)]),_:1})]),t("div",aa,[(i(!0),x(J,null,Q(a.selectedCards,n=>(i(),x("div",{key:n.cardId,class:"inline-flex items-center gap-3 px-4 py-2.5 rounded-lg bg-default border border-primary-200 dark:border-primary-700 shadow-sm hover:shadow-md transition-shadow"},[t("div",sa,[u(v,{"card-id":n.cardId,alt:n.displayName},null,8,["card-id","alt"])]),u(h,{to:("cardPath"in c?c.cardPath:e(We))(e(nt)(n)),class:I(["text-sm font-semibold text-highlighted",e(Ke)])},{default:k(()=>[T(_(n.displayName),1)]),_:2},1032,["to","class"])]))),128))])],2)):M("",!0),a.hasResults?(i(),x("div",oa,[r[6]||(r[6]=t("h3",{class:"text-sm font-medium text-toned mb-1"}," Store Assignments ",-1)),(i(!0),x(J,null,Q(a.resolvedStores,n=>(i(),x("div",{key:n.domain,class:"p-4 rounded-lg border border-default bg-default"},[t("div",la,[t("div",ra,[u(y,{"store-name":n.name,"store-domain":n.domain,size:"sm"},null,8,["store-name","store-domain"]),t("div",null,[t("p",da,_(n.name),1),t("p",na," $"+_(e(re)(n.monthlySpend))+"/mo ",1)])]),t("div",ia,[t("div",ca,[n.hasMultipleOptions?(i(),O(m,{key:0,"model-value":n.selectedCardId,items:n.cardSelectItems,"value-key":"value",size:"sm",class:"w-full","onUpdate:modelValue":C=>l("selectCard",n.domain,C)},{leading:k(()=>[t("div",ua,[n.selectedCard?(i(),O(v,{key:0,"card-id":n.selectedCard.cardId,alt:n.selectedCard.displayName},null,8,["card-id","alt"])):M("",!0)])]),_:2},1032,["model-value","items","onUpdate:modelValue"])):n.selectedCard?(i(),x("div",ma,[t("div",pa,[u(v,{"card-id":n.selectedCard.cardId,alt:n.selectedCard.displayName},null,8,["card-id","alt"])]),t("span",fa,_(n.selectedCard.displayName),1)])):(i(),x("div",ba," No matching cards "))]),n.selectedCategory?(i(),O(f,{key:0,color:n.isBaseRate?"neutral":"primary",variant:"soft",size:"sm",class:"self
1-start"},{default:k(()=>[T(_(n.selectedCategory),1)]),_:2},1032,["color"])):M("",!0)]),t("div",va,[u(b,{text:n.rateTooltip},{default:k(()=>[t("span",{class:I(["text-lg font-bold tabular-nums",n.isBaseRate?"text-muted":"text-purple-600 dark:text-purple-400"])},_(e(W)(n.selectedRate)),3)]),_:2},1032,["text"]),t("p",ha," $"+_(e(pe)(n.monthlyCashback))+"/mo ",1)])]),n.hasMultipleOptions?(i(),x("p",ga,[u(S,{size:12,class:"inline mr-1"}),T(" "+_(n.equivalentCards.length)+" cards with "+_(n.rateRangeText)+" — swap to your preference ",1)])):M("",!0)]))),128))])):M("",!0),a.hasResults?M("",!0):(i(),O(q,{key:3,icon:"i-lucide-sparkles",title:"Add stores to see recommendations",description:"We'll find the best credit cards for your shopping habits"}))])}}}),_a=Object.assign(ya,{__name:"PortfolioResults"});function xa(a){return a?it(a.rate,a.cashEquivalentRate).tooltip:void 0}function ka(a){if(a.length===0)return"";const d=a.map(r=>r.cashEquivalentRate),l=Math.min(...d),c=Math.max(...d);return Math.abs(c-l)<.05?`${W(c)} rate`:`${W(l)} - ${W(c)} rates`}function Ca(a){return a.map(d=>({label:d.displayName,value:d.cardId}))}function Sa(a,d){return a.equivalentCards.find(l=>l.cardId===d)||a.equivalentCards[0]}const X={stores:[],totalMonthlySpend:0,mode:"greedy",recommendedCardCount:0};function qa(){const a=P([]),d=Je({}),l=P("greedy"),c=P(3),r=P(!1),s=P(!1),f=P(X),v=P(null),h=$(()=>f.value.stores.map(o=>{const p=d[o.slug]||o.selectedCardId,R=Sa(o,p),A=R?.cashEquivalentRate??o.bestRate,H=A/100*o.monthlySpend;return{domain:o.domain??"",name:o.name,slug:o.slug,monthlySpend:o.monthlySpend,selectedCardId:p,selectedCard:R??null,selectedRate:A,selectedCategory:R?.category??"",isBaseRate:R?.isBaseRate??!1,monthlyCashback:H,rateTooltip:xa(R),equivalentCards:o.equivalentCards,hasMultipleOptions:o.equivalentCards.length>1,rateRangeText:ka(o.equivalentCards),cardSelectItems:Ca(o.equivalentCards)}})),y=$(()=>{const o=new Map;for(const p of h.value)p.selectedCard&&o.set(p.selectedCard.cardId,p.selectedCard);return Array.from(o.values())}),m=$(()=>h.value.reduce((o,p)=>o+p.monthlyCashback*12,0)),b=$(()=>h.value.reduce((o,p)=>o+p.monthlyCashback,0)),S=$(()=>{const o=f.value.totalMonthlySpend;if(o===0)return 0;const p=h.value.filter(R=>R.selectedCard).reduce((R,A)=>R+A.monthlySpend,0);return Math.round(p/o*100)}),q=$(()=>a.value.reduce((o,p)=>o+p.monthlySpend,0)),n=$(()=>f.value.recommendedCardCount),C=$(()=>l.value==="greedy"),G=$(()=>!1),B=$(()=>a.value.length>0&&!r.value),V=$(()=>a.value.length>0&&!s.value),w=$(()=>h.value.some(o=>o.equivalentCards.length>0));async function D(){if(a.value.length===0){f.value=X,s.value=!1;return}r.value=!0,v.value=null;try{const o=await $fetch(Xe.optimizePortfolio,{method:"POST",body:{stores:a.value.map(p=>({slug:p.slug,spending:p.monthlySpend})),options:{mode:l.value,maxCards:l.value==="maximize"?c.value:void 0}}});f.value=o,s.value=!0;for(const p in d)delete d[p]}catch(o){v.value=o,console.error("[useMultiStoreOptimizer] Optimization failed:",Ze(o))}finally{r.value=!1}}function K(o){a.value.some(p=>p.domain===o.domain)||(a.value.push(o),s.value=!1)}function z(o){const p=a.value.find(A=>A.domain===o),R=a.value.findIndex(A=>A.domain===o);R!==-1&&(a.value.splice(R,1),p&&delete d[p.slug],s.value=!1)}function E(o,p){const R=a.value.find(A=>A.domain===o);R&&(R.monthlySpend=Math.max(0,p),s.value=!1)}function g(o,p){const R=a.value.find(F=>F.domain===o);if(!R)return;const A=f.value.stores.find(F=>F.slug===R.slug);if(!A){d[R.slug]=p;return}const H=d[R.slug]||A.selectedCardId;if(H!==p)for(const F of f.value.stores)(d[F.slug]||F.selectedCardId)===H&&F.equivalentCards.some(Re=>Re.cardId===p)&&(d[F.slug]=p)}function L(o){const p=a.value.find(R=>R.domain===o);p&&delete d[p.slug]}function U(){a.value=[];for(const o in d)delete d[o];f.value=X,s.value=!1}function ae(){for(const o in d)delete d[o]}function se(o){l.value=o,s.value=!1}function oe(o){c.value=Math.max(1,Math.min(5,o)),l.value==="maximize"&&(s.value=!1)}return He(()=>a.value.length,o=>{o===0&&(f.value=X,s.value=!1)}),{stores:a,mode:l,maxCards:c,calculating:r,hasCalculated:s,pending:G,resolvedStores:h,selectedCards:y,totalAnnualCashback:m,totalMonthlyCashback:b,coverageScore:S,totalMonthlySpend:q,recommendedCardCount:n,hasResults:w,maxCardsDisabled:C,canOptimize:B,needsRecalculation:V,addStore:K,removeStore:z,updateSpending:E,selectCard:g,resetCardSelection:L,clearStores:U,resetAllSelections:ae,setMode:se,setMaxCards:oe,calculate:D}}const wa={class:"multi-store-optimizer-widget"},Ra={class:"grid lg:grid-cols-2 gap-8"},za={class:"p-6 rounded-xl border border-default bg-default"},$a={class:"mt-6 pt-6 border-t border-default"},Ia={class:"p-6 rounded-xl border border-default bg-default"},Ma={class:"flex items-center justify-between mb-6"},Va={key:0,class:"text-center py-12"},Oa={key:1,class:"text-center py-12"},Aa={class:"text-sm text-muted"},Ba={key:3,class:"text-center py-12 px-4"},Ua={class:"text-sm text-muted"},Ea={key:4,class:"mt-6 p-4 rounded-lg bg-amber-50 dark:bg-amber-950/30 border border-amber-200 dark:border-amber-900/50"},Pa={class:"flex items-start gap-3"},Ta={class:"text-sm text-amber-700 dark:text-amber-300"},Na=N({__name:"MultiStoreOptimizerWidget",setup(a){const{stores:d,mode:l,maxCards:c,calculating:r,hasCalculated:s,pending:f,resolvedStores:v,selectedCards:h,totalMonthlyCashback:y,totalMonthlySpend:m,coverageScore:b,recommendedCardCount:S,hasResults:q,maxCardsDisabled:n,canOptimize:C,needsRecalculation:G,addStore:B,removeStore:V,updateSpending:w,selectCard:D,setMode:K,setMaxCards:z,calculate:E}=qa(),g=$(()=>v.value.filter(L=>L.equivalentCards.length===0).map(L=>L.name));return(L,U)=>{const ae=Bt,se=Ft,oe=ke,o=_a,p=te;return i(),x("div",wa,[t("div",Ra,[t("div",za,[t("h2",{class:I([e(Z),"mb-4"])}," 1. Select Your Stores ",2),u(ae,{stores:e(d),"total-monthly-spend":e(m),onAddStore:e(B),onRemoveStore:e(V),onUpdateSpending:e(w)},null,8,["stores","total-monthly-spend","onAddStore","onRemoveStore","onUpdateSpending"]),t("div",$a,[u(se,{"max-cards":e(c),mode:e(l),"can-optimize":e(C),"max-cards-disabled":e(n),calculating:e(r),"needs-recalculation":e(G),"onUpdate:maxCards":e(z),"onUpdate:mode":e(K),onCalculate:e(E)},null,8,["max-cards","mode","can-optimize","max-cards-disabled","calculating","needs-recalculation","onUpdate:maxCards","onUpdate:mode","onCalculate"])])]),t("div",Ia,[t("div",Ma,[t("h2",{class:I(e(Z))}," 2. Your Optimal Portfolio ",2),e(s)&&e(S)>0?(i(),O(oe,{key:0,color:"primary",variant:"soft"},{default:k(()=>[T(_(e(l)==="greedy"?"Greedy":"Maximize")+" • "+_(e(S))+" card"+_(e(S)!==1?"s":""),1)]),_:1}
1)):M("",!0)]),e(f)?(i(),x("div",Va,[...U[0]||(U[0]=[t("div",{class:"animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto mb-4"},null,-1),t("p",{class:"text-sm text-muted"}," Loading card data... ",-1)])])):e(r)?(i(),x("div",Oa,[U[1]||(U[1]=t("div",{class:"animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto mb-4"},null,-1)),t("p",Aa," Analyzing "+_(e(d).length)+" store"+_(e(d).length!==1?"s":"")+"... ",1)])):e(s)?(i(),O(o,{key:2,"resolved-stores":e(v),"selected-cards":e(h),"total-monthly-cashback":e(y),"total-monthly-spend":e(m),"coverage-score":e(b),"store-count":e(d).length,"has-results":e(q),onSelectCard:e(D)},null,8,["resolved-stores","selected-cards","total-monthly-cashback","total-monthly-spend","coverage-score","store-count","has-results","onSelectCard"])):(i(),x("div",Ba,[u(p,{name:"i-lucide-calculator",class:"size-12 mx-auto text-dimmed mb-4"}),t("h2",{class:I([e(Z),"mb-2"])},_(e(d).length>0?"Ready to optimize":"Add stores to get started"),3),t("p",Ua,_(e(d).length>0?'Click "Calculate Portfolio" to find your optimal cards':"Add stores and their monthly spend to get recommendations"),1)])),e(s)&&e(g).length>0?(i(),x("div",Ea,[t("div",Pa,[u(p,{name:"i-lucide-alert-triangle",class:"size-5 text-amber-600 dark:text-amber-400 flex-shrink-0 mt-0.5"}),t("div",null,[U[2]||(U[2]=t("p",{class:"text-sm font-medium text-amber-900 dark:text-amber-200 mb-1"}," No coverage for: ",-1)),t("p",Ta,_(e(g).join(", ")),1),U[3]||(U[3]=t("p",{class:"text-xs text-amber-600 dark:text-amber-400 mt-1"}," No cards in our database match these stores ",-1))])])])):M("",!0)])])])}}}),Ga=Object.assign(Na,{__name:"MultiStoreOptimizerWidget"}),Da={class:"mt-16 text-center"},Vs=N({__name:"portfolio-optimizer",setup(a){const d=[{number:"1",label:"Add Your Stores",description:"Select the stores where you shop most frequently, set your approximate monthly spending, and choose how many credit cards you want to manage.",color:"indigo"},{number:"2",label:"Get Recommendations",description:"Our algorithm finds the best card combination to maximize your cashback across all stores. See your coverage score and projected savings.",color:"emerald"}];return ut(),(l,c)=>{const r=Ga,s=xe,f=ct,v=et,h=Qe;return i(),x("div",null,[u(h,{class:"py-12 md:py-16"},{default:k(()=>[c[2]||(c[2]=t("div",{class:"text-center mb-16"},[t("h1",{class:"text-4xl md:text-5xl font-bold tracking-tight text-highlighted mb-5"}," Portfolio Optimizer "),t("p",{class:"text-base leading-relaxed text-muted max-w-2xl mx-auto"}," Select the stores you shop at most, and we'll recommend the optimal credit card portfolio to maximize your cashback across all your purchases. ")],-1)),u(s,null,{fallback:k(()=>[...c[0]||(c[0]=[t("div",{class:"animate-pulse bg-elevated rounded-2xl h-96"},null,-1)])]),default:k(()=>[u(r)]),_:1}),u(f,{title:"How It Works",steps:d}),t("div",Da,[c[1]||(c[1]=t("p",{class:"text-sm leading-relaxed text-muted mb-5"}," Want to track these cards and see real-time rates while you shop? ",-1)),u(v,{color:"primary",size:"md",label:e(tt),class:"active:scale-[0.98] transition-transform duration-fast"},null,8,["label"])])]),_:1})])}}});export{Vs as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.