PageSourceSearch

https://dribble360.com/_nuxt/YumIoWCH.js

js dribble360.com collected 2026-10-05 22:45:45 UTC 16,210 bytes, 1 lines download raw bytes

1import{q as le,d as p,k as _e,z as ye,o as be,v as C,D as u,N as n,X as R,R as s,u as d,M as E,ao as Z,ah as me,ap as ge,J as N,$ as A,U as r,aJ as he,P as q,av as ee,aN as we,aA as Ke,bs as ae,ai as P,V as _,aj as se}from"./Cn84iW0n.js";import{_ as ke}from"./PZps6y8x.js";import{t as te}from"./BiHN9qdz.js";import{r as xe}from"./BndkJcp6.js";import{u as Re,T as Se}from"./Djf2vmhO.js";import{m as Ce,i as Te,r as De}from"./FfiYPhoy.js";import{be as z,aX as Ee,aY as Ne}from"./CNVwmMlT.js";import{u as Ae,o as Pe}from"./h0oP20j8.js";import{u as Ie}from"./BSjCYFrt.js";import"./B3jpPyAw.js";import"./B8Yg8XhE.js";import"./DtNf0hFZ.js";(function(){try{var b=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},y=new b.Error().stack;y&&(b._sentryDebugIds=b._sentryDebugIds||{},b._sentryDebugIds[y]="4fd36c6f-213e-4bd9-999e-70f643c9029e",b._sentryDebugIdIdentifier="sentry-dbid-4fd36c6f-213e-4bd9-999e-70f643c9029e")}catch{}})();const Me={"data-tool-surface":"",class:"percentile-view"},Le={class:"filters-bar"},Ve={class:"filter-group filter-group-wide"},Fe={class:"search-wrap"},$e={class:"search-input-row"},Ge={key:0,class:"search-dropdown"},Be=["onClick"],ze={class:"result-main"},qe={class:"result-name"},We={class:"result-team"},Oe={class:"result-season"},Ue={key:0,class:"search-no-results"},Ye={class:"filter-group"},je=["disabled"],Je=["value"],He={key:0,class:"filter-group filter-group-btn"},Xe=["disabled"],Qe={key:0,class:"loading-state"},Ze={key:1,class:"empty-state"},ea={class:"empty-desc"},aa={key:2,class:"empty-state"},sa={class:"empty-desc"},ta={key:3,class:"empty-state"},la={class:"export-header-title"},ra={class:"card-layout"},oa={class:"card-col"},na={class:"percentile-card"},ia={class:"card-header"},ca={class:"card-header-left"},ua={class:"card-position-badge"},da={class:"card-player-name"},pa={class:"card-player-meta"},va={class:"stats-list"},fa={class:"stat-item-top"},_a={class:"stat-label"},ya={class:"stat-right"},ba={class:"stat-raw-val"},ma={class:"stat-bar-track"},ga={class:"card-footer"},ha={class:"footer-text"},wa={class:"insights-panel"},Ka={class:"block-header"},ka={class:"overall-score-row"},xa={class:"overall-bar-track"},Ra={class:"insight-sub"},Sa={class:"insight-block block-strengths"},Ca={class:"top-stats-list"},Ta={class:"medal-num"},Da={class:"top-stat-label"},Ea={class:"top-stat-bar-track"},Na={class:"insight-block block-context"},Aa={class:"context-row"},Pa={class:"context-item"},Ia={class:"context-val"},Ma={class:"context-item"},La={class:"context-val"},Va={class:"context-sub"},Fa=le({__name:"PercentileCardView",setup(b){async function y(e,a){return xe(e,a)}const I=[{pctKey:"goals_pct",rawKey:"goals",label:"Goals",isRate:!1},{pctKey:"xg_pct",rawKey:"xg",label:"xG",isRate:!0},{pctKey:"shots_pct",rawKey:"shots",label:"Shots",isRate:!1},{pctKey:"assists_pct",rawKey:"assists",label:"Assists",isRate:!1},{pctKey:"xa_pct",rawKey:"xa",label:"xA",isRate:!0},{pctKey:"chances_created_pct",rawKey:"chances_created",label:"Chances Created",isRate:!1},{pctKey:"dribbles_pct",rawKey:"dribbles",label:"Dribbles",isRate:!1},{pctKey:"box_touches_pct",rawKey:"box_touches",label:"Box Touches",isRate:!1},{pctKey:"prog_carries_pct",rawKey:"prog_carries",label:"Progressive Carries",isRate:!1},{pctKey:"aerials_won_pct",rawKey:"aerials_won",label:"Aerials Won",isRate:!1}],re=[{pctKey:"assists_pct",rawKey:"assists",label:"Assists",isRate:!1},{pctKey:"xa_pct",rawKey:"xa",label:"xA",isRate:!0},{pctKey:"chances_created_pct",rawKey:"chances_created",label:"Chances Created",isRate:!1},{pctKey:"goals_pct",rawKey:"goals",label:"Goals",isRate:!1},{pctKey:"xg_pct",rawKey:"xg",label:"xG",isRate:!0},{pctKey:"dribbles_pct",rawKey:"dribbles",label:"Dribbles",isRate:!1},{pctKey:"prog_carries_pct",rawKey:"prog_carries",label:"Progressive Carries",isRate:!1},{pctKey:"tackles_pct",rawKey:"tackles",label:"Tackles",isRate:!1},{pctKey:"interceptions_pct",rawKey:"interceptions",label:"Interceptions",isRate:!1},{pctKey:"aerials_won_pct",rawKey:"aerials_won",label:"Aerials Won",isRate:!1}],oe=[{pctKey:"tackles_pct",rawKey:"tackles",label:"Tackles",isRate:!1},{pctKey:"interceptions_pct",rawKey:"interceptions",label:"Interceptions",isRate:!1},{pctKey:"clearances_pct",rawKey:"clearances",label:"Clearances",isRate:!1},{pctKey:"aerials_won_pct",rawKey:"aerials_won",label:"Aerials Won",isRate:!1},{pctKey:"prog_carries_pct",rawKey:"prog_carries",label:"Progressive Carries",isRate:!1},{pctKey:"chances_created_pct",rawKey:"chances_created",label:"Chances Created",isRate:!1},{pctKey:"dribbles_pct",rawKey:"dribbles",label:"Dribbles",isRate:!1},{pctKey:"assists_pct",rawKey:"assists",label:"Assists",isRate:!1},{pctKey:"goals_pct",rawKey:"goals",label:"Goals",isRate:!1},{pctKey:"xa_pct",rawKey:"xa",label:"xA",isRate:!0}],ne=[{pctKey:"saves_pct",rawKey:"saves",label:"Saves",isRate:!1},{pctKey:"clean_sheets_pct",rawKey:"clean_sheets",label:"Clean Sheets",isRate:!1},{pctKey:"goals_conceded_pct",rawKey:"goals_conceded",label:"Goals Conceded (inv.)",isRate:!1}],g=p(""),h=p([]),o=p(null),m=p([]),i=p(""),w=p(!1),l=p(null),W=p(null),O=p(null),U=p(null);let K=null,M=0;const L=p(!1),v=p(null),{downloading:V,triggerExport:ie}=Ie(),Y=Ae();async function j(e){if(!e.slug)return!1;const a=(e.known_name??e.short_name??e.name)||e.name;return await T({player_id:e.id,name:a,slug:e.slug,team:e.subtext??"",season:""}),e.seasonName&&m.value.includes(e.seasonName)&&i.value!==e.seasonName&&(i.value=e.seasonName,await S()),!0}_e(async()=>{await ye();try{const e=Y.consume(["player"]);if(e&&await j(e))return;const t=(await y("/api/beta/percentile-card",{action:"search",q:"Mohamed Salah"})).players??[];t.length&&await T(t[0])}catch(e){if(e instanceof DOMException&&e.name==="AbortError")return;v.value=e instanceof Error?e.message:"Failed to load default player"}}),Pe(()=>{const e=Y.consume(["player"]);e&&j(e).catch(()=>{})}),be(()=>{K&&(clearTimeout(K),K=null)});
1function ce(){if(o.value=null,l.value=null,m.value=[],i.value="",L.value=!1,v.value=null,K&&clearTimeout(K),g.value.length<2){h.value=[];return}K=setTimeout(async()=>{const e=++M;try{const a=await y("/api/beta/percentile-card",{action:"search",q:g.value});if(e!==M)return;h.value=a.players??[],L.value=!0}catch(a){if(e!==M)return;v.value=a instanceof Error?a.message:"Search failed"}},220)}let J=0;async function T(e){w.value=!1;const a=++J,t=()=>a===J&&o.value?.slug===e.slug;o.value=e,g.value=e.name,h.value=[],v.value=null;try{const c=await y("/api/beta/percentile-card",{action:"seasons",playerSlug:e.slug});if(!t())return;m.value=c.seasons??[]}catch(c){if(!t())return;v.value=c instanceof Error?c.message:"Failed to load seasons";return}for(const c of m.value){if(i.value=c,await S(),!t())return;if(l.value)break}}let H=0;async function S(){const e=++H,a=JSON.stringify([o.value?.slug,i.value]),t=()=>e===H&&a===JSON.stringify([o.value?.slug,i.value]);if(!(!o.value||!i.value)){w.value=!0,l.value=null,v.value=null;try{const c=await y("/api/beta/percentile-card",{action:"data",playerSlug:o.value.slug,season:i.value});if(!t())return;const f=c.player??null;f&&["goals_pct","assists_pct","xg_pct","xa_pct","shots_pct","box_touches_pct","dribbles_pct","chances_created_pct","tackles_pct","interceptions_pct","aerials_won_pct","clearances_pct","prog_carries_pct","saves_pct","clean_sheets_pct","goals_conceded_pct"].forEach(Q=>{const B=f[Q];f[Q]=B==null?null:Number(B)}),l.value=f}catch(c){if(!t())return;v.value=c instanceof Error?c.message:"Failed to load percentile data"}finally{t()&&(w.value=!1)}}}const k=C(()=>{const e=(l.value?.player_pos??"").toLowerCase();let a;return e.includes("goalkeeper")||e==="gk"?a=ne:e.includes("defender")||e.includes("back")||e.includes("centre-back")?a=oe:e.includes("midfielder")||e.includes("mid")?a=re:a=I,l.value?a.filter(t=>l.value[t.pctKey]!==null):a}),X=C(()=>{const e=(l.value?.player_pos??"").toLowerCase();return e.includes("goalkeeper")||e==="gk"?"Goalkeepers":e.includes("centre-back")||e.includes("defender")&&e.includes("centre")?"Centre-Backs":e.includes("back")||e.includes("defender")?"Defenders":e.includes("midfielder")||e.includes("mid")?"Midfielders":"Forwards"}),x=C(()=>{if(!l.value)return null;const e=k.value.map(a=>l.value[a.pctKey]).filter(a=>a!==null&&!isNaN(a));return e.length?Math.round(e.reduce((a,t)=>a+t,0)/e.length):null}),D=C(()=>{const e=x.value;return e===null?null:e>=90?{label:"Elite",cls:"tier-elite"}:e>=75?{label:"World Class",cls:"tier-worldclass"}:e>=60?{label:"Good",cls:"tier-good"}:e>=40?{label:"Average",cls:"tier-average"}:{label:"Below Avg",cls:"tier-below"}}),ue=C(()=>l.value?[...k.value].map(e=>({label:e.label,pct:l.value[e.pctKey]??0})).sort((e,a)=>a.pct-e.pct).slice(0,3):[]);function de(e){const a=(e??"").toLowerCase();return a.includes("goalkeeper")||a==="gk"?"GK":a.includes("centre-back")||a.includes("defender")&&a.includes("centre")?"CB":a.includes("back")||a.includes("defender")?"DEF":a.includes("midfielder")||a.includes("mid")?"MID":"FWD"}function F(e){if(e==null)return"—";const a=Math.round(e),t=a%10,c=a%100;let f="th";return(c<11||c>13)&&(t===1?f="st":t===2?f="nd":t===3&&(f="rd")),`${a}${f}`}function pe(e,a){if(e==null)return"—";const t=Number(e);return isNaN(t)?"—":a?t.toFixed(2):Math.round(t).toLocaleString("en-US")}function $(e){return e>=80?"bar-excellent":e>=60?"bar-good":e>=40?"bar-mid":"bar-low"}function G(e){return e>=80?"pct-excellent":e>=60?"pct-good":e>=40?"pct-mid":"pct-low"}async function ve(){await ie({containerRef:W,headerRef:O,footerRef:U,filename:()=>`${l.value?.player_name??"percentile-card"}.png`,toolId:"percentile-card",exportWidth:960})}const fe=Re({id:"percentile-card",title:"Percentile Card",action:"Follow this player",ready:()=>!!l.value&&!w.value,pending:()=>w.value,state:()=>({player:o.value,season:i.value}),rows:()=>o.value?[Ce(o.value.slug,o.value.name,l.value,k.value.map(e=>e.pctKey),Object.fromEntries(k.value.map(e=>[e.pctKey,e.label])))]:[],hero:()=>({subject:o.value?.name??"Your player, in focus",value:x.value??"—",unit:"average percentile",detail:i.value+" · Compared with the selected position cohort."}),restore:async e=>{const a=e.player;if(Te(a)&&typeof a.slug=="string"&&typeof a.name=="string"){await T({player_id:String(a.player_id??""),name:a.name,slug:a.slug,team:String(a.team??""),season:String(a.season??"")});const t=De(e,"season",i.value);m.value.includes(t)&&(i.value=t),await S()}},refresh:S,links:()=>o.value?[{label:"Compare in Radar Plex",to:te("/tools/radar-plex",{id:o.value.player_id,name:o.value.name,type:"player",slug:o.value.slug,season:i.value})},{label:"See recent form",to:te("/beta/form-timeline",{id:o.value.player_id,name:o.value.name,type:"player",slug:o.value.slug,season:i.value})}]:[]});return(e,a)=>(n(),u("div",Me,[R(Se,{workspace:d(fe)},null,8,["workspace"]),s("div",Le,[s("div",Ve,[a[2]||(a[2]=s("label",{class:"filter-label"},"Player",-1)),s("div",Fe,[s("div",$e,[R(d(me),{size:15,class:"search-icon"}),Z(s("input",{"onUpdate:modelValue":a[0]||(a[0]=t=>g.value=t),type:"text",class:"search-input",placeholder:"Search player name...",autocomplete:"off",onInput:ce},null,544),[[ge,g.value]]),h.value.length>0&&!o.value?(n(),u("div",Ge,[(n(!0),u(N,null,A(h.value,t=>(n(),u("button",{key:t.player_id,type:"button",class:"search-result-item",onClick:c=>T(t)},[s("div",ze,[s("span",qe,r(t.name),1),s("span",We,r(t.team),1)]),s("span",Oe,r(t.season),1)],8,Be))),128))])):E("",!0)]),L.value&&!o.value&&g.value.length>=2&&!h.value.length?(n(),u("p",Ue,"No players found — try a different name")):E("",!0)])]),s("div",Ye,[a[4]||(a[4]=s("label",{class:"filter-label"},"Season",-1)),Z(s("select",{"onUpdate:modelValue":a[1]||(a[1]=t=>i.value=t),class:"filter-select",disabled:!o.value||m.value.length===0,onChange:S},[a[3]||(a[3]=s("option",{value:""},"Select season",-1)),(n(!0),u(N,null,A(m.value,t=>(n(),u("option",{key:t,value:t},r(t),9,Je))),128))],40,je),[[he,i.value]])]),l.value?(n(),u("div",He,[s("button",{type:"button",class:"dl-btn",disabled:d(V),onClick:ve},[d(V)?(n(),q(d(ee),{key:0,size:15,class:"spin-anim"})):(n(),q(d(we),{key:1,size:15})),s("span",null,r(d(V)?"Exporting...":"Export"),1)],8,Xe)])):E("",!0)]),w.value?(n(),u("div",Qe,[R(d(ee),{size:32,class:"loading-spinner"})])):v.value&&!l.value?(n(),u("div",Ze,[R(d(Ke),{size:40,class:"error-icon"}),a[5]||(a[5]=s("p",{class:"empty-title"},"Something went wrong",-1)),s("p",ea,r(v.value),1)])):!l.value&&o.value&&i.value?(n(),u("div",aa,[R(d(ae),{size:40,class:"empty-icon"}),a[6]||(a[6]=s("p",{class:"empty-title"},"No data found",-1)),s("p",sa,"No stats available for "+r(o.value.name)+" in "+r(i.value)+". Try a different season.",1)])):l.value?(n(),u("div",{key:4,ref_key:"exportContainerRef",ref:W,class:"pct-export-outer"},[s("div",{ref_key:"exportHeaderRef",ref:O,class:"export-header",style:{display:"none"}},[s("span",la,r(l.value?.player_name)+" · "+r(i.value),1),a[9]||(a[9]=s("div",{class:"export-header-right"},[s("span",{class:"export-header-tool-pill"},"PERCENTILE CARD")],-1))],512),s("div",ra,[s("div",oa,[s("div",na,[s("div",ia,[s("div",ca,[s("div",ua,r(de(l.value.player_pos)),1),s("div",null,[s("h2",da,r(l.value.player_name),1),s("p",pa,r(l.value.team_name)+" · "+r(i.value),1)])])]),s("div",va,[(n(!0),u(N,null,A(k.value,(t,c)=>(n(),u("div",{key:t.pctKey,class:"stat-item",style:P({animationDelay:`${c*45}ms`})},[s("div",fa,[s("span",_a,r(t.label),1),s("div",ya,[s("span",ba,r(pe(l.value[t.rawKey],t.isRate)),1),s("span",{class:_(["stat-pct-val",G(l.value[t.pctKey])])},r(F(l.value[t.pctKey])),3)])]),s("div",ma,[s("div",{class:_(["stat-bar-fill",$(l.value[t.pctKey])]),style:P({width:`${Math.min(100,Math.max(0,Number(l.value[t.pctKey])??0))}%`})},null,6)])],4))),128))]),s("div",ga,[s("span",ha," Percentile vs "+r(l.value.position_count?`${d(z)(l.value.position_count)} `:"")+r(X.value)+" · dribble360.com ",1)])])]),s("div",wa,[s("div",{class:_(["insight-block block-overall",D.value?.cls])},[s("div",Ka,[a[10]||(a[10]=s("p",{class:"insight-block-label"},"Overall Rating",-1)),D.value?(n(),u("span",{key:0,class:_(["tier-badge",`${D.value.cls}-badge`])},r(D.value.label),3)):E("",!0)]),s("div",ka,[s("span",{class:_(["overall-score-num",G(x.value??0)])},r(F(x.value)),3)]),s("div",xa,[s("div",{class:_(["overall-bar-fill",$(x.value??0)]),style:P({width:`${x.value??0}%`})},null,6)]),s("p",Ra,"Avg across "+r(k.value.length)+" position-specific stats",1)],2),s("div",Sa,[a[11]||(a[11]=s("p",{class:"insight-block-label"},"Top Strengths",-1)),s("div",Ca,[(n(!0),u(N,null,A(ue.value,(t,c)=>(n(),u("div",{key:t.label,class:_(["top-stat-row",`medal-${c+1}`])},[s("span",Ta,r(String(c+1).padStart(2,"0")),1),s("span",Da,r(t.label),1),s("div",Ea,[s("div",{class:_(["top-stat-bar",$(t.pct)]),style:P({width:`${t.pct}%`})},null,6)]),s("span",{class:_(["top-stat-pct",G(t.pct)])},r(F(t.pct)),3)],2))),128))])]),s("div",Na,[a[16]||(a[16]=s("p",{class:"insight-block-label"},"Season Context",-1)),s("div",Aa,[s("div",Pa,[s("span",Ia,r(d(z)(l.value.matches_played)),1),a[12]||(a[12]=s("span",{class:"context-sub"},"appearances",-1))]),a[15]||(a[15]=s("div",{class:"context-divider"},null,-1)),s("div",Ma,[s("span",La,r(d(z)(l.value.position_count)),1),s("span",Va,[se(r(X.value),1),a[13]||(a[13]=s("br",null,null,-1)),a[14]||(a[14]=se("compared",-1))])])])])])]),s("div",{ref_key:"exportFooterRef",ref:U,class:"export-footer",style:{display:"none"}},[...a[17]||(a[17]=[s("span",{class:"export-footer-pill"},"Make Your Own On Dribble360.com",-1),s("img",{src:ke,alt:"Dribble",class:"export-footer-logo"},null,-1)])],512)],512)):(n(),u("div",ta,[R(d(ae),{size:40,class:"empty-icon"}),a[7]||(a[7]=s("p",{class:"empty-title"},"Search for a player",-1)),a[8]||(a[8]=s("p",{class:"empty-desc"},"Select a player and season to generate their percentile scout card.",-1))]))]))}}),$a=Object.assign(Ee(Fa,[["__scopeId","data-v-a607991d"]]),{__name:"BetaPercentileCardView"}),Za=le({__name:"percentile-card",setup(b){return Ne({title:"Percentile Card — Dribble Tools",meta:[{name:"description",content:"See where any player ranks against peers at the same position."},{property:"og:title",content:"Percentile Card — Dribble360"}
1]}),(y,I)=>(n(),q($a))}});export{Za 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.