1import{_ as oe}from"./BfNQs6Go.js";import{d as H,h as t,f as i,i as a,m as w,v as _,t as v,q as ne,F as J,l as x,o as l,n as N,j as re,k as q,_ as X,b as le,s as R,e as de,x as ie,y as ue,g as y,p}from"./CWXzWxAq.js";import{c as ce,p as me,g as fe}from"./DQSuM1Xs.js";import{_ as be}from"./DLF33vme.js";import{u as pe,b as ve,f as ge}from"./V6PXsQGD.js";const xe={key:0,class:"flex flex-col overflow-hidden rounded-3xl border bg-surface"},he=["disabled","aria-label"],ye=["src","alt"],we={key:1,class:"absolute inset-0 flex items-center justify-center bg-black/45"},ke={key:2,class:"absolute right-3 top-3 grid h-9 w-9 place-items-center rounded-full bg-accent text-lg font-bold text-black"},_e={class:"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/85 to-transparent p-4 pt-10"},Be={class:"truncate text-base font-bold text-white sm:text-lg"},$e={class:"truncate text-xs text-white/70 sm:text-sm"},Te={class:"flex items-center justify-between gap-2 px-3 py-2.5 text-xs sm:px-4 sm:py-3 sm:text-sm"},Ce={class:"font-bold"},Ue={class:"text-muted"},Ve={class:"text-accent"},Ee={class:"text-brand"},Ne={key:0,class:"flex items-center gap-1 font-semibold"},Fe={key:1,class:"text-muted"},Le={class:"text-muted"},Oe=H({__name:"BattleCard",props:{creator:{},loading:{type:Boolean},selected:{type:Boolean},dimmed:{type:Boolean},delta:{},disabled:{type:Boolean}},emits:["pick"],setup(o,{emit:h}){const g=o,m=h;function f(r){return"sponsored"in r&&r.sponsored===!0}const n=N(()=>{const r=g.creator;return r?f(r)?{displayName:r.displayName,username:r.username,avatarUrl:r.avatarUrl,sponsored:!0}:{displayName:r.card.displayName,username:r.card.username,avatarUrl:r.card.avatarUrl,sponsored:!1}:null}),b=N(()=>fe(n.value?.username??"battle"));function c(){g.disabled||!g.creator||m("pick")}return(r,u)=>o.loading||!o.creator||!t(n)?(l(),i("div",xe,[...u[0]||(u[0]=[a("div",{class:"aspect-[4/5] w-full animate-pulse bg-surface-2"},null,-1),a("div",{class:"space-y-2 p-4"},[a("div",{class:"h-5 w-2/3 animate-pulse rounded bg-surface-2"}),a("div",{class:"h-4 w-1/3 animate-pulse rounded bg-surface-2"})],-1)])])):(l(),i("button",{key:1,type:"button",disabled:o.disabled,"aria-label":`Vote for ${t(n).displayName}`,class:_(["group relative flex flex-col overflow-hidden rounded-3xl border bg-surface text-left transition duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-brand",[o.selected?"border-accent ring-2 ring-accent":"hover:border-brand/60 hover:shadow-xl hover:shadow-brand/10",o.dimmed?"opacity-50 grayscale":"",o.disabled?"":"cursor-pointer active:scale-[0.99]",t(n).sponsored&&!o.selected?"ring-1 ring-amber-300/30":""]]),onClick:c},[a("div",{class:"relative aspect-[4/5] w-full overflow-hidden",style:ne(t(n).avatarUrl?void 0:{backgroundImage:`linear-gradient(135deg, ${t(b).from}, ${t(b).to})`})},[t(n).avatarUrl?(l(),i("img",{key:0,src:t(n).avatarUrl,alt:t(n).displayName,class:"h-full w-full object-cover transition duration-300 group-hover:scale-105"},null,8,ye)):w("",!0),o.delta!==null&&o.delta!==void 0?(l(),i("div",we,[a("span",{class:_(["rounded-full px-4 py-1.5 text-xl font-extrabold text-white shadow-lg",o.delta>=0?"bg-accent/90 text-black":"bg-brand/90"])},v(o.delta>0?`+${o.delta}`:o.delta),3)])):w("",!0),o.selected?(l(),i("div",ke," â ")):w("",!0),a("div",_e,[a("h3",Be,v(t(n).displayName),1),a("p",$e,"@"+v(t(n).username),1)])],4),a("div",Te,[f(o.creator)?(l(),i(J,{key:1},[o.creator.likes>0?(l(),i("span",Ne,[u[3]||(u[3]=a("span",{class:"text-brand"},"â¥",-1)),x(v(t(ce)(o.creator.likes)),1)])):(l(),i("span",Fe,"OnlyFans")),a("span",Le,v(t(me)(o.creator.isFree,o.creator.price,"USD")),1)],64)):(l(),i(J,{key:0},[a("span",Ce,[x(v(Math.round(o.creator.elo).toLocaleString())+" ",1),u[1]||(u[1]=a("span",{class:"text-[10px] font-normal text-muted sm:text-xs"},"Elo",-1))]),a("span",Ue,[a("span",Ve,v(o.creator.wins)+"W",1),u[2]||(u[2]=x(" · ",-1)),a("span",Ee,v(o.creator.losses)+"L",1)])],64))])],10,he))}}),Se=Object.assign(Oe,{__name:"BattleCard"}),je=["href"],P="block w-full truncate rounded-full border px-2 py-1.5 text-center text-xs font-semibold transition sm:px-3 sm:text-sm",Pe=H({__name:"BattleProfileLink",props:{creator:{}},setup(o){const h=o,g=N(()=>h.creator&&"sponsored"in h.creator&&h.creator.sponsored===!0?h.creator:null),m=N(()=>{const n=h.creator;return!n||g.value?null:`/creators/${n.card.slug}`});function f(n){const b=g.value;b&&(n.preventDefault(),window.location.href=b.outHref)}return(n,b)=>{const c=X;return o.creator?t(g)?(l(),i("a",{key:1,href:t(g).profileHref,class:_([P,"border-brand/50 bg-brand/10 text-brand shadow-sm shadow-brand/20 hover:bg-brand/20"]),onClick:f}," View profile â ",10,je)):t(m)?(l(),re(c,{key:2,to:t(m),class:_([P,"bg-surface text-muted hover:border-brand hover:text-foreground"])},{default:q(()=>[...b[0]||(b[0]=[x(" View profile ",-1)])]),_:1},8,["to","class"])):w("",!0):(l(),i("span",{key:0,class:_([P,"cursor-default border-transparent bg-surface-2 text-transparent"]),"aria-hidden":"true"}," View profile ",2))}}}),qe=Object.assign(Pe,{__name:"BattleProfileLink"}),He={class:"mx-auto max-w-5xl px-4 py-8"},Me={class:"mb-6 text-center"},We={class:"mt-4 flex flex-wrap items-center justify-center gap-3 text-sm"},Ae={class:"flex items-center gap-2 rounded-full border bg-surface px-3 py-1.5"},De={class:"text-foreground"},Ie={key:0,"aria-hidden":"true"},ze={class:"mb-4 flex min-h-9 items-center justify-center gap-3"},Qe=["disabled"],Ye={key:1,class:"text-sm text-brand"},Je={key:0,class:"rounded-2xl border border-dashed bg-surface/50 p-10 text-center"},Re={key:1,class:"grid grid-cols-[1fr_auto_1fr] items-stretch gap-1 sm:gap-4"},Ge={class:"mt-16 grid gap-6 sm:grid-cols-2"},Ke={class:"rounded-2xl border bg-surface p-6"},Xe={class:"mt-2 text-sm text-muted"},Ze={class:"mt-12 max-w-3xl"},G="Bop Battle â Rank OnlyFans Creators Head-to-Head | Prooven",K="Vote in head-to-head OnlyFans creator matchups. Every pick updates a live Elo leaderboard in real time. Tap a creator to begin the Bop Battle.",et=3,rt=H({__name:"battle",setup(o){function h(s){return"sponsored"in s?s.username:s.card.username}const g=[{q:"What is a Bop Battle?",a:"A Bop Battle is a head-to-head matchup between two OnlyFans creators. Tap the one you like more â your vote raises their score and lowers the other's. Over thousands of matchups the leaderboard surfaces the highest-ranked creators based on real preferences instead of follower counts."},{q:"How does the ranking work?",a:"Every vote updates both creators' scores using a head-to-head Elo system â the same math used in chess rankings. The winner's score goes up, the loser's goes down, and the size of the move depends on how unexpected the result was. The ranking refreshes after every single vote."},{q:"Can I undo a vote?",a:"Yes. After voting, an Undo button stays available until you cast your next vote â tap it to reverse the score change and bring the previous pair back."},{q:"Are my votes anonymous?",a:"Yes. Votes are deduplicated by an anonymous session cookie so the same person can't vote on the same matchup twice. We never expose who voted for whom."},{q:"Why head-to-head voting instead of follower counts?",a:"Follower counts measure marketing reach, not creator quality. Head-to-head voting captures preference directly â and aggregated across thousands of matchups it produces a ranking that's hard to game and easy to trust."}];le({title:G,description:K,ogTitle:G,ogDescription:K,ogUrl:`${R.url}/battle`}),de({link:[{rel:"canonical",href:`${R.url}/battle`}]}),pe([ve([{name:"Home",url:"/"},{name:"Bop Battle",url:"/battle"}]),ge(g)]);const m=p(null),f=p(!0),n=p(!1),b=p(!1),c=p(null),r=p(null),u=p(""),C=p(0),B=p(0),U=p(!1);let V=null;const $=p(null),k=p(null),F=p(!1),Z=N(()=>!!($.value&&k.value)),M=s=>
1new Promise(e=>setTimeout(e,s));function ee(){U.value=!0,V&&clearTimeout(V),V=setTimeout(()=>U.value=!1,2200)}ie(()=>{V&&clearTimeout(V)});const L=p([]);let O=0;async function W(){return await $fetch("/api/battle/matchup")}function A(s){for(const e of[s.a,s.b]){const T="sponsored"in e?e.avatarUrl:e.card.avatarUrl;if(T){const d=new Image;d.src=T}}}function S(s){s.battlesCast>C.value&&(C.value=s.battlesCast)}function D(){for(;L.value.length+O<et;)O+=1,W().then(s=>{A(s),S(s),L.value.push(s)}).catch(()=>{}).finally(()=>{O-=1})}async function j(){f.value=!0,n.value=!1,c.value=null,r.value=null,u.value="";try{const s=await W();A(s),S(s),m.value=s,f.value=!1,D()}catch{n.value=!0,f.value=!1}}async function I(){c.value=null,r.value=null,u.value="";const s=L.value.shift();s?(m.value=s,S(s),f.value=!1,D()):await j()}ue(j);function z(s){const e=s?.data;return e?.statusMessage||e?.message||"Something went wrong. Try again."}async function Q(s){const e=m.value;if(!e||b.value||c.value)return;c.value=s,b.value=!0,u.value="";const T=h(s==="a"?e.a:e.b);try{const d=await $fetch("/api/battle/vote",{method:"POST",body:{token:e.token,winner:T}});if(d.scored&&d.winner&&d.loser){const E=d.winner.username===h(e.a);r.value={a:E?d.winner.delta:d.loser.delta,b:E?d.loser.delta:d.winner.delta},$.value=d.undoToken,k.value=e}else r.value=null,$.value=null,k.value=null;C.value=d.battlesCast,B.value+=1,ee(),await M(d.scored?1100:750),await I()}catch(d){u.value=z(d),c.value=null,await M(600),await I()}finally{b.value=!1}}async function te(){const s=$.value;if(!(!s||F.value)){F.value=!0,u.value="";try{const e=await $fetch("/api/battle/undo",{method:"POST",body:{undoToken:s}});C.value=e.battlesCast,B.value=Math.max(0,B.value-1),k.value&&(m.value=k.value,c.value=null,r.value=null,f.value=!1,n.value=!1),$.value=null,k.value=null}catch(e){u.value=z(e),$.value=null,k.value=null}finally{F.value=!1}}}return(s,e)=>{const T=oe,d=X,E=Se,Y=qe,ae=be;return l(),i("div",He,[y(T,{items:[{name:"Home",href:"/"},{name:"Bop Battle"}]}),a("header",Me,[e[6]||(e[6]=a("h1",{class:"text-3xl font-extrabold sm:text-4xl"},[x(" Bop "),a("span",{class:"brand-text"},"Battle")],-1)),e[7]||(e[7]=a("p",{class:"mx-auto mt-2 max-w-2xl text-muted"}," Tap the creator you like more. Every vote updates a live, head-to-head Elo ranking â no follower-count games. ",-1)),a("div",We,[a("span",Ae,[e[2]||(e[2]=a("span",{class:"live-dot h-2 w-2 rounded-full bg-accent"},null,-1)),a("strong",De,v(t(C).toLocaleString()),1),e[3]||(e[3]=a("span",{class:"text-muted"},"battles cast",-1))]),t(B)>0?(l(),i("span",{key:0,class:_(["flex items-center gap-1.5 rounded-full border px-3 py-1.5 transition",t(U)?"border-accent bg-accent/15 text-accent":"bg-surface text-muted"])},[t(U)?(l(),i("span",Ie,"â")):w("",!0),e[4]||(e[4]=x(" You've cast ",-1)),a("strong",{class:_(t(U)?"text-accent":"text-foreground")},v(t(B)),3),x(" "+v(t(B)===1?"vote":"votes"),1)],2)):w("",!0),y(d,{to:"/leaderboard",class:"rounded-full border bg-surface px-3 py-1.5 font-semibold text-brand transition hover:border-brand"},{default:q(()=>[...e[5]||(e[5]=[x(" View leaderboard â ",-1)])]),_:1})])]),a("div",ze,[t(Z)?(l(),i("button",{key:0,class:"rounded-full border bg-surface px-4 py-2 text-sm font-semibold transition hover:border-brand disabled:opacity-50",disabled:t(F),onClick:te}," â© Undo last vote ",8,Qe)):w("",!0),t(u)?(l(),i("p",Ye,v(t(u)),1)):w("",!0)]),t(n)?(l(),i("div",Je,[e[8]||(e[8]=a("p",{class:"text-muted"},"Couldn't load a matchup.",-1)),a("button",{class:"mt-3 rounded-full border bg-surface px-5 py-2 text-sm font-semibold transition hover:border-brand",onClick:j}," Try again ")])):(l(),i("div",Re,[y(E,{creator:t(m)?.a??null,loading:t(f),selected:t(c)==="a",dimmed:t(c)!==null&&t(c)!=="a",delta:t(r)?.a??null,disabled:t(b)||t(f)||!t(m),onPick:e[0]||(e[0]=se=>Q("a"))},null,8,["creator","loading","selected","dimmed","delta","disabled"]),e[9]||(e[9]=a("div",{class:"flex items-center justify-center"},[a("span",{class:"text-[10px] font-extrabold text-muted sm:grid sm:h-14 sm:w-14 sm:place-items-center sm:rounded-full sm:border sm:bg-surface sm:text-sm"}," VS ")],-1)),y(E,{creator:t(m)?.b??null,loading:t(f),selected:t(c)==="b",dimmed:t(c)!==null&&t(c)!=="b",delta:t(r)?.b??null,disabled:t(b)||t(f)||!t(m),onPick:e[1]||(e[1]=se=>Q("b"))},null,8,["creator","loading","selected","dimmed","delta","disabled"]),y(Y,{creator:t(m)?.a??null},null,8,["creator"]),e[10]||(e[10]=a("div",{"aria-hidden":"true"},null,-1)),y(Y,{creator:t(m)?.b??null}
1,null,8,["creator"])])),e[16]||(e[16]=a("p",{class:"mt-6 text-center text-sm text-muted"},"Tap a card to vote · the loser's score drops, the winner's rises",-1)),a("section",Ge,[e[15]||(e[15]=a("div",{class:"rounded-2xl border bg-surface p-6"},[a("h2",{class:"text-lg font-bold"},"Every vote updates a global ranking"),a("p",{class:"mt-2 text-sm text-muted"}," When you pick a creator in a Bop Battle, both creators' scores update instantly using a head-to-head Elo system â the same math used in chess rankings. Over thousands of votes the true ranking emerges naturally, with no follower-count games and no pay-to-promote. ")],-1)),a("div",Ke,[e[14]||(e[14]=a("h2",{class:"text-lg font-bold"},"Built from real creator matchups",-1)),a("p",Xe,[e[12]||(e[12]=x(" The pool is drawn from Prooven's index of OnlyFans creators. Every matchup is signed to prevent ballot stuffing, and votes are deduplicated per session â so the ",-1)),y(d,{to:"/leaderboard",class:"font-semibold text-brand hover:underline"},{default:q(()=>[...e[11]||(e[11]=[x("leaderboard",-1)])]),_:1}),e[13]||(e[13]=x(" reflects genuine preference. ",-1))])])]),a("div",Ze,[y(ae,{items:g,title:"Bop Battle â FAQ"})])])}}});export{rt 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.