@pitvox/partner-react 0.3.0 → 0.5.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 +127 -165
- package/dist/index.cjs +1 -1
- package/dist/index.js +1412 -1218
- package/dist/styles.css +614 -18
- package/package.json +3 -4
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),b=require("react"),C=require("@tanstack/react-query"),ne=require("react-router-dom"),O=b.createContext(null),ze="https://cdn.pitvox.com",Ze="https://pitvox.com";let H=null;function Je({partnerSlug:s,cdnUrl:r=ze,pitvoxUrl:t=Ze,getSteamId:n,onRegister:a,onWithdraw:i,children:l}){const o=b.useMemo(()=>({partnerSlug:s,cdnUrl:r.replace(/\/$/,""),pitvoxUrl:t.replace(/\/$/,""),getSteamId:n||(()=>null),onRegister:a||null,onWithdraw:i||null}),[s,r,t,n,a,i]);let x=!1;try{C.useQueryClient(),x=!0}catch{x=!1}return x?e.jsx(O.Provider,{value:o,children:l}):(H||(H=new C.QueryClient({defaultOptions:{queries:{staleTime:6e4}}})),e.jsx(C.QueryClientProvider,{client:H,children:e.jsx(O.Provider,{value:o,children:l})}))}function k(){const s=b.useContext(O);if(!s)throw new Error("usePitVox must be used within a <PitVoxPartnerProvider>");return s}async function S(s,r){const t=await fetch(`${s}/${r}`);if(!t.ok){if(t.status===404||t.status===403)return null;throw new Error(`CDN fetch failed: ${t.status}`)}return t.json()}function A(s){if(!s&&s!==0)return"-";const r=Math.floor(s/1e3),t=Math.floor(r/60),n=r%60,a=s%1e3;return`${t}:${String(n).padStart(2,"0")}.${String(a).padStart(3,"0")}`}function B(s){return!s&&s!==0?"-":(s/1e3).toFixed(3)}function $(s){if(!s)return"";let r=s;return r.startsWith("ks_")&&(r=r.slice(3)),r.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function F(s,r,t){const n=s.split("_").map(l=>l.charAt(0).toUpperCase()+l.slice(1)).join(" "),a=t==="acc"||!t&&(r==null?void 0:r.toLowerCase())==="track config";if(!r||r==="default"||a)return n;const i=r.split("_").map(l=>l.charAt(0).toUpperCase()+l.slice(1)).join(" ");return`${n} ${i}`}function U(s){if(!s)return"-";try{return new Date(s).toLocaleDateString("en-GB",{day:"numeric",month:"short",year:"numeric"})}catch{return"-"}}function Xe(s){if(!s)return"";const r=Date.now()-new Date(s).getTime(),t=Math.floor(r/1e3);if(t<60)return"Just now";const n=Math.floor(t/60);if(n<60)return`${n}m ago`;const a=Math.floor(n/60);if(a<24)return`${a}h ago`;const i=Math.floor(a/24);return i<30?`${i}d ago`:U(s)}function Ye(s){return s==null?"":`${s>=0?"+":"-"}${(Math.abs(s)/1e3).toFixed(3)}`}function Q(s){return s?{E:"Eco",RD:"Road",SC:"SuperCar",RV:"Race Vintage",SM:"Semislick",ST:"Street",HR:"Hard Race",MR:"Medium Race",SR:"Soft Race",S:"Soft"}[s]||s:"Unknown"}function ae(s={}){var o,x,c,v,g,j;const{cdnUrl:r,partnerSlug:t}=k(),{game:n,gameVersion:a}=s,i=C.useQuery({queryKey:["pitvox","leaderboards",t,"index"],queryFn:()=>S(r,`leaderboards/partners/${t}/index.json`),staleTime:3e4,refetchInterval:3e4}),l=b.useMemo(()=>{var h;if(!((h=i.data)!=null&&h.tracks))return[];let m=i.data.tracks;return n&&(m=m.filter(d=>d.game===n)),a&&(m=m.filter(d=>d.gameVersion===a)),m.map(d=>({id:d.trackId,layout:d.layout,game:d.game,gameVersion:d.gameVersion,displayName:F(d.trackId,d.layout,d.game),driverCount:d.driverCount||0,carCount:d.carCount||0,record:d.recordHolder?{visibleId:d.recordHolder.steamId||d.recordHolder.userId,carId:d.recordHolder.carId,carDisplayName:$(d.recordHolder.carId),lapTimeMs:d.recordHolder.lapTimeMs,timestamp:d.recordHolder.recordedAt}:null,recordByTag:d.recordByTag||null}))},[(o=i.data)==null?void 0:o.tracks,n,a]);return{...i,data:l,partner:((x=i.data)==null?void 0:x.partner)||null,generatedAt:(c=i.data)==null?void 0:c.generatedAt,totalLaps:((v=i.data)==null?void 0:v.totalLaps)||0,totalUsers:((g=i.data)==null?void 0:g.totalUsers)||0,versions:((j=i.data)==null?void 0:j.versions)||{}}}function W(s,r,t={}){const{cdnUrl:n,partnerSlug:a}=k(),{carId:i,game:l,gameVersion:o}=t,x=r||"default",c=o?`leaderboards/partners/${a}/v/${o}/tracks/${s}/${x}.json`:`leaderboards/partners/${a}/tracks/${s}/${x}.json`,{data:v,isLoading:g,error:j}=C.useQuery({queryKey:["pitvox","leaderboards",a,"track",s,x,o],queryFn:()=>S(n,c),enabled:!!s,staleTime:3e4,refetchInterval:3e4});return{data:b.useMemo(()=>{if(!(v!=null&&v.entries))return[];let h=v.entries;if(l&&(h=h.filter(d=>d.game===l)),!i){const d=new Map,u=new Map;for(const p of h){const N=p.steamId||p.userId;u.has(p.carId)||u.set(p.carId,new Set),u.get(p.carId).add(N),(!d.has(p.carId)||p.lapTimeMs<d.get(p.carId).lapTimeMs)&&d.set(p.carId,p)}return Array.from(d.values()).map(p=>{var N;return{...p,driverCount:((N=u.get(p.carId))==null?void 0:N.size)||0}}).sort((p,N)=>p.lapTimeMs-N.lapTimeMs)}return h.filter(d=>d.carId===i).sort((d,u)=>d.lapTimeMs-u.lapTimeMs)},[v==null?void 0:v.entries,i,l]),isLoading:g,error:j}}function ie(s,r,t,n,a={}){var j,m;const{cdnUrl:i,partnerSlug:l}=k(),{showInvalid:o=!1,game:x,gameVersion:c}=a,v=C.useQuery({queryKey:["pitvox","laps",l,s],queryFn:()=>S(i,`laps/partners/${l}/${s}.json`),enabled:!!s,staleTime:3e4,refetchInterval:3e4}),g=b.useMemo(()=>{var h;return(h=v.data)!=null&&h.laps?v.data.laps.filter(d=>{if(d.trackId!==r)return!1;if(t){if(d.trackLayout!==t)return!1}else if(d.trackLayout&&d.trackLayout!=="default")return!1;return!(d.carId!==n||x&&d.game!==x||c&&d.gameVersion!==c||!o&&!d.isValid)}).sort((d,u)=>d.lapTimeMs-u.lapTimeMs):[]},[(j=v.data)==null?void 0:j.laps,r,t,n,x,c,o]);return{...v,data:g,driverName:((m=v.data)==null?void 0:m.driverName)||"Driver"}}function oe(){const{cdnUrl:s}=k(),{data:r}=C.useQuery({queryKey:["pitvox","users","index"],queryFn:()=>S(s,"users/index.json"),staleTime:5*6e4,gcTime:30*6e4}),t=(r==null?void 0:r.users)||{};return(n,a)=>{const i=t[n];return{displayName:(i==null?void 0:i.displayName)||a||n||"Unknown",avatarUrl:(i==null?void 0:i.avatarUrl)||null,affiliations:(i==null?void 0:i.affiliations)||[]}}}function le(){const{cdnUrl:s}=k(),{data:r}=C.useQuery({queryKey:["pitvox","cars","index"],queryFn:()=>S(s,"cars/index.json"),staleTime:5*6e4,gcTime:30*6e4});return{tags:(r==null?void 0:r.tags)||[],cars:(r==null?void 0:r.cars)||{}}}function es(s,r){return W(s,null,{carId:r})}function ce(){const{cdnUrl:s,partnerSlug:r}=k();return C.useQuery({queryKey:["pitvox","competitions",r],queryFn:async()=>{const t=await S(s,"competitions/index.json");return t!=null&&t.competitions?t.competitions.filter(n=>n.partnerSlug===r):[]},staleTime:6e4})}function G(s){const{cdnUrl:r,partnerSlug:t}=k();return C.useQuery({queryKey:["pitvox","competition",t,s,"config"],queryFn:()=>S(r,`competitions/${t}/${s}/config.json`),enabled:!!s,staleTime:6e4})}function de(s){const{cdnUrl:r,partnerSlug:t}=k();return C.useQuery({queryKey:["pitvox","competition",t,s,"standings"],queryFn:()=>S(r,`competitions/${t}/${s}/standings.json`),enabled:!!s,staleTime:6e4})}function pe(s,r){const{cdnUrl:t,partnerSlug:n}=k();return C.useQuery({queryKey:["pitvox","competition",n,s,"round",r],queryFn:()=>S(t,`competitions/${n}/${s}/rounds/${r}.json`),enabled:!!s&&r!=null,staleTime:6e4})}function ss(s,r=[]){const{cdnUrl:t,partnerSlug:n}=k();return C.useQuery({queryKey:["pitvox","competition",n,s,"allRounds",r],queryFn:async()=>(await Promise.all(r.map(i=>S(t,`competitions/${n}/${s}/rounds/${i}.json`).catch(()=>null)))).filter(Boolean),enabled:!!s&&r.length>0,staleTime:6e4})}function xe(s){const{cdnUrl:r,partnerSlug:t}=k();return C.useQuery({queryKey:["pitvox","competition",t,s,"entrylist"],queryFn:()=>S(r,`competitions/${t}/${s}/entrylist.json`),enabled:!!s,staleTime:6e4})}function ue(s){const{cdnUrl:r,partnerSlug:t,getSteamId:n}=k(),a=n();return C.useQuery({queryKey:["pitvox","registration",t,s,a],queryFn:async()=>{var x;const i=await fetch(`${r}/competitions/${t}/${s}/entrylist.json`);if(!i.ok)return{isRegistered:!1,entryList:null};const l=await i.json();return{isRegistered:!!a&&((x=l.drivers)==null?void 0:x.some(c=>c.steamId===a)),entryList:l}},enabled:!!s,staleTime:6e4})}function me(s){const{onRegister:r,partnerSlug:t}=k(),n=C.useQueryClient();return C.useMutation({mutationFn:a=>{if(!r)throw new Error("No onRegister callback provided to PitVoxPartnerProvider. Provide onRegister for in-app registration, or use useRegistrationUrl() to link to pitvox.com.");return r(s,a)},onSuccess:()=>{n.invalidateQueries({queryKey:["pitvox","registration",t,s]}),n.invalidateQueries({queryKey:["pitvox","competition",t,s,"entrylist"]})}})}function ve(s){const{onWithdraw:r,partnerSlug:t,getSteamId:n}=k(),a=C.useQueryClient();return C.useMutation({mutationFn:i=>{if(!r)throw new Error("No onWithdraw callback provided to PitVoxPartnerProvider. Provide onWithdraw for in-app withdrawal, or use useRegistrationUrl() to link to pitvox.com.");const l=i||n();if(!l)throw new Error("No Steam ID available");return r(s,l)},onSuccess:()=>{a.invalidateQueries({queryKey:["pitvox","registration",t,s]}),a.invalidateQueries({queryKey:["pitvox","competition",t,s,"entrylist"]})}})}function he(){const{onRegister:s,onWithdraw:r}=k(),t=!!(s&&r);return{isPowerMode:t,isBasicMode:!t}}function je(s){const{pitvoxUrl:r,partnerSlug:t}=k();return`${r}/p/${t}/competitions/${s}/register`}const ts={formula:"Formula",gt3:"GT3",gt2:"GT2",gt4:"GT4",cup:"Cup",prototype:"Prototype",rally:"Rally",hypercar:"Hypercar",supercar:"Supercar",sports_car:"Sports Car",hot_hatch:"Hot Hatch",lightweight:"Lightweight","1960s":"1960s","1970s":"1970s","1980s":"1980s","1990s":"1990s","2000s":"2000s","2010s":"2010s","2020s":"2020s"},ge=[{id:"class",tags:["formula","gt3","gt2","gt4","cup","prototype","rally"]},{id:"tier",tags:["hypercar","supercar","sports_car","hot_hatch","lightweight"]},{id:"era",tags:["1960s","1970s","1980s","1990s","2000s","2010s","2020s"]}];function rs(s){for(const r of ge)if(r.tags.includes(s))return r.id;return"other"}function fe(s,r){if(r.size===0)return!0;const t={};for(const n of r){const a=rs(n);t[a]||(t[a]=[]),t[a].push(n)}for(const n of Object.values(t))if(!n.some(a=>s.includes(a)))return!1;return!0}function Ne(){const[s,r]=b.useState(new Set),t=b.useCallback(a=>{r(i=>{const l=new Set(i);return l.has(a)?l.delete(a):l.add(a),l})},[]),n=b.useCallback(()=>r(new Set),[]);return{activeTags:s,toggle:t,clear:n}}function z(s){const[r,t]=b.useState(s),n=b.useCallback(a=>{t(i=>i.key===a?{key:a,dir:i.dir==="asc"?"desc":"asc"}:{key:a,dir:a.includes("timestamp")||a.includes("Date")?"desc":"asc"})},[]);return[r,n]}function Z(s,r,t){return[...s].sort((n,a)=>{const i=t(n,r.key),l=t(a,r.key);if(i==null&&l==null)return 0;if(i==null)return 1;if(l==null)return-1;const o=typeof i=="string"?i.localeCompare(l):i-l;return r.dir==="desc"?-o:o})}function be(s,r=!1){const t=r?s==null?void 0:s.filter(n=>n.isValid):s;return t!=null&&t.length?{s1:Math.min(...t.map(n=>n.sector1Ms).filter(Boolean)),s2:Math.min(...t.map(n=>n.sector2Ms).filter(Boolean)),s3:Math.min(...t.map(n=>n.sector3Ms).filter(Boolean))}:null}function ns({active:s,dir:r}){return s?r==="asc"?e.jsx("svg",{className:"pvx-sort-icon",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.5 15.75l7.5-7.5 7.5 7.5"})}):e.jsx("svg",{className:"pvx-sort-icon",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19.5 8.25l-7.5 7.5-7.5-7.5"})}):e.jsx("svg",{className:"pvx-sort-icon pvx-sort-icon--inactive",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 9l4-4 4 4M16 15l-4 4-4-4"})})}function R({label:s,sortKey:r,config:t,onSort:n,className:a=""}){return e.jsx("th",{className:`pvx-th pvx-th--sortable ${a}`,onClick:()=>n(r),children:e.jsxs("span",{className:"pvx-th-inner",children:[s,e.jsx(ns,{active:t.key===r,dir:t.dir})]})})}function J({userId:s,getUserDisplay:r}){const{displayName:t,avatarUrl:n}=r(s);return e.jsxs("span",{className:"pvx-driver",children:[n?e.jsx("img",{src:n,alt:"",className:"pvx-driver-avatar"}):e.jsx("span",{className:"pvx-driver-avatar pvx-driver-avatar--placeholder"}),e.jsx("span",{className:"pvx-driver-name",children:t})]})}function ye({rank:s,podium:r=!1}){const t=r?s===1?"pvx-rank pvx-rank--gold":s===2?"pvx-rank pvx-rank--silver":s===3?"pvx-rank pvx-rank--bronze":"pvx-rank":"pvx-rank";return e.jsx("span",{className:t,children:s})}function Ce({availableTags:s,activeTags:r,onToggle:t,onClear:n}){if(!s||s.length<2)return null;const a=ge.map(i=>({id:i.id,tags:i.tags.filter(l=>s.includes(l))})).filter(i=>i.tags.length>0);return e.jsxs("div",{className:"pvx-tag-bar",children:[e.jsx("button",{onClick:n,className:`pvx-tag ${r.size===0?"pvx-tag--active":""}`,children:"All"}),a.map((i,l)=>e.jsxs("span",{className:"contents",children:[l>0&&e.jsx("span",{className:"pvx-tag-separator"}),i.tags.map(o=>e.jsx("button",{onClick:()=>t(o),className:`pvx-tag ${r.has(o)?"pvx-tag--active":""}`,children:ts[o]||o},o))]},i.id))]})}function X({segments:s}){return e.jsx("nav",{className:"pvx-breadcrumb","aria-label":"Breadcrumb",children:e.jsx("ol",{className:"pvx-breadcrumb-list",children:s.map((r,t)=>{const n=t===s.length-1;return e.jsxs("li",{className:"pvx-breadcrumb-item",children:[t>0&&e.jsx("svg",{className:"pvx-breadcrumb-chevron",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8.25 4.5l7.5 7.5-7.5 7.5"})}),!n&&r.onClick?e.jsx("button",{onClick:r.onClick,className:"pvx-breadcrumb-link",children:r.label}):e.jsx("span",{className:"pvx-breadcrumb-current",children:r.label})]},r.key)})})})}function q({message:s}){return e.jsxs("div",{className:"pvx-empty",children:[e.jsx("svg",{className:"pvx-empty-icon",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.5 18.75h-9m9 0a3 3 0 013 3h-15a3 3 0 013-3m9 0v-4.5A3.375 3.375 0 0013.125 10.875h-2.25A3.375 3.375 0 007.5 14.25v4.5"})}),e.jsx("p",{children:s})]})}function _(){return e.jsx("div",{className:"pvx-loading",children:"Loading..."})}function as(){return e.jsx("svg",{className:"pvx-icon pvx-icon--valid",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.5 12.75l6 6 9-13.5"})})}function is(){return e.jsx("svg",{className:"pvx-icon pvx-icon--invalid",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})}function we({tracks:s,isLoading:r,carMetadata:t,getUserDisplay:n,onTrackSelect:a}){const[i,l]=z({key:"record.timestamp",dir:"desc"}),{activeTags:o,toggle:x,clear:c}=Ne(),v=b.useMemo(()=>{var h;if(!((h=t==null?void 0:t.tags)!=null&&h.length))return[];const m=new Set;for(const d of s||[])d.recordByTag&&Object.keys(d.recordByTag).forEach(u=>m.add(u));return t.tags.filter(d=>m.has(d))},[s,t]),g=b.useMemo(()=>s?o.size===0?s:s.map(m=>{var u,p;if(!m.recordByTag)return null;let h=null;const d=new Set;for(const N of Object.values(m.recordByTag)){if(d.has(N.carId))continue;d.add(N.carId);const y=((p=(u=t==null?void 0:t.cars)==null?void 0:u[N.carId])==null?void 0:p.tags)||["sports_car"];fe(y,o)&&(!h||N.lapTimeMs<h.lapTimeMs)&&(h=N)}return h?{...m,record:{visibleId:h.steamId||h.identifier,carId:h.carId,carDisplayName:$(h.carId),lapTimeMs:h.lapTimeMs,timestamp:h.recordedAt}}:null}).filter(Boolean):[],[s,o,t]),j=b.useMemo(()=>Z(g,i,(m,h)=>{var d,u;switch(h){case"displayName":return m.displayName;case"record.lapTimeMs":return(d=m.record)==null?void 0:d.lapTimeMs;case"driverCount":return m.driverCount||0;case"carCount":return m.carCount||0;case"record.timestamp":default:return(u=m.record)!=null&&u.timestamp?new Date(m.record.timestamp).getTime():0}}),[g,i]);return r?e.jsx(_,{}):s!=null&&s.length?e.jsxs("div",{className:"pvx-card",children:[e.jsx("div",{className:"pvx-card-header",children:e.jsx("h2",{className:"pvx-card-title",children:"Track Records"})}),e.jsx(Ce,{availableTags:v,activeTags:o,onToggle:x,onClear:c}),e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx(R,{label:"Track",sortKey:"displayName",config:i,onSort:l}),e.jsx("th",{className:"pvx-th",children:"Record Holder"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Car"}),e.jsx(R,{label:"Lap Time",sortKey:"record.lapTimeMs",config:i,onSort:l}),e.jsx(R,{label:"Drivers",sortKey:"driverCount",config:i,onSort:l,className:"pvx-hidden-below-md"}),e.jsx(R,{label:"Cars",sortKey:"carCount",config:i,onSort:l,className:"pvx-hidden-below-lg"}),e.jsx(R,{label:"Date",sortKey:"record.timestamp",config:i,onSort:l,className:"pvx-hidden-below-xl"})]})}),e.jsx("tbody",{className:"pvx-tbody",children:j.map(m=>{var h,d,u;return e.jsxs("tr",{className:"pvx-row pvx-row--clickable",onClick:()=>a(m.id,m.layout),children:[e.jsx("td",{className:"pvx-td pvx-td--primary",children:m.displayName}),e.jsx("td",{className:"pvx-td",children:(h=m.record)!=null&&h.visibleId?e.jsx(J,{userId:m.record.visibleId,getUserDisplay:n}):"-"}),e.jsx("td",{className:"pvx-td pvx-hidden-below-lg",children:((d=m.record)==null?void 0:d.carDisplayName)||"-"}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:m.record?A(m.record.lapTimeMs):"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-md",children:m.driverCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:m.carCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:(u=m.record)!=null&&u.timestamp?U(m.record.timestamp):"-"})]},`${m.id}|${m.layout||""}`)})})]})})]}):e.jsx(q,{message:"No lap times recorded yet."})}function ke({entries:s,isLoading:r,track:t,carMetadata:n,getUserDisplay:a,onCarSelect:i,onNavigate:l}){const[o,x]=z({key:"lapTimeMs",dir:"asc"}),{activeTags:c,toggle:v,clear:g}=Ne(),j=b.useMemo(()=>{var p,N,y;if(!s||!((p=n==null?void 0:n.tags)!=null&&p.length))return[];const u=new Set;for(const L of s)(((y=(N=n.cars)==null?void 0:N[L.carId])==null?void 0:y.tags)||["sports_car"]).forEach(T=>u.add(T));return n.tags.filter(L=>u.has(L))},[s,n]),m=b.useMemo(()=>s?c.size===0?s:s.filter(u=>{var N,y;const p=((y=(N=n==null?void 0:n.cars)==null?void 0:N[u.carId])==null?void 0:y.tags)||["sports_car"];return fe(p,c)}):[],[s,c,n]),h=b.useMemo(()=>Z(m,o,(u,p)=>{switch(p){case"carId":return $(u.carId);case"driverCount":return u.driverCount||0;case"lapTimeMs":default:return u.lapTimeMs}}),[m,o]),d=[{key:"tracks",label:"Tracks",onClick:()=>l("tracks")},{key:"track",label:t.displayName}];return r?e.jsx(_,{}):e.jsxs("div",{className:"pvx-card",children:[e.jsx("div",{className:"pvx-card-header",children:e.jsx(X,{segments:d})}),e.jsx(Ce,{availableTags:j,activeTags:c,onToggle:v,onClear:g}),s!=null&&s.length?e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"#"}),e.jsx(R,{label:"Car",sortKey:"carId",config:o,onSort:x}),e.jsx("th",{className:"pvx-th",children:"Record Holder"}),e.jsx(R,{label:"Lap Time",sortKey:"lapTimeMs",config:o,onSort:x}),e.jsx(R,{label:"Drivers",sortKey:"driverCount",config:o,onSort:x,className:"pvx-hidden-below-md"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Date"})]})}),e.jsx("tbody",{className:"pvx-tbody",children:h.map((u,p)=>e.jsxs("tr",{className:"pvx-row pvx-row--clickable",onClick:()=>i(u.carId),children:[e.jsx("td",{className:"pvx-td",children:e.jsx(ye,{rank:p+1,podium:!0})}),e.jsx("td",{className:"pvx-td pvx-td--primary",children:$(u.carId)}),e.jsx("td",{className:"pvx-td",children:e.jsx(J,{userId:u.steamId||u.userId,getUserDisplay:a})}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:A(u.lapTimeMs)}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-md",children:u.driverCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-lg",children:u.recordedAt?U(u.recordedAt):"-"})]},u.carId))})]})}):e.jsx(q,{message:"No lap times for this track yet."})]})}function Te({entries:s,isLoading:r,track:t,carId:n,getUserDisplay:a,onDriverSelect:i,onNavigate:l}){const[o,x]=z({key:"lapTimeMs",dir:"asc"}),c=b.useMemo(()=>be(s),[s]),v=b.useMemo(()=>Z(s||[],o,(j,m)=>{switch(m){case"userId":return a(j.steamId||j.userId).displayName;case"lapCount":return j.lapCount||0;case"lapTimeMs":default:return j.lapTimeMs}}),[s,o,a]),g=[{key:"tracks",label:"Tracks",onClick:()=>l("tracks")},{key:"track",label:t.displayName,onClick:()=>l("track")},{key:"car",label:$(n)}];return r?e.jsx(_,{}):e.jsxs("div",{className:"pvx-card",children:[e.jsx("div",{className:"pvx-card-header",children:e.jsx(X,{segments:g})}),s!=null&&s.length?e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"#"}),e.jsx(R,{label:"Driver",sortKey:"userId",config:o,onSort:x}),e.jsx(R,{label:"Lap Time",sortKey:"lapTimeMs",config:o,onSort:x}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S1"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S2"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S3"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Tyre"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-xl",children:"Fuel"}),e.jsx(R,{label:"Laps",sortKey:"lapCount",config:o,onSort:x,className:"pvx-hidden-below-lg"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-xl",children:"Date"})]})}),e.jsx("tbody",{className:"pvx-tbody",children:v.map((j,m)=>{const h=m+1,d=j.steamId||j.userId,u=c&&j.sector1Ms===c.s1,p=c&&j.sector2Ms===c.s2,N=c&&j.sector3Ms===c.s3;return e.jsxs("tr",{className:`pvx-row pvx-row--clickable ${h<=3?"pvx-row--podium":""}`,onClick:()=>i(d),children:[e.jsx("td",{className:"pvx-td",children:e.jsx(ye,{rank:h,podium:!0})}),e.jsx("td",{className:"pvx-td pvx-td--primary",children:e.jsx(J,{userId:d,getUserDisplay:a})}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:A(j.lapTimeMs)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${u?"pvx-td--best-sector":""}`,children:B(j.sector1Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${p?"pvx-td--best-sector":""}`,children:B(j.sector2Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${N?"pvx-td--best-sector":""}`,children:B(j.sector3Ms)}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",title:Q(j.tyreCompound),children:j.tyreCompound||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-xl",children:j.startingFuelL?`${j.startingFuelL}L`:"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:j.lapCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:j.recordedAt?U(j.recordedAt):"-"})]},d)})})]})}):e.jsx(q,{message:"No lap times for this car yet."})]})}function Se({userId:s,track:r,carId:t,game:n,gameVersion:a,showInvalid:i,getUserDisplay:l,onToggleInvalid:o,onNavigate:x}){const{data:c,driverName:v,isLoading:g}=ie(s,r.id,r.layout,t,{showInvalid:i,game:n,gameVersion:a}),{displayName:j,avatarUrl:m}=l(s,v),h=b.useMemo(()=>be(c,!0),[c]),d=b.useMemo(()=>{const p=(c==null?void 0:c.filter(N=>N.isValid))||[];return p.length?Math.min(...p.map(N=>N.lapTimeMs)):null},[c]),u=[{key:"tracks",label:"Tracks",onClick:()=>x("tracks")},{key:"track",label:r.displayName,onClick:()=>x("track")},{key:"car",label:$(t),onClick:()=>x("car")},{key:"driver",label:j}];return g?e.jsx(_,{}):e.jsxs("div",{className:"pvx-card",children:[e.jsxs("div",{className:"pvx-card-header pvx-card-header--split",children:[e.jsxs("div",{className:"pvx-card-header-left",children:[e.jsx(X,{segments:u}),m?e.jsx("img",{src:m,alt:"",className:"pvx-driver-avatar pvx-driver-avatar--lg"}):e.jsx("span",{className:"pvx-driver-avatar pvx-driver-avatar--lg pvx-driver-avatar--placeholder"})]}),e.jsxs("label",{className:"pvx-checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:i,onChange:o,className:"pvx-checkbox"}),e.jsx("span",{children:"Show invalid laps"})]})]}),c!=null&&c.length?e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"#"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-md",children:"Lap"}),e.jsx("th",{className:"pvx-th",children:"Lap Time"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S1"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S2"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S3"}),e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"Valid"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Tyre"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Fuel"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-xl",children:"Date"})]})}),e.jsx("tbody",{className:"pvx-tbody",children:c.map((p,N)=>{const y=p.isValid&&p.lapTimeMs===d,L=h&&p.isValid&&p.sector1Ms===h.s1,V=h&&p.isValid&&p.sector2Ms===h.s2,T=h&&p.isValid&&p.sector3Ms===h.s3;let P="pvx-row";return p.isValid||(P+=" pvx-row--invalid"),y&&(P+=" pvx-row--personal-best"),e.jsxs("tr",{className:P,children:[e.jsx("td",{className:"pvx-td",children:e.jsx("span",{className:`pvx-rank ${y?"pvx-rank--gold":""}`,children:N+1})}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-md",children:p.lapNumber||"-"}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:A(p.lapTimeMs)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${L?"pvx-td--best-sector":""}`,children:B(p.sector1Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${V?"pvx-td--best-sector":""}`,children:B(p.sector2Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${T?"pvx-td--best-sector":""}`,children:B(p.sector3Ms)}),e.jsx("td",{className:"pvx-td",title:p.isValid?void 0:p.invalidReason||"Invalid",children:p.isValid?e.jsx(as,{}):e.jsx(is,{})}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",title:Q(p.tyreCompound),children:p.tyreCompound||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:p.startingFuelL?`${p.startingFuelL}L`:"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:U(p.timestamp)})]},p.id)})})]})}):e.jsx(q,{message:i?"No laps recorded for this combination.":'No valid laps. Try enabling "Show invalid laps".'})]})}function os({className:s,defaultGame:r="evo",title:t="Leaderboards"}){const[n,a]=ne.useSearchParams(),i=oe(),l=le(),o=n.get("game")||r,x=n.get("version"),c=n.get("track"),v=n.get("car"),g=n.get("driver"),j=n.get("invalid")==="true",{data:m,isLoading:h,generatedAt:d,totalLaps:u,totalUsers:p,versions:N}=ae({game:o}),y=N==null?void 0:N[o],L=x||(y==null?void 0:y.default)||null,V=b.useMemo(()=>!m||!L?m||[]:m.filter(f=>f.gameVersion===L),[m,L]),T=b.useMemo(()=>{if(!c)return null;const[f,w]=c.split("|");return{id:f,layout:w||null,displayName:F(f,w,o)}},[c,o]),{data:P,isLoading:Y}=W(T==null?void 0:T.id,T==null?void 0:T.layout,{carId:v,game:o,gameVersion:L});function D(f){a(f)}function _e(f){D({game:f})}function Ke(f){const w={game:o};f&&f!==(y==null?void 0:y.default)&&(w.version=f),D(w)}function He(f,w){const ee={game:o,track:w?`${f}|${w}`:f};x&&(ee.version=x),D(ee)}function Oe(f){const w={game:o,track:c};x&&(w.version=x),f&&(w.car=f),D(w)}function Qe(f){const w={game:o,track:c,car:v,driver:f};x&&(w.version=x),D(w)}function K(f){const w={game:o};x&&(w.version=x),(f==="track"||f==="car")&&(w.track=c),f==="car"&&(w.car=v),D(w)}function We(){const f={game:o,track:c,car:v,driver:g};x&&(f.version=x),j||(f.invalid="true"),D(f)}const Ge=()=>T&&v&&g?e.jsx(Se,{userId:g,track:T,carId:v,game:o,gameVersion:L,showInvalid:j,getUserDisplay:i,onToggleInvalid:We,onNavigate:K}):T&&v?e.jsx(Te,{entries:P||[],isLoading:Y,track:T,carId:v,getUserDisplay:i,onDriverSelect:Qe,onNavigate:K}):T?e.jsx(ke,{entries:P||[],isLoading:Y,track:T,carMetadata:l,getUserDisplay:i,onCarSelect:Oe,onNavigate:K}):e.jsx(we,{tracks:V,isLoading:h,carMetadata:l,getUserDisplay:i,onTrackSelect:He});return e.jsxs("div",{className:`pvx-leaderboard-explorer ${s||""}`,children:[e.jsxs("div",{className:"pvx-explorer-header",children:[e.jsx("h1",{className:"pvx-explorer-title",children:t}),e.jsxs("div",{className:"pvx-explorer-stats",children:[u>0&&e.jsxs("span",{children:[u.toLocaleString()," laps"]}),u>0&&p>0&&e.jsx("span",{className:"pvx-explorer-stats-sep",children:"|"}),p>0&&e.jsxs("span",{children:[p.toLocaleString()," drivers"]})]})]}),e.jsxs("div",{className:"pvx-explorer-controls",children:[e.jsx("div",{className:"pvx-game-tabs",children:["evo","acc"].map(f=>e.jsx("button",{onClick:()=>_e(f),className:`pvx-game-tab ${o===f?"pvx-game-tab--active":""}`,children:f==="evo"?"AC EVO":"ACC"},f))}),y&&e.jsx("select",{value:L||"",onChange:f=>Ke(f.target.value),className:"pvx-version-select",children:y.available.slice().reverse().map(f=>e.jsxs("option",{value:f,children:["v",f,f===y.default?" (Latest)":""]},f))})]}),Ge(),d&&e.jsxs("p",{className:"pvx-data-timestamp",children:["Data updated: ",new Date(d).toLocaleString()]})]})}const ls={GBR:"🇬🇧",DEU:"🇩🇪",NLD:"🇳🇱",SWE:"🇸🇪",ESP:"🇪🇸",ZAF:"🇿🇦",FRA:"🇫🇷",ITA:"🇮🇹",USA:"🇺🇸",AUS:"🇦🇺",BRA:"🇧🇷",JPN:"🇯🇵",CAN:"🇨🇦",POL:"🇵🇱",AUT:"🇦🇹",BEL:"🇧🇪",PRT:"🇵🇹",NOR:"🇳🇴",DNK:"🇩🇰",FIN:"🇫🇮",IRL:"🇮🇪",CHE:"🇨🇭",NZL:"🇳🇿",MEX:"🇲🇽",ARG:"🇦🇷",CZE:"🇨🇿",HUN:"🇭🇺",RUS:"🇷🇺",TUR:"🇹🇷",KOR:"🇰🇷"},cs={championship:"Championship",series:"Series",event:"Event"},se=["PRACTICE","QUALIFYING","RACE"];function Le({position:s}){const r=s===1?"pvx-rank pvx-rank--gold":s===2?"pvx-rank pvx-rank--silver":s===3?"pvx-rank pvx-rank--bronze":"pvx-rank";return e.jsx("span",{className:r,children:s})}function Re({nation:s}){const r=s&&ls[s];return r?e.jsx("span",{className:"pvx-nation-flag",title:s,children:r}):null}function ds({sessions:s,activeSession:r,onSelect:t}){if(!s||s.length<=1)return null;const n=[...s].sort((a,i)=>se.indexOf(a.type)-se.indexOf(i.type));return e.jsx("div",{className:"pvx-session-tabs",children:n.map(a=>e.jsx("button",{onClick:()=>t(a.type),className:`pvx-session-tab ${r===a.type?"pvx-session-tab--active":""}`,children:a.type},a.type))})}function $e({type:s}){return e.jsx("span",{className:`pvx-comp-badge pvx-comp-badge--${s}`,children:cs[s]||s})}function I({children:s,variant:r="default"}){return e.jsx("span",{className:`pvx-info-pill ${r!=="default"?`pvx-info-pill--${r}`:""}`,children:s})}function Me(s){if(!s)return"TBD";const r=new Date(s);if(isNaN(r))return"TBD";const t=r.toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short"}),n=r.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit"});return`${t} • ${n}`}function ps(s){return s.reduce((r,t)=>{var n;return(n=t.splits)!=null&&n.length?r?r.map((a,i)=>{const l=t.splits[i];return l&&l<a?l:a}):[...t.splits]:r},null)}function E({message:s="Loading..."}){return e.jsx("div",{className:"pvx-loading",children:s})}function M({message:s="No data available."}){return e.jsx("div",{className:"pvx-empty",children:e.jsx("p",{children:s})})}function De({competitions:s,isLoading:r,onSelect:t,className:n}){return r?e.jsx(E,{message:"Loading competitions..."}):s!=null&&s.length?e.jsx("div",{className:`pvx-comp-grid ${n||""}`,children:s.map(a=>e.jsx(xs,{comp:a,onSelect:t},a.id))}):e.jsx(M,{message:"No competitions available."})}function xs({comp:s,onSelect:r}){var h,d,u;const{cdnUrl:t}=k(),n=s.posterCdnPath?`${t}/${s.posterCdnPath}`:null,a=s.registration,i=(a==null?void 0:a.currentCount)||0,l=a==null?void 0:a.maxParticipants,o=l&&i>=l,x=(a==null?void 0:a.deadline)&&new Date(a.deadline)<new Date,c=(a==null?void 0:a.isOpen)&&!x&&!o,v=new Date,g=(h=s.rounds)==null?void 0:h.find(p=>p.startTime&&new Date(p.startTime)>=v),j=((d=s.rounds)==null?void 0:d.length)||0,m=((u=s.rounds)==null?void 0:u.filter(p=>p.isFinalized).length)||0;return e.jsxs("div",{className:"pvx-comp-card",onClick:()=>r(s.id),role:"button",tabIndex:0,onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),r(s.id))},children:[e.jsx("div",{className:"pvx-comp-card-poster",children:n?e.jsx("img",{src:n,alt:s.name,className:"pvx-comp-card-poster-img"}):e.jsx("div",{className:"pvx-comp-card-poster-placeholder",children:e.jsx(us,{})})}),e.jsxs("div",{className:"pvx-comp-card-body",children:[e.jsx("h3",{className:"pvx-comp-card-title",children:s.name}),s.description&&e.jsx("p",{className:"pvx-comp-card-desc",children:s.description}),e.jsxs("div",{className:"pvx-comp-card-pills",children:[e.jsx($e,{type:s.type}),s.game&&e.jsx(I,{children:s.game.toUpperCase()}),s.formatDescription&&s.formatDescription.split(", ").map((p,N)=>e.jsx(I,{variant:"format",children:p},N))]}),s.carsDescription&&e.jsx("div",{className:"pvx-comp-card-pills",children:s.carsDescription.split(", ").map((p,N)=>e.jsx(I,{children:p},N))}),e.jsxs("div",{className:"pvx-comp-card-schedule",children:[g?e.jsxs("span",{className:"pvx-comp-card-schedule-next",children:[e.jsx("span",{className:"pvx-comp-card-schedule-label",children:"Next:"})," ","R",g.roundNumber," ",g.track||"TBD"," — ",Me(g.startTime)]}):j>0?e.jsxs("span",{className:"pvx-comp-card-schedule-next",children:[m,"/",j," rounds completed"]}):null,j>0&&e.jsxs("span",{className:"pvx-comp-card-round-count",children:[j," round",j!==1?"s":""]})]}),a&&e.jsxs("div",{className:"pvx-comp-card-reg",children:[e.jsx("span",{className:`pvx-comp-reg-badge ${c?"pvx-comp-reg-badge--open":o?"pvx-comp-reg-badge--full":"pvx-comp-reg-badge--closed"}`,children:c?"Registration Open":o?"Full":"Registration Closed"}),e.jsxs("span",{className:"pvx-comp-reg-count",children:[i,"/",l||"∞"," drivers"]})]})]})]})}function us(){return e.jsxs("svg",{className:"pvx-comp-trophy-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M6 9H4.5a2.5 2.5 0 0 1 0-5H6"}),e.jsx("path",{d:"M18 9h1.5a2.5 2.5 0 0 0 0-5H18"}),e.jsx("path",{d:"M4 22h16"}),e.jsx("path",{d:"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22"}),e.jsx("path",{d:"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22"}),e.jsx("path",{d:"M18 2H6v7a6 6 0 0 0 12 0V2Z"})]})}function Be({competitionId:s,className:r}){var o,x;const{data:t,isLoading:n}=de(s),{data:a,isLoading:i}=G(s);if(n||i)return e.jsx(E,{message:"Loading standings..."});if(!((o=t==null?void 0:t.standings)!=null&&o.length))return e.jsx(M,{message:"No standings data yet. Results will appear once rounds are finalised."});const l=((x=a==null?void 0:a.rounds)==null?void 0:x.filter(c=>c.isFinalized))||[];return e.jsxs("div",{className:`pvx-card ${r||""}`,children:[e.jsx("div",{className:"pvx-card-header--split",children:e.jsxs("div",{className:"pvx-card-header-left",children:[e.jsx("h3",{className:"pvx-card-title",children:"Championship Standings"}),e.jsxs("span",{className:"pvx-standings-subtitle",children:["After ",t.roundsCompleted," round",t.roundsCompleted!==1?"s":"",t.countingRounds>0&&` (best ${t.countingRounds} count)`]})]})}),e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"Pos"}),e.jsx("th",{className:"pvx-th",children:"Driver"}),e.jsx("th",{className:"pvx-th pvx-th--center pvx-hidden-below-sm",children:"W"}),e.jsx("th",{className:"pvx-th pvx-th--center pvx-hidden-below-sm",children:"Pod"}),e.jsx("th",{className:"pvx-th pvx-th--center",children:"Points"}),l.map(c=>e.jsxs("th",{className:"pvx-th pvx-th--center pvx-hidden-below-md",title:c.track||`Round ${c.roundNumber}`,children:["R",c.roundNumber]},c.roundNumber))]})}),e.jsx("tbody",{className:"pvx-tbody",children:t.standings.map(c=>e.jsx(ms,{driver:c,finalizedRounds:l},c.driverId||c.driverName))})]})})]})}function ms({driver:s,finalizedRounds:r}){var l,o,x;const t=s.position<=3,n=new Map(((l=s.roundResults)==null?void 0:l.map(c=>[c.roundNumber,c]))||[]),a=((o=s.roundResults)==null?void 0:o.filter(c=>c.position===1).length)||0,i=((x=s.roundResults)==null?void 0:x.filter(c=>c.position<=3).length)||0;return e.jsxs("tr",{className:`pvx-row ${t?"pvx-row--podium":""}`,children:[e.jsx("td",{className:"pvx-td",children:e.jsx(Le,{position:s.position})}),e.jsxs("td",{className:"pvx-td pvx-td--primary",children:[e.jsx(Re,{nation:s.nation}),s.driverName]}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-sm",children:a||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-sm",children:i||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-standings-total",children:s.totalPoints}),r.map(c=>{const v=n.get(c.roundNumber),g=v==null?void 0:v.dropped;return e.jsx("td",{className:`pvx-td pvx-td--center pvx-hidden-below-md ${!g&&(v==null?void 0:v.position)<=3?"pvx-standings-cell--podium":""}`,children:v?e.jsxs("div",{className:`pvx-standings-round-cell ${g?"pvx-standings-round-cell--dropped":""}`,children:[e.jsxs("span",{className:"pvx-standings-round-pos",children:["P",v.position]}),e.jsx("span",{className:"pvx-standings-round-pts",children:v.points})]}):e.jsx("span",{className:"pvx-td--muted",children:"-"})},c.roundNumber)})]})}function Pe({competitionId:s,roundNumber:r,className:t}){var v,g;const{data:n,isLoading:a}=pe(s,r),[i,l]=b.useState(null);if(a)return e.jsx(E,{message:"Loading results..."});if(!n)return e.jsx(M,{message:"No results for this round."});const o=n.sessions||[];if(!o.length)return e.jsx(M,{message:"No session data for this round."});const x=i||((v=o.find(j=>j.type==="RACE"))==null?void 0:v.type)||((g=o[0])==null?void 0:g.type),c=o.find(j=>j.type===x)||o[0];return e.jsxs("div",{className:`pvx-round-results ${t||""}`,children:[e.jsxs("div",{className:"pvx-round-results-header",children:[e.jsxs("div",{children:[e.jsxs("h4",{className:"pvx-round-results-title",children:["Round ",n.roundNumber,n.track?`: ${n.track}`:""]}),n.startTime&&e.jsx("p",{className:"pvx-round-results-date",children:new Date(n.startTime).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric"})})]}),e.jsx(vs,{sessions:o})]}),e.jsx(ds,{sessions:o,activeSession:x,onSelect:l}),e.jsx(hs,{session:c})]})}function vs({sessions:s}){var a;const r=s.find(i=>i.type==="RACE"),t=(a=r==null?void 0:r.results)==null?void 0:a.filter(i=>i.position<=3).sort((i,l)=>i.position-l.position);if(!(t!=null&&t.length))return null;const n=["🥇","🥈","🥉"];return e.jsx("div",{className:"pvx-round-podium-summary",children:t.map(i=>e.jsxs("span",{className:"pvx-round-podium-item",children:[e.jsx("span",{children:n[i.position-1]}),e.jsx("span",{children:i.driverName})]},i.driverId))})}function hs({session:s}){var n;const r=s.type==="RACE";if(!((n=s.results)!=null&&n.length))return e.jsx(M,{message:`No results for ${s.type}.`});const t=ps(s.results);return e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"Pos"}),e.jsx("th",{className:"pvx-th",children:"Driver"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"Car"}),e.jsx("th",{className:"pvx-th",children:"Best Lap"}),r&&e.jsxs(e.Fragment,{children:[e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"Laps"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"Time / Gap"}),e.jsx("th",{className:"pvx-th pvx-th--center",children:"Points"})]})]})}),e.jsx("tbody",{className:"pvx-tbody",children:s.results.map((a,i)=>e.jsx(js,{result:a,isRace:r,fastestSplits:t,rowIndex:i},a.driverId||i))})]})})}function js({result:s,isRace:r,fastestSplits:t,rowIndex:n}){const a=s.position<=3;return e.jsxs("tr",{className:`pvx-row ${a?"pvx-row--podium":""}`,children:[e.jsx("td",{className:"pvx-td",children:e.jsx(Le,{position:s.position})}),e.jsxs("td",{className:"pvx-td pvx-td--primary",children:[e.jsx(Re,{nation:s.nation}),s.driverName,s.carNumber!=null&&e.jsxs("span",{className:"pvx-car-number",children:["#",s.carNumber]}),s.penalty&&e.jsx("span",{className:"pvx-penalty",children:s.penalty})]}),e.jsx("td",{className:"pvx-td pvx-hidden-below-sm",children:$(s.carId)}),e.jsx("td",{className:"pvx-td pvx-td--mono",children:e.jsx(gs,{bestLap:s.bestLapFormatted,hasBestLap:s.hasBestLap,splits:s.splits,fastestSplits:t,showAbove:n<=1})}),r&&e.jsxs(e.Fragment,{children:[e.jsx("td",{className:"pvx-td pvx-hidden-below-sm",children:s.lapsCompleted}),e.jsx("td",{className:"pvx-td pvx-td--mono pvx-td--muted pvx-hidden-below-sm",children:s.position===1?s.totalTime||"-":s.gap||"-"}),e.jsxs("td",{className:"pvx-td pvx-td--center",children:[e.jsx("span",{className:"pvx-session-points",children:s.points}),s.pointsOverride!==0&&s.pointsOverride&&e.jsxs("span",{className:"pvx-points-override",children:["(",s.pointsOverride>0?"+":"",s.pointsOverride,")"]})]})]})]})}function gs({bestLap:s,hasBestLap:r,splits:t,fastestSplits:n,showAbove:a}){return s?e.jsxs("span",{className:`pvx-best-lap-cell ${r?"pvx-best-lap-cell--fastest":""}`,children:[e.jsx("span",{className:"pvx-best-lap-time",children:s}),(t==null?void 0:t.length)>0&&e.jsx("span",{className:"pvx-splits-tooltip-anchor",children:e.jsx("span",{className:`pvx-splits-tooltip ${a?"":"pvx-splits-tooltip--above"}`,children:t.map((i,l)=>{const o=n&&i===n[l];return e.jsxs("span",{className:"pvx-splits-tooltip-row",children:[e.jsxs("span",{className:"pvx-splits-tooltip-label",children:["S",l+1]}),e.jsx("span",{className:o?"pvx-splits-tooltip-best":"",children:i})]},l)})})})]}):e.jsx("span",{className:"pvx-td--muted",children:"-"})}function Ie({competitionId:s,className:r}){const{data:t,isLoading:n}=xe(s);if(n)return e.jsx(E,{message:"Loading drivers..."});const a=(t==null?void 0:t.drivers)||(t==null?void 0:t.entries)||[];return a.length?e.jsx("div",{className:`pvx-entry-grid ${r||""}`,children:a.map(i=>{var l,o;return e.jsxs("div",{className:"pvx-entry-card",children:[i.avatarUrl?e.jsx("img",{src:i.avatarUrl,alt:"",className:"pvx-entry-avatar"}):e.jsx("div",{className:"pvx-entry-avatar pvx-entry-avatar--placeholder",children:((o=(l=i.displayName)==null?void 0:l.charAt(0))==null?void 0:o.toUpperCase())||"?"}),e.jsx("span",{className:"pvx-entry-name",children:i.displayName})]},i.steamId||i.driverId)})}):e.jsx(M,{message:"No drivers registered yet."})}function Ae({competitionId:s,driverData:r,className:t,children:n}){const{data:a,isLoading:i}=ue(s),{isPowerMode:l}=he(),o=je(s),x=me(s),c=ve(s),v=(a==null?void 0:a.isRegistered)||!1,g=i||x.isPending||c.isPending,j=x.error||c.error||null,m=()=>{l&&r&&x.mutate(r)},h=()=>{l&&c.mutate()};return typeof n=="function"?n({isRegistered:v,isLoading:g,register:m,withdraw:h,error:j,isPowerMode:l,registrationUrl:o}):l?e.jsx("button",{className:`pvx-comp-register-btn ${t||""}`,onClick:v?h:m,disabled:g,children:g?"Loading...":v?"Withdraw":"Register"}):e.jsx("a",{href:o,target:"_blank",rel:"noopener noreferrer",className:`pvx-comp-register-link ${t||""}`,children:v?"View Registration":"Register on PitVox"})}const fs=[{id:"standings",label:"Standings"},{id:"rounds",label:"Rounds"},{id:"drivers",label:"Drivers"}];function Ns({className:s,title:r="Competitions"}){const[t,n]=ne.useSearchParams(),a=t.get("competition"),i=t.get("tab")||"standings",l=t.get("round")?Number(t.get("round")):null,{data:o,isLoading:x}=ce();function c(h){n({competition:h})}function v(){n({})}function g(h){n({competition:a,tab:h})}function j(h){n({competition:a,tab:"rounds",round:String(h)})}function m(){n({competition:a,tab:"rounds"})}return a?e.jsx("div",{className:`pvx-comp-explorer ${s||""}`,children:e.jsx(bs,{competitionId:a,activeTab:i,selectedRound:l,onBack:v,onTabChange:g,onSelectRound:j,onDeselectRound:m})}):e.jsxs("div",{className:`pvx-comp-explorer ${s||""}`,children:[e.jsxs("div",{className:"pvx-explorer-header",children:[e.jsx("h2",{className:"pvx-explorer-title",children:r}),!x&&(o==null?void 0:o.length)>0&&e.jsx("div",{className:"pvx-explorer-stats",children:e.jsxs("span",{children:[o.length," competition",o.length!==1?"s":""]})})]}),e.jsx(De,{competitions:o,isLoading:x,onSelect:c})]})}function bs({competitionId:s,activeTab:r,selectedRound:t,onBack:n,onTabChange:a,onSelectRound:i,onDeselectRound:l}){var h,d;const{data:o,isLoading:x}=G(s);if(x)return e.jsx(E,{message:"Loading competition..."});if(!o)return e.jsxs("div",{children:[e.jsx(M,{message:"Competition not found."}),e.jsx("div",{className:"pvx-comp-back-link-wrap",children:e.jsx("button",{onClick:n,className:"pvx-comp-back-link",children:"← Back to competitions"})})]});const c=o.type==="championship",v=((h=o.rounds)==null?void 0:h.filter(u=>u.isFinalized))||[],g=o.rounds||[],j=fs.filter(u=>!(u.id==="standings"&&!c||u.id==="rounds"&&v.length===0)),m=j.find(u=>u.id===r)?r:((d=j[0])==null?void 0:d.id)||"standings";return e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:n,className:"pvx-comp-back-link",children:"← Competitions"}),e.jsxs("div",{className:"pvx-comp-detail-header",children:[e.jsx("h2",{className:"pvx-explorer-title",children:o.name}),o.description&&e.jsx("p",{className:"pvx-comp-detail-desc",children:o.description}),e.jsxs("div",{className:"pvx-comp-detail-meta",children:[e.jsx($e,{type:o.type}),o.game&&e.jsx(I,{children:o.game.toUpperCase()}),o.countingRounds>0&&e.jsxs(I,{variant:"format",children:["Best ",o.countingRounds," of ",g.length," rounds count"]}),g.length>0&&e.jsxs(I,{children:[g.length," round",g.length!==1?"s":""]})]})]}),(()=>{const u=o.registration;if(!u)return null;const p=u.deadline&&new Date(u.deadline)<new Date,N=u.maxParticipants&&(u.currentCount||0)>=u.maxParticipants;return u.isOpen&&!p&&!N?e.jsx("div",{className:"pvx-comp-register-cta",children:e.jsx(Ae,{competitionId:s})}):null})(),g.length>0&&e.jsx(ys,{rounds:g}),j.length>1&&e.jsx("div",{className:"pvx-comp-tabs",children:j.map(u=>e.jsx("button",{onClick:()=>a(u.id),className:`pvx-comp-tab ${m===u.id?"pvx-comp-tab--active":""}`,children:u.label},u.id))}),m==="standings"&&e.jsx(Be,{competitionId:s}),m==="rounds"&&e.jsx(Cs,{competitionId:s,finalizedRounds:v,selectedRound:t,onSelectRound:i,onDeselectRound:l}),m==="drivers"&&e.jsx(Ie,{competitionId:s})]})}function ys({rounds:s}){const r=new Date,t=s.find(n=>n.startTime&&new Date(n.startTime)>=r);return e.jsx("div",{className:"pvx-comp-schedule",children:e.jsx("div",{className:"pvx-comp-schedule-list",children:s.map(n=>{const a=n===t,i=n.startTime&&new Date(n.startTime)<r;return e.jsxs("div",{className:`pvx-comp-schedule-item ${a?"pvx-comp-schedule-item--next":""} ${i?"pvx-comp-schedule-item--past":""}`,children:[e.jsxs("span",{className:"pvx-comp-schedule-round",children:["R",n.roundNumber]}),e.jsx("span",{className:"pvx-comp-schedule-track",children:n.track||"TBD"}),e.jsx("span",{className:"pvx-comp-schedule-date",children:Me(n.startTime)}),n.isFinalized&&e.jsx("span",{className:"pvx-comp-schedule-badge",children:"Results"})]},n.roundNumber)})})})}function Cs({competitionId:s,finalizedRounds:r,selectedRound:t,onSelectRound:n,onDeselectRound:a}){return r.length?e.jsxs("div",{className:"pvx-comp-rounds",children:[e.jsx("div",{className:"pvx-comp-round-pills",children:r.map(i=>e.jsxs("button",{onClick:()=>t===i.roundNumber?a():n(i.roundNumber),className:`pvx-comp-round-pill ${t===i.roundNumber?"pvx-comp-round-pill--active":""}`,children:[e.jsxs("span",{className:"pvx-comp-round-pill-num",children:["R",i.roundNumber]}),i.track&&e.jsx("span",{className:"pvx-comp-round-pill-track",children:i.track})]},i.roundNumber))}),t?e.jsx(Pe,{competitionId:s,roundNumber:t}):e.jsx("div",{className:"pvx-empty",children:e.jsx("p",{children:"Select a round to view results."})})]}):e.jsx(M,{message:"No finalised rounds yet."})}function Ue(s){const{cdnUrl:r,partnerSlug:t}=k(),n=C.useQuery({queryKey:["pitvox","laps",t,s],queryFn:()=>S(r,`laps/partners/${t}/${s}.json`),enabled:!!s,staleTime:3e4,refetchInterval:3e4}),a=n.data;return{isLoading:n.isLoading,error:n.error,data:a?{driverName:a.driverName||"Driver",lapCount:a.lapCount||0,trackBreakdown:a.trackBreakdown||[],carBreakdown:a.carBreakdown||[],recordsHeld:a.recordsHeld||0,currentRecords:a.currentRecords||[],bestRanking:a.bestRanking??null,bestRankingTrackId:a.bestRankingTrackId??null,bestRankingLayout:a.bestRankingLayout??null,bestRankingCarId:a.bestRankingCarId??null,generatedAt:a.generatedAt}:null}}function Fe(s){var i;const{cdnUrl:r,partnerSlug:t}=k(),n=C.useQuery({queryKey:["pitvox","ratings",t],queryFn:()=>S(r,`leaderboards/partners/${t}/ratings.json`),staleTime:6e4,refetchInterval:6e4}),a=b.useMemo(()=>{var l;return!((l=n.data)!=null&&l.drivers)||!s?null:n.data.drivers.find(o=>o.identifier===s)||null},[(i=n.data)==null?void 0:i.drivers,s]);return{isLoading:n.isLoading,error:n.error,data:a?{rating:a.rating,rank:a.rank,totalDrivers:n.data.driverCount||n.data.drivers.length,comboCount:a.comboCount||0,distinctCars:a.distinctCars||0,combos:a.combos||[]}:null}}function Ee({driverName:s,avatarUrl:r,memberSince:t,className:n=""}){const a=t?new Date(t).toLocaleDateString("en-GB",{day:"2-digit",month:"2-digit",year:"numeric"}):null;return e.jsxs("div",{className:`pvx-card pvx-dash-profile ${n}`,children:[r?e.jsx("img",{src:r,alt:"",className:"pvx-dash-profile-avatar"}):e.jsx("div",{className:"pvx-dash-profile-avatar pvx-dash-profile-avatar--placeholder",children:(s||"?")[0].toUpperCase()}),e.jsxs("div",{className:"pvx-dash-profile-info",children:[e.jsx("h2",{className:"pvx-dash-profile-name",children:s}),a&&e.jsxs("p",{className:"pvx-dash-profile-since",children:["Racing since ",a]})]})]})}function ws(){return e.jsxs("svg",{className:"pvx-dash-stat-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("line",{x1:"4",y1:"9",x2:"20",y2:"9"}),e.jsx("line",{x1:"4",y1:"15",x2:"20",y2:"15"}),e.jsx("line",{x1:"10",y1:"3",x2:"8",y2:"21"}),e.jsx("line",{x1:"16",y1:"3",x2:"14",y2:"21"})]})}function ks(){return e.jsxs("svg",{className:"pvx-dash-stat-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("circle",{cx:"12",cy:"12",r:"2"}),e.jsx("path",{d:"M12 14v4"}),e.jsx("path",{d:"M10.5 12.5l-4 2.5"}),e.jsx("path",{d:"M13.5 12.5l4 2.5"})]})}function Ts(){return e.jsx("svg",{className:"pvx-dash-stat-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("polygon",{points:"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"})})}function te({items:s,labelKey:r,countKey:t}){if(!(s!=null&&s.length))return null;const n=s.slice().sort((a,i)=>i[t]-a[t]).slice(0,10);return e.jsxs("div",{className:"pvx-dash-tooltip",children:[n.map((a,i)=>e.jsxs("div",{className:"pvx-dash-tooltip-row",children:[e.jsx("span",{className:"pvx-dash-tooltip-label",children:a[r]}),e.jsx("span",{className:"pvx-dash-tooltip-value",children:a[t]})]},i)),s.length>10&&e.jsxs("div",{className:"pvx-dash-tooltip-row pvx-dash-tooltip-more",children:["+",s.length-10," more"]})]})}function Ve({stats:s,rating:r,className:t=""}){if(!s)return null;const n=s.trackBreakdown.map(i=>({name:F(i.trackId,i.layout),lapCount:i.lapCount})),a=s.carBreakdown.map(i=>({name:$(i.carId),lapCount:i.lapCount}));return e.jsxs("div",{className:`pvx-dash-stats ${t}`,children:[e.jsxs("div",{className:"pvx-dash-stat-card pvx-dash-stat-card--has-tooltip",children:[e.jsx(ws,{}),e.jsxs("div",{className:"pvx-dash-stat-content",children:[e.jsx("span",{className:"pvx-dash-stat-value",children:s.lapCount.toLocaleString()}),e.jsx("span",{className:"pvx-dash-stat-label",children:"Total Laps"})]}),e.jsx(te,{items:n,labelKey:"name",countKey:"lapCount"})]}),e.jsxs("div",{className:"pvx-dash-stat-card pvx-dash-stat-card--has-tooltip",children:[e.jsx(ks,{}),e.jsxs("div",{className:"pvx-dash-stat-content",children:[e.jsx("span",{className:"pvx-dash-stat-value",children:s.carBreakdown.length}),e.jsx("span",{className:"pvx-dash-stat-label",children:"Cars Used"})]}),e.jsx(te,{items:a,labelKey:"name",countKey:"lapCount"})]}),r&&e.jsxs("div",{className:"pvx-dash-stat-card pvx-dash-stat-card--rating",children:[e.jsx(Ts,{}),e.jsxs("div",{className:"pvx-dash-stat-content",children:[e.jsx("span",{className:"pvx-dash-stat-value",children:r.rating.toFixed(1)}),e.jsx("span",{className:"pvx-dash-stat-label",children:"Driver Rating"}),e.jsxs("span",{className:"pvx-dash-stat-sub",children:["#",r.rank," of ",r.totalDrivers]})]})]})]})}const re=10;function qe({records:s,className:r=""}){const[t,n]=b.useState(!1),a=b.useMemo(()=>s!=null&&s.length?s.slice().sort((o,x)=>{const c=o.recordedAt?new Date(o.recordedAt).getTime():0;return(x.recordedAt?new Date(x.recordedAt).getTime():0)-c}):[],[s]);if(!a.length)return null;const i=t?a:a.slice(0,re),l=a.length>re;return e.jsxs("div",{className:`pvx-card ${r}`,children:[e.jsx("div",{className:"pvx-card-header",children:e.jsxs("h3",{className:"pvx-card-title",children:[e.jsx("span",{className:"pvx-dash-records-icon",children:e.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M6 9H4.5a2.5 2.5 0 010-5H6"}),e.jsx("path",{d:"M18 9h1.5a2.5 2.5 0 000-5H18"}),e.jsx("path",{d:"M4 22h16"}),e.jsx("path",{d:"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20 7 22"}),e.jsx("path",{d:"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20 17 22"}),e.jsx("path",{d:"M18 2H6v7a6 6 0 0012 0V2z"})]})}),"Current Records",e.jsxs("span",{className:"pvx-dash-records-count",children:["(",a.length,")"]})]})}),e.jsx("div",{className:"pvx-dash-records-list",children:i.map((o,x)=>e.jsxs("div",{className:"pvx-dash-record-row",children:[e.jsxs("div",{className:"pvx-dash-record-info",children:[e.jsx("span",{className:"pvx-dash-record-track",children:F(o.trackId,o.layout,o.game)}),e.jsx("span",{className:"pvx-dash-record-car",children:$(o.carId)})]}),e.jsxs("div",{className:"pvx-dash-record-time",children:[e.jsx("span",{className:"pvx-dash-record-lap",children:A(o.lapTimeMs)}),e.jsxs("span",{className:`pvx-dash-game-badge pvx-dash-game-badge--${o.game||"evo"}`,children:[(o.game||"evo").toUpperCase(),o.gameVersion?` ${o.gameVersion}`:""]})]})]},x))}),l&&e.jsx("button",{className:"pvx-dash-records-toggle",onClick:()=>n(!t),children:t?"Show less":`Show all ${a.length} records`})]})}function Ss({steamId:s,avatarUrl:r,memberSince:t,className:n=""}){const{data:a,isLoading:i,error:l}=Ue(s),{data:o,isLoading:x}=Fe(s);return i||x?e.jsx("div",{className:"pvx-loading",children:"Loading dashboard..."}):l?e.jsx("div",{className:"pvx-empty",children:"Failed to load dashboard data."}):a?e.jsxs("div",{className:`pvx-dash ${n}`,children:[e.jsx(Ee,{driverName:a.driverName,avatarUrl:r,memberSince:t}),e.jsx(Ve,{stats:a,rating:o}),e.jsx(qe,{records:a.currentRecords})]}):e.jsx("div",{className:"pvx-empty",children:"No data available yet. Start driving to see your stats!"})}exports.CarsTable=ke;exports.CompetitionCards=De;exports.CompetitionExplorer=Ns;exports.DriverDashboard=Ss;exports.DriverProfile=Ee;exports.DriversTable=Te;exports.EntryList=Ie;exports.LapHistoryTable=Se;exports.LeaderboardExplorer=os;exports.PitVoxPartnerProvider=Je;exports.RecordsTable=qe;exports.RegisterButton=Ae;exports.RoundResults=Pe;exports.StandingsTable=Be;exports.StatsCards=Ve;exports.TracksTable=we;exports.formatCarName=$;exports.formatDate=U;exports.formatDelta=Ye;exports.formatLapTime=A;exports.formatRelativeTime=Xe;exports.formatSectorTime=B;exports.formatTrackName=F;exports.formatTyreCompound=Q;exports.useCarLeaderboard=es;exports.useCarMetadata=le;exports.useCompetitionAllRounds=ss;exports.useCompetitionConfig=G;exports.useCompetitionEntryList=xe;exports.useCompetitionRound=pe;exports.useCompetitionStandings=de;exports.useCompetitions=ce;exports.useDriverLaps=ie;exports.useDriverRating=Fe;exports.useDriverStats=Ue;exports.useLeaderboardIndex=ae;exports.usePitVox=k;exports.useRegister=me;exports.useRegistrationMode=he;exports.useRegistrationStatus=ue;exports.useRegistrationUrl=je;exports.useTrackLeaderboard=W;exports.useUserLookup=oe;exports.useWithdraw=ve;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),N=require("react"),b=require("@tanstack/react-query"),H=N.createContext(null),Be="https://cdn.pitvox.com",Ue="https://pitvox.com";let K=null;function Ae({partnerSlug:s,cdnUrl:t=Be,pitvoxUrl:r=Ue,getSteamId:n,onRegister:a,onWithdraw:i,onFetchNotifications:o,onMarkNotificationRead:l,onMarkAllNotificationsRead:p,children:c}){const x=N.useMemo(()=>({partnerSlug:s,cdnUrl:t.replace(/\/$/,""),pitvoxUrl:r.replace(/\/$/,""),getSteamId:n||(()=>null),onRegister:a||null,onWithdraw:i||null,onFetchNotifications:o||null,onMarkNotificationRead:l||null,onMarkAllNotificationsRead:p||null}),[s,t,r,n,a,i,o,l,p]);let h=!1;try{b.useQueryClient(),h=!0}catch{h=!1}return h?e.jsx(H.Provider,{value:x,children:c}):(K||(K=new b.QueryClient({defaultOptions:{queries:{staleTime:6e4}}})),e.jsx(b.QueryClientProvider,{client:K,children:e.jsx(H.Provider,{value:x,children:c})}))}function y(){const s=N.useContext(H);if(!s)throw new Error("usePitVox must be used within a <PitVoxPartnerProvider>");return s}async function w(s,t){const r=await fetch(`${s}/${t}`);if(!r.ok){if(r.status===404||r.status===403)return null;throw new Error(`CDN fetch failed: ${r.status}`)}return r.json()}function $(s){if(!s&&s!==0)return"-";const t=Math.floor(s/1e3),r=Math.floor(t/60),n=t%60,a=s%1e3;return`${r}:${String(n).padStart(2,"0")}.${String(a).padStart(3,"0")}`}function S(s){return!s&&s!==0?"-":(s/1e3).toFixed(3)}function T(s){if(!s)return"";let t=s;return t.startsWith("ks_")&&(t=t.slice(3)),t.split("_").map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(" ")}function B(s,t,r){const n=s.split("_").map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join(" "),a=r==="acc"||!r&&(t==null?void 0:t.toLowerCase())==="track config";if(!t||t==="default"||a)return n;const i=t.split("_").map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join(" ");return`${n} ${i}`}function D(s){if(!s)return"-";try{return new Date(s).toLocaleDateString("en-GB",{day:"numeric",month:"short",year:"numeric"})}catch{return"-"}}function Q(s){if(!s)return"";const t=Date.now()-new Date(s).getTime(),r=Math.floor(t/1e3);if(r<60)return"Just now";const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const a=Math.floor(n/60);if(a<24)return`${a}h ago`;const i=Math.floor(a/24);return i<30?`${i}d ago`:D(s)}function Ee(s){return s==null?"":`${s>=0?"+":"-"}${(Math.abs(s)/1e3).toFixed(3)}`}function re(s,t){const{type:r,title:n,trackId:a,trackLayout:i,carId:o,game:l,data:p}=s,c=a?B(a,i,l):null,x=o?T(o):null,h=[c,x].filter(Boolean).join(" — ");return r==="RECORD_BEATEN"&&h?`${p!=null&&p.beatenBySteamId&&t?t(p.beatenBySteamId).displayName:"Someone"} beat your record on ${h}`:r==="RECORD_SET"&&h?`You set a new record on ${h}`:n||"New notification"}function O(s){return s?{E:"Eco",RD:"Road",SC:"SuperCar",RV:"Race Vintage",SM:"Semislick",ST:"Street",HR:"Hard Race",MR:"Medium Race",SR:"Soft Race",S:"Soft"}[s]||s:"Unknown"}function Fe(s={}){var l,p,c,x,h,u;const{cdnUrl:t,partnerSlug:r}=y(),{game:n,gameVersion:a}=s,i=b.useQuery({queryKey:["pitvox","leaderboards",r,"index"],queryFn:()=>w(t,`leaderboards/partners/${r}/index.json`),staleTime:3e4,refetchInterval:3e4}),o=N.useMemo(()=>{var j;if(!((j=i.data)!=null&&j.tracks))return[];let g=i.data.tracks;return n&&(g=g.filter(d=>d.game===n)),a&&(g=g.filter(d=>d.gameVersion===a)),g.map(d=>({id:d.trackId,layout:d.layout,game:d.game,gameVersion:d.gameVersion,displayName:B(d.trackId,d.layout,d.game),driverCount:d.driverCount||0,carCount:d.carCount||0,record:d.recordHolder?{visibleId:d.recordHolder.steamId||d.recordHolder.userId,carId:d.recordHolder.carId,carDisplayName:T(d.recordHolder.carId),lapTimeMs:d.recordHolder.lapTimeMs,timestamp:d.recordHolder.recordedAt}:null,recordByTag:d.recordByTag||null}))},[(l=i.data)==null?void 0:l.tracks,n,a]);return{...i,data:o,partner:((p=i.data)==null?void 0:p.partner)||null,generatedAt:(c=i.data)==null?void 0:c.generatedAt,totalLaps:((x=i.data)==null?void 0:x.totalLaps)||0,totalUsers:((h=i.data)==null?void 0:h.totalUsers)||0,versions:((u=i.data)==null?void 0:u.versions)||{}}}function ne(s,t,r={}){const{cdnUrl:n,partnerSlug:a}=y(),{carId:i,game:o,gameVersion:l}=r,p=t||"default",c=l?`leaderboards/partners/${a}/v/${l}/tracks/${s}/${p}.json`:`leaderboards/partners/${a}/tracks/${s}/${p}.json`,{data:x,isLoading:h,error:u}=b.useQuery({queryKey:["pitvox","leaderboards",a,"track",s,p,l],queryFn:()=>w(n,c),enabled:!!s,staleTime:3e4,refetchInterval:3e4});return{data:N.useMemo(()=>{if(!(x!=null&&x.entries))return[];let j=x.entries;if(o&&(j=j.filter(d=>d.game===o)),!i){const d=new Map,f=new Map;for(const m of j){const v=m.steamId||m.userId;f.has(m.carId)||f.set(m.carId,new Set),f.get(m.carId).add(v),(!d.has(m.carId)||m.lapTimeMs<d.get(m.carId).lapTimeMs)&&d.set(m.carId,m)}return Array.from(d.values()).map(m=>{var v;return{...m,driverCount:((v=f.get(m.carId))==null?void 0:v.size)||0}}).sort((m,v)=>m.lapTimeMs-v.lapTimeMs)}return j.filter(d=>d.carId===i).sort((d,f)=>d.lapTimeMs-f.lapTimeMs)},[x==null?void 0:x.entries,i,o]),isLoading:h,error:u}}function ae(s,t,r,n,a={}){var u,g;const{cdnUrl:i,partnerSlug:o}=y(),{showInvalid:l=!1,game:p,gameVersion:c}=a,x=b.useQuery({queryKey:["pitvox","laps",o,s],queryFn:()=>w(i,`laps/partners/${o}/${s}.json`),enabled:!!s,staleTime:3e4,refetchInterval:3e4}),h=N.useMemo(()=>{var j;return(j=x.data)!=null&&j.laps?x.data.laps.filter(d=>{if(d.trackId!==t)return!1;if(r){if(d.trackLayout!==r)return!1}else if(d.trackLayout&&d.trackLayout!=="default")return!1;return!(d.carId!==n||p&&d.game!==p||c&&d.gameVersion!==c||!l&&!d.isValid)}).sort((d,f)=>d.lapTimeMs-f.lapTimeMs):[]},[(u=x.data)==null?void 0:u.laps,t,r,n,p,c,l]);return{...x,data:h,driverName:((g=x.data)==null?void 0:g.driverName)||"Driver"}}function W(){const{cdnUrl:s}=y(),{data:t}=b.useQuery({queryKey:["pitvox","users","index"],queryFn:()=>w(s,"users/index.json"),staleTime:5*6e4,gcTime:30*6e4}),r=(t==null?void 0:t.users)||{};return(n,a)=>{const i=r[n];return{displayName:(i==null?void 0:i.displayName)||a||n||"Unknown",avatarUrl:(i==null?void 0:i.avatarUrl)||null,affiliations:(i==null?void 0:i.affiliations)||[]}}}function _e(){const{cdnUrl:s}=y(),{data:t}=b.useQuery({queryKey:["pitvox","cars","index"],queryFn:()=>w(s,"cars/index.json"),staleTime:5*6e4,gcTime:30*6e4});return{tags:(t==null?void 0:t.tags)||[],cars:(t==null?void 0:t.cars)||{}}}function qe(s,t){return ne(s,null,{carId:t})}function Ve(){const{cdnUrl:s,partnerSlug:t}=y();return b.useQuery({queryKey:["pitvox","competitions",t],queryFn:async()=>{const r=await w(s,"competitions/index.json");return r!=null&&r.competitions?r.competitions.filter(n=>n.partnerSlug===t):[]},staleTime:6e4})}function ie(s){const{cdnUrl:t,partnerSlug:r}=y();return b.useQuery({queryKey:["pitvox","competition",r,s,"config"],queryFn:()=>w(t,`competitions/${r}/${s}/config.json`),enabled:!!s,staleTime:6e4})}function oe(s){const{cdnUrl:t,partnerSlug:r}=y();return b.useQuery({queryKey:["pitvox","competition",r,s,"standings"],queryFn:()=>w(t,`competitions/${r}/${s}/standings.json`),enabled:!!s,staleTime:6e4})}function ce(s,t){const{cdnUrl:r,partnerSlug:n}=y();return b.useQuery({queryKey:["pitvox","competition",n,s,"round",t],queryFn:()=>w(r,`competitions/${n}/${s}/rounds/${t}.json`),enabled:!!s&&t!=null,staleTime:6e4})}function Ke(s,t=[]){const{cdnUrl:r,partnerSlug:n}=y();return b.useQuery({queryKey:["pitvox","competition",n,s,"allRounds",t],queryFn:async()=>(await Promise.all(t.map(i=>w(r,`competitions/${n}/${s}/rounds/${i}.json`).catch(()=>null)))).filter(Boolean),enabled:!!s&&t.length>0,staleTime:6e4})}function G(s){const{cdnUrl:t,partnerSlug:r}=y();return b.useQuery({queryKey:["pitvox","competition",r,s,"entrylist"],queryFn:()=>w(t,`competitions/${r}/${s}/entrylist.json`),enabled:!!s,staleTime:6e4})}function E(s){const{cdnUrl:t,partnerSlug:r,getSteamId:n}=y(),a=n();return b.useQuery({queryKey:["pitvox","registration",r,s,a],queryFn:async()=>{var p;const i=await fetch(`${t}/competitions/${r}/${s}/entrylist.json`);if(!i.ok)return{isRegistered:!1,entryList:null};const o=await i.json();return{isRegistered:!!a&&((p=o.drivers)==null?void 0:p.some(c=>c.steamId===a)),entryList:o}},enabled:!!s,staleTime:6e4})}function z(s){const{onRegister:t,partnerSlug:r,getSteamId:n}=y(),a=b.useQueryClient(),i=W();return b.useMutation({mutationFn:o=>{if(!t)throw new Error("No onRegister callback provided to PitVoxPartnerProvider. Provide onRegister for in-app registration, or use useRegistrationUrl() to link to pitvox.com.");return t(s,o)},onSuccess:()=>{const o=n();if(a.setQueriesData({queryKey:["pitvox","registration",r,s]},l=>l?{...l,isRegistered:!0}:{isRegistered:!0,entryList:null}),o){const l=i(o),p={steamId:o,displayName:l.displayName,avatarUrl:l.avatarUrl};a.setQueriesData({queryKey:["pitvox","competition",r,s,"entrylist"]},c=>{var h;return c?((h=c.drivers)==null?void 0:h.some(u=>u.steamId===o))?c:{...c,drivers:[...c.drivers||[],p]}:{drivers:[p]}})}}})}function Z(s){const{onWithdraw:t,partnerSlug:r,getSteamId:n}=y(),a=b.useQueryClient();return b.useMutation({mutationFn:i=>{if(!t)throw new Error("No onWithdraw callback provided to PitVoxPartnerProvider. Provide onWithdraw for in-app withdrawal, or use useRegistrationUrl() to link to pitvox.com.");const o=i||n();if(!o)throw new Error("No Steam ID available");return t(s,o)},onSuccess:()=>{const i=n();a.setQueriesData({queryKey:["pitvox","registration",r,s]},o=>o?{...o,isRegistered:!1}:{isRegistered:!1,entryList:null}),i&&a.setQueriesData({queryKey:["pitvox","competition",r,s,"entrylist"]},o=>o!=null&&o.drivers?{...o,drivers:o.drivers.filter(l=>l.steamId!==i)}:o)}})}function F(){const{onRegister:s,onWithdraw:t}=y(),r=!!(s&&t);return{isPowerMode:r,isBasicMode:!r}}function _(s){const{pitvoxUrl:t,partnerSlug:r}=y();return`${t}/p/${r}/competitions/${s}/register`}const He={formula:"Formula",gt3:"GT3",gt2:"GT2",gt4:"GT4",cup:"Cup",prototype:"Prototype",rally:"Rally",hypercar:"Hypercar",supercar:"Supercar",sports_car:"Sports Car",hot_hatch:"Hot Hatch",lightweight:"Lightweight","1960s":"1960s","1970s":"1970s","1980s":"1980s","1990s":"1990s","2000s":"2000s","2010s":"2010s","2020s":"2020s"},le=[{id:"class",tags:["formula","gt3","gt2","gt4","cup","prototype","rally"]},{id:"tier",tags:["hypercar","supercar","sports_car","hot_hatch","lightweight"]},{id:"era",tags:["1960s","1970s","1980s","1990s","2000s","2010s","2020s"]}];function Qe(s){for(const t of le)if(t.tags.includes(s))return t.id;return"other"}function de(s,t){if(t.size===0)return!0;const r={};for(const n of t){const a=Qe(n);r[a]||(r[a]=[]),r[a].push(n)}for(const n of Object.values(r))if(!n.some(a=>s.includes(a)))return!1;return!0}function pe(s,t){const[r,n]=N.useState(new Set),a=s!==void 0,i=a?s:r,o=N.useCallback(p=>{const c=new Set(i);c.has(p)?c.delete(p):c.add(p),a&&t?t(c):n(c)},[i,a,t]),l=N.useCallback(()=>{a&&t?t(new Set):n(new Set)},[a,t]);return{activeTags:i,toggle:o,clear:l}}function Y(s){const[t,r]=N.useState(s),n=N.useCallback(a=>{r(i=>i.key===a?{key:a,dir:i.dir==="asc"?"desc":"asc"}:{key:a,dir:a.includes("timestamp")||a.includes("Date")?"desc":"asc"})},[]);return[t,n]}function J(s,t,r){return[...s].sort((n,a)=>{const i=r(n,t.key),o=r(a,t.key);if(i==null&&o==null)return 0;if(i==null)return 1;if(o==null)return-1;const l=typeof i=="string"?i.localeCompare(o):i-o;return t.dir==="desc"?-l:l})}function xe(s,t=!1){const r=t?s==null?void 0:s.filter(n=>n.isValid):s;return r!=null&&r.length?{s1:Math.min(...r.map(n=>n.sector1Ms).filter(Boolean)),s2:Math.min(...r.map(n=>n.sector2Ms).filter(Boolean)),s3:Math.min(...r.map(n=>n.sector3Ms).filter(Boolean))}:null}function Oe({active:s,dir:t}){return s?t==="asc"?e.jsx("svg",{className:"pvx-sort-icon",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.5 15.75l7.5-7.5 7.5 7.5"})}):e.jsx("svg",{className:"pvx-sort-icon",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19.5 8.25l-7.5 7.5-7.5-7.5"})}):e.jsx("svg",{className:"pvx-sort-icon pvx-sort-icon--inactive",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 9l4-4 4 4M16 15l-4 4-4-4"})})}function R({label:s,sortKey:t,config:r,onSort:n,className:a=""}){return e.jsx("th",{className:`pvx-th pvx-th--sortable ${a}`,onClick:()=>n(t),children:e.jsxs("span",{className:"pvx-th-inner",children:[s,e.jsx(Oe,{active:r.key===t,dir:r.dir})]})})}function X({userId:s,getUserDisplay:t}){const{displayName:r,avatarUrl:n}=t(s);return e.jsxs("span",{className:"pvx-driver",children:[n?e.jsx("img",{src:n,alt:"",className:"pvx-driver-avatar"}):e.jsx("span",{className:"pvx-driver-avatar pvx-driver-avatar--placeholder"}),e.jsx("span",{className:"pvx-driver-name",children:r})]})}function ue({rank:s,podium:t=!1}){const r=t?s===1?"pvx-rank pvx-rank--gold":s===2?"pvx-rank pvx-rank--silver":s===3?"pvx-rank pvx-rank--bronze":"pvx-rank":"pvx-rank";return e.jsx("span",{className:r,children:s})}function me({availableTags:s,activeTags:t,onToggle:r,onClear:n}){if(!s||s.length<2)return null;const a=le.map(i=>({id:i.id,tags:i.tags.filter(o=>s.includes(o))})).filter(i=>i.tags.length>0);return e.jsxs("div",{className:"pvx-tag-bar",children:[e.jsx("button",{onClick:n,className:`pvx-tag ${t.size===0?"pvx-tag--active":""}`,children:"All"}),a.map((i,o)=>e.jsxs("span",{className:"contents",children:[o>0&&e.jsx("span",{className:"pvx-tag-separator"}),i.tags.map(l=>e.jsx("button",{onClick:()=>r(l),className:`pvx-tag ${t.has(l)?"pvx-tag--active":""}`,children:He[l]||l},l))]},i.id))]})}function ee({segments:s}){return e.jsx("nav",{className:"pvx-breadcrumb","aria-label":"Breadcrumb",children:e.jsx("ol",{className:"pvx-breadcrumb-list",children:s.map((t,r)=>{const n=r===s.length-1;return e.jsxs("li",{className:"pvx-breadcrumb-item",children:[r>0&&e.jsx("svg",{className:"pvx-breadcrumb-chevron",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8.25 4.5l7.5 7.5-7.5 7.5"})}),!n&&t.onClick?e.jsx("button",{onClick:t.onClick,className:"pvx-breadcrumb-link",children:t.label}):e.jsx("span",{className:"pvx-breadcrumb-current",children:t.label})]},t.key)})})})}function q({message:s}){return e.jsxs("div",{className:"pvx-empty",children:[e.jsx("svg",{className:"pvx-empty-icon",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.5 18.75h-9m9 0a3 3 0 013 3h-15a3 3 0 013-3m9 0v-4.5A3.375 3.375 0 0013.125 10.875h-2.25A3.375 3.375 0 007.5 14.25v4.5"})}),e.jsx("p",{children:s})]})}function V(){return e.jsx("div",{className:"pvx-loading",children:"Loading..."})}function We(){return e.jsx("svg",{className:"pvx-icon pvx-icon--valid",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.5 12.75l6 6 9-13.5"})})}function Ge(){return e.jsx("svg",{className:"pvx-icon pvx-icon--invalid",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})}function ze({tracks:s,isLoading:t,carMetadata:r,getUserDisplay:n,onTrackSelect:a,tags:i,onTagChange:o}){const[l,p]=Y({key:"record.timestamp",dir:"desc"}),{activeTags:c,toggle:x,clear:h}=pe(i,o),u=N.useMemo(()=>{var f;if(!((f=r==null?void 0:r.tags)!=null&&f.length))return[];const d=new Set;for(const m of s||[])m.recordByTag&&Object.keys(m.recordByTag).forEach(v=>d.add(v));return r.tags.filter(m=>d.has(m))},[s,r]),g=N.useMemo(()=>s?c.size===0?s:s.map(d=>{var v,C;if(!d.recordByTag)return null;let f=null;const m=new Set;for(const k of Object.values(d.recordByTag)){if(m.has(k.carId))continue;m.add(k.carId);const L=((C=(v=r==null?void 0:r.cars)==null?void 0:v[k.carId])==null?void 0:C.tags)||["sports_car"];de(L,c)&&(!f||k.lapTimeMs<f.lapTimeMs)&&(f=k)}return f?{...d,record:{visibleId:f.steamId||f.identifier,carId:f.carId,carDisplayName:T(f.carId),lapTimeMs:f.lapTimeMs,timestamp:f.recordedAt}}:null}).filter(Boolean):[],[s,c,r]),j=N.useMemo(()=>J(g,l,(d,f)=>{var m,v;switch(f){case"displayName":return d.displayName;case"record.lapTimeMs":return(m=d.record)==null?void 0:m.lapTimeMs;case"driverCount":return d.driverCount||0;case"carCount":return d.carCount||0;case"record.timestamp":default:return(v=d.record)!=null&&v.timestamp?new Date(d.record.timestamp).getTime():0}}),[g,l]);return t?e.jsx(V,{}):s!=null&&s.length?e.jsxs("div",{className:"pvx-card",children:[e.jsx("div",{className:"pvx-card-header",children:e.jsx("h2",{className:"pvx-card-title",children:"Track Records"})}),e.jsx(me,{availableTags:u,activeTags:c,onToggle:x,onClear:h}),e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx(R,{label:"Track",sortKey:"displayName",config:l,onSort:p}),e.jsx("th",{className:"pvx-th",children:"Record Holder"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Car"}),e.jsx(R,{label:"Lap Time",sortKey:"record.lapTimeMs",config:l,onSort:p}),e.jsx(R,{label:"Drivers",sortKey:"driverCount",config:l,onSort:p,className:"pvx-hidden-below-md"}),e.jsx(R,{label:"Cars",sortKey:"carCount",config:l,onSort:p,className:"pvx-hidden-below-lg"}),e.jsx(R,{label:"Date",sortKey:"record.timestamp",config:l,onSort:p,className:"pvx-hidden-below-xl"})]})}),e.jsx("tbody",{className:"pvx-tbody",children:j.map(d=>{var f,m,v;return e.jsxs("tr",{className:"pvx-row pvx-row--clickable",onClick:()=>a(d.id,d.layout),children:[e.jsx("td",{className:"pvx-td pvx-td--primary",children:d.displayName}),e.jsx("td",{className:"pvx-td",children:(f=d.record)!=null&&f.visibleId?e.jsx(X,{userId:d.record.visibleId,getUserDisplay:n}):"-"}),e.jsx("td",{className:"pvx-td pvx-hidden-below-lg",children:((m=d.record)==null?void 0:m.carDisplayName)||"-"}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:d.record?$(d.record.lapTimeMs):"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-md",children:d.driverCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:d.carCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:(v=d.record)!=null&&v.timestamp?D(d.record.timestamp):"-"})]},`${d.id}|${d.layout||""}`)})})]})})]}):e.jsx(q,{message:"No lap times recorded yet."})}function Ze({entries:s,isLoading:t,track:r,carMetadata:n,getUserDisplay:a,onCarSelect:i,onNavigate:o,tags:l,onTagChange:p}){const[c,x]=Y({key:"lapTimeMs",dir:"asc"}),{activeTags:h,toggle:u,clear:g}=pe(l,p),j=N.useMemo(()=>{var C,k,L;if(!s||!((C=n==null?void 0:n.tags)!=null&&C.length))return[];const v=new Set;for(const P of s)(((L=(k=n.cars)==null?void 0:k[P.carId])==null?void 0:L.tags)||["sports_car"]).forEach(Pe=>v.add(Pe));return n.tags.filter(P=>v.has(P))},[s,n]),d=N.useMemo(()=>s?h.size===0?s:s.filter(v=>{var k,L;const C=((L=(k=n==null?void 0:n.cars)==null?void 0:k[v.carId])==null?void 0:L.tags)||["sports_car"];return de(C,h)}):[],[s,h,n]),f=N.useMemo(()=>J(d,c,(v,C)=>{switch(C){case"carId":return T(v.carId);case"driverCount":return v.driverCount||0;case"lapTimeMs":default:return v.lapTimeMs}}),[d,c]),m=[{key:"tracks",label:"Tracks",onClick:()=>o("tracks")},{key:"track",label:r.displayName}];return t?e.jsx(V,{}):e.jsxs("div",{className:"pvx-card",children:[e.jsx("div",{className:"pvx-card-header",children:e.jsx(ee,{segments:m})}),e.jsx(me,{availableTags:j,activeTags:h,onToggle:u,onClear:g}),s!=null&&s.length?e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"#"}),e.jsx(R,{label:"Car",sortKey:"carId",config:c,onSort:x}),e.jsx("th",{className:"pvx-th",children:"Record Holder"}),e.jsx(R,{label:"Lap Time",sortKey:"lapTimeMs",config:c,onSort:x}),e.jsx(R,{label:"Drivers",sortKey:"driverCount",config:c,onSort:x,className:"pvx-hidden-below-md"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Date"})]})}),e.jsx("tbody",{className:"pvx-tbody",children:f.map((v,C)=>e.jsxs("tr",{className:"pvx-row pvx-row--clickable",onClick:()=>i(v.carId),children:[e.jsx("td",{className:"pvx-td",children:e.jsx(ue,{rank:C+1,podium:!0})}),e.jsx("td",{className:"pvx-td pvx-td--primary",children:T(v.carId)}),e.jsx("td",{className:"pvx-td",children:e.jsx(X,{userId:v.steamId||v.userId,getUserDisplay:a})}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:$(v.lapTimeMs)}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-md",children:v.driverCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-lg",children:v.recordedAt?D(v.recordedAt):"-"})]},v.carId))})]})}):e.jsx(q,{message:"No lap times for this track yet."})]})}function Ye({entries:s,isLoading:t,track:r,carId:n,getUserDisplay:a,onDriverSelect:i,onNavigate:o}){const[l,p]=Y({key:"lapTimeMs",dir:"asc"}),c=N.useMemo(()=>xe(s),[s]),x=N.useMemo(()=>J(s||[],l,(u,g)=>{switch(g){case"userId":return a(u.steamId||u.userId).displayName;case"lapCount":return u.lapCount||0;case"lapTimeMs":default:return u.lapTimeMs}}),[s,l,a]),h=[{key:"tracks",label:"Tracks",onClick:()=>o("tracks")},{key:"track",label:r.displayName,onClick:()=>o("track")},{key:"car",label:T(n)}];return t?e.jsx(V,{}):e.jsxs("div",{className:"pvx-card",children:[e.jsx("div",{className:"pvx-card-header",children:e.jsx(ee,{segments:h})}),s!=null&&s.length?e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"#"}),e.jsx(R,{label:"Driver",sortKey:"userId",config:l,onSort:p}),e.jsx(R,{label:"Lap Time",sortKey:"lapTimeMs",config:l,onSort:p}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S1"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S2"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S3"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Tyre"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-xl",children:"Fuel"}),e.jsx(R,{label:"Laps",sortKey:"lapCount",config:l,onSort:p,className:"pvx-hidden-below-lg"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-xl",children:"Date"})]})}),e.jsx("tbody",{className:"pvx-tbody",children:x.map((u,g)=>{const j=g+1,d=u.steamId||u.userId,f=c&&u.sector1Ms===c.s1,m=c&&u.sector2Ms===c.s2,v=c&&u.sector3Ms===c.s3;return e.jsxs("tr",{className:`pvx-row pvx-row--clickable ${j<=3?"pvx-row--podium":""}`,onClick:()=>i(d),children:[e.jsx("td",{className:"pvx-td",children:e.jsx(ue,{rank:j,podium:!0})}),e.jsx("td",{className:"pvx-td pvx-td--primary",children:e.jsx(X,{userId:d,getUserDisplay:a})}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:$(u.lapTimeMs)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${f?"pvx-td--best-sector":""}`,children:S(u.sector1Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${m?"pvx-td--best-sector":""}`,children:S(u.sector2Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${v?"pvx-td--best-sector":""}`,children:S(u.sector3Ms)}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",title:O(u.tyreCompound),children:u.tyreCompound||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-xl",children:u.startingFuelL?`${u.startingFuelL}L`:"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:u.lapCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:u.recordedAt?D(u.recordedAt):"-"})]},d)})})]})}):e.jsx(q,{message:"No lap times for this car yet."})]})}function Je({userId:s,track:t,carId:r,game:n,gameVersion:a,showInvalid:i,getUserDisplay:o,onToggleInvalid:l,onNavigate:p}){const{data:c,driverName:x,isLoading:h}=ae(s,t.id,t.layout,r,{showInvalid:i,game:n,gameVersion:a}),{displayName:u,avatarUrl:g}=o(s,x),j=N.useMemo(()=>xe(c,!0),[c]),d=N.useMemo(()=>{const m=(c==null?void 0:c.filter(v=>v.isValid))||[];return m.length?Math.min(...m.map(v=>v.lapTimeMs)):null},[c]),f=[{key:"tracks",label:"Tracks",onClick:()=>p("tracks")},{key:"track",label:t.displayName,onClick:()=>p("track")},{key:"car",label:T(r),onClick:()=>p("car")},{key:"driver",label:u}];return h?e.jsx(V,{}):e.jsxs("div",{className:"pvx-card",children:[e.jsxs("div",{className:"pvx-card-header pvx-card-header--split",children:[e.jsxs("div",{className:"pvx-card-header-left",children:[e.jsx(ee,{segments:f}),g?e.jsx("img",{src:g,alt:"",className:"pvx-driver-avatar pvx-driver-avatar--lg"}):e.jsx("span",{className:"pvx-driver-avatar pvx-driver-avatar--lg pvx-driver-avatar--placeholder"})]}),e.jsxs("label",{className:"pvx-checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:i,onChange:l,className:"pvx-checkbox"}),e.jsx("span",{children:"Show invalid laps"})]})]}),c!=null&&c.length?e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"#"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-md",children:"Lap"}),e.jsx("th",{className:"pvx-th",children:"Lap Time"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S1"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S2"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"S3"}),e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"Valid"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Tyre"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Fuel"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-xl",children:"Date"})]})}),e.jsx("tbody",{className:"pvx-tbody",children:c.map((m,v)=>{const C=m.isValid&&m.lapTimeMs===d,k=j&&m.isValid&&m.sector1Ms===j.s1,L=j&&m.isValid&&m.sector2Ms===j.s2,P=j&&m.isValid&&m.sector3Ms===j.s3;let U="pvx-row";return m.isValid||(U+=" pvx-row--invalid"),C&&(U+=" pvx-row--personal-best"),e.jsxs("tr",{className:U,children:[e.jsx("td",{className:"pvx-td",children:e.jsx("span",{className:`pvx-rank ${C?"pvx-rank--gold":""}`,children:v+1})}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-md",children:m.lapNumber||"-"}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:$(m.lapTimeMs)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${k?"pvx-td--best-sector":""}`,children:S(m.sector1Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${L?"pvx-td--best-sector":""}`,children:S(m.sector2Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${P?"pvx-td--best-sector":""}`,children:S(m.sector3Ms)}),e.jsx("td",{className:"pvx-td",title:m.isValid?void 0:m.invalidReason||"Invalid",children:m.isValid?e.jsx(We,{}):e.jsx(Ge,{})}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",title:O(m.tyreCompound),children:m.tyreCompound||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:m.startingFuelL?`${m.startingFuelL}L`:"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:D(m.timestamp)})]},m.id)})})]})}):e.jsx(q,{message:i?"No laps recorded for this combination.":'No valid laps. Try enabling "Show invalid laps".'})]})}const Xe={GBR:"🇬🇧",DEU:"🇩🇪",NLD:"🇳🇱",SWE:"🇸🇪",ESP:"🇪🇸",ZAF:"🇿🇦",FRA:"🇫🇷",ITA:"🇮🇹",USA:"🇺🇸",AUS:"🇦🇺",BRA:"🇧🇷",JPN:"🇯🇵",CAN:"🇨🇦",POL:"🇵🇱",AUT:"🇦🇹",BEL:"🇧🇪",PRT:"🇵🇹",NOR:"🇳🇴",DNK:"🇩🇰",FIN:"🇫🇮",IRL:"🇮🇪",CHE:"🇨🇭",NZL:"🇳🇿",MEX:"🇲🇽",ARG:"🇦🇷",CZE:"🇨🇿",HUN:"🇭🇺",RUS:"🇷🇺",TUR:"🇹🇷",KOR:"🇰🇷"},ve=["🥇","🥈","🥉"],es={championship:"Championship",series:"Series",event:"Event"},se=["PRACTICE","QUALIFYING","RACE"];function he({position:s}){const t=s===1?"pvx-rank pvx-rank--gold":s===2?"pvx-rank pvx-rank--silver":s===3?"pvx-rank pvx-rank--bronze":"pvx-rank";return e.jsx("span",{className:t,children:s})}function ge({nation:s}){const t=s&&Xe[s];return t?e.jsx("span",{className:"pvx-nation-flag",title:s,children:t}):null}function ss({sessions:s,activeSession:t,onSelect:r}){if(!s||s.length<=1)return null;const n=[...s].sort((a,i)=>se.indexOf(a.type)-se.indexOf(i.type));return e.jsx("div",{className:"pvx-session-tabs",children:n.map(a=>e.jsx("button",{onClick:()=>r(a.type),className:`pvx-session-tab ${t===a.type?"pvx-session-tab--active":""}`,children:a.type},a.type))})}function fe({type:s}){return e.jsx("span",{className:`pvx-comp-badge pvx-comp-badge--${s}`,children:es[s]||s})}function A({children:s,variant:t="default"}){return e.jsx("span",{className:`pvx-info-pill ${t!=="default"?`pvx-info-pill--${t}`:""}`,children:s})}function ts(s){if(!s)return"TBD";const t=new Date(s);if(isNaN(t))return"TBD";const r=t.toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short"}),n=t.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit"});return`${r} • ${n}`}function rs(s){return s.reduce((t,r)=>{var n;return(n=r.splits)!=null&&n.length?t?t.map((a,i)=>{const o=r.splits[i];return o&&o<a?o:a}):[...r.splits]:t},null)}function I({message:s="Loading..."}){return e.jsx("div",{className:"pvx-loading",children:s})}function M({message:s="No data available."}){return e.jsx("div",{className:"pvx-empty",children:e.jsx("p",{children:s})})}function ns({competitions:s,isLoading:t,onSelect:r,onRegister:n,className:a}){return t?e.jsx(I,{message:"Loading competitions..."}):s!=null&&s.length?e.jsx("div",{className:`pvx-comp-grid ${a||""}`,children:s.map(i=>e.jsx(as,{comp:i,onSelect:r,onRegister:n||r},i.id))}):e.jsx(M,{message:"No competitions available."})}function as({comp:s,onSelect:t,onRegister:r}){var d,f,m;const{cdnUrl:n}=y(),a=s.posterCdnPath?`${n}/${s.posterCdnPath}`:null,i=s.registration,o=(i==null?void 0:i.currentCount)||0,l=i==null?void 0:i.maxParticipants,p=l&&o>=l,c=(i==null?void 0:i.deadline)&&new Date(i.deadline)<new Date,x=(i==null?void 0:i.isOpen)&&!c&&!p,h=new Date,u=(d=s.rounds)==null?void 0:d.find(v=>v.startTime&&new Date(v.startTime)>=h),g=((f=s.rounds)==null?void 0:f.length)||0,j=((m=s.rounds)==null?void 0:m.filter(v=>v.isFinalized).length)||0;return e.jsxs("div",{className:"pvx-comp-card",onClick:()=>t(s.id),role:"button",tabIndex:0,onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),t(s.id))},children:[e.jsx("div",{className:"pvx-comp-card-poster",children:a?e.jsx("img",{src:a,alt:s.name,className:"pvx-comp-card-poster-img"}):e.jsx("div",{className:"pvx-comp-card-poster-placeholder",children:e.jsx(os,{})})}),e.jsxs("div",{className:"pvx-comp-card-body",children:[e.jsx("h3",{className:"pvx-comp-card-title",children:s.name}),s.description&&e.jsx("p",{className:"pvx-comp-card-desc",children:s.description}),e.jsxs("div",{className:"pvx-comp-card-pills",children:[e.jsx(fe,{type:s.type}),s.game&&e.jsx(A,{children:s.game.toUpperCase()}),s.formatDescription&&s.formatDescription.split(", ").map((v,C)=>e.jsx(A,{variant:"format",children:v},C))]}),s.carsDescription&&e.jsx("div",{className:"pvx-comp-card-pills",children:s.carsDescription.split(", ").map((v,C)=>e.jsx(A,{children:v},C))}),e.jsxs("div",{className:"pvx-comp-card-schedule",children:[u?e.jsxs("span",{className:"pvx-comp-card-schedule-next",children:[e.jsx("span",{className:"pvx-comp-card-schedule-label",children:"Next:"})," ","R",u.roundNumber," ",u.track||"TBD"," — ",ts(u.startTime)]}):g>0?e.jsxs("span",{className:"pvx-comp-card-schedule-next",children:[j,"/",g," rounds completed"]}):null,g>0&&e.jsxs("span",{className:"pvx-comp-card-round-count",children:[g," round",g!==1?"s":""]})]}),i&&e.jsx(is,{competitionId:s.id,regOpen:x,isFull:p,deadlinePassed:c,regCount:o,regMax:l,onRegister:r})]})]})}function is({competitionId:s,regOpen:t,isFull:r,deadlinePassed:n,regCount:a,regMax:i,onRegister:o}){const{isPowerMode:l}=F(),p=_(s),{data:c}=E(s),x=(c==null?void 0:c.isRegistered)||!1,h=i?a/i*100:0,u=h>=100?"full":h>=75?"warning":"ok";return e.jsxs("div",{className:"pvx-comp-card-reg",children:[e.jsx("div",{className:"pvx-comp-card-reg-info",children:e.jsxs("span",{className:`pvx-reg-capacity pvx-reg-capacity--${u}`,children:[a,"/",i||"∞"," drivers"]})}),e.jsx("div",{className:"pvx-comp-card-reg-action",children:x?e.jsx("button",{className:"pvx-comp-card-reg-btn pvx-comp-card-reg-btn--registered",onClick:g=>{g.stopPropagation(),o(s)},children:"✓ Registered"}):t?l?e.jsx("button",{className:"pvx-comp-card-reg-btn pvx-comp-card-reg-btn--open",onClick:g=>{g.stopPropagation(),o(s)},children:"Register"}):e.jsx("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"pvx-comp-card-reg-btn pvx-comp-card-reg-btn--open",onClick:g=>g.stopPropagation(),children:"Register"}):e.jsx("span",{className:"pvx-comp-card-reg-btn pvx-comp-card-reg-btn--closed",children:r?"Full":"Closed"})})]})}function os(){return e.jsxs("svg",{className:"pvx-comp-trophy-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M6 9H4.5a2.5 2.5 0 0 1 0-5H6"}),e.jsx("path",{d:"M18 9h1.5a2.5 2.5 0 0 0 0-5H18"}),e.jsx("path",{d:"M4 22h16"}),e.jsx("path",{d:"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22"}),e.jsx("path",{d:"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22"}),e.jsx("path",{d:"M18 2H6v7a6 6 0 0 0 12 0V2Z"})]})}function cs({competitionId:s,className:t}){var l,p;const{data:r,isLoading:n}=oe(s),{data:a,isLoading:i}=ie(s);if(n||i)return e.jsx(I,{message:"Loading standings..."});if(!((l=r==null?void 0:r.standings)!=null&&l.length))return e.jsx(M,{message:"No standings data yet. Results will appear once rounds are finalised."});const o=((p=a==null?void 0:a.rounds)==null?void 0:p.filter(c=>c.isFinalized))||[];return e.jsxs("div",{className:`pvx-card ${t||""}`,children:[e.jsx("div",{className:"pvx-card-header--split",children:e.jsxs("div",{className:"pvx-card-header-left",children:[e.jsx("h3",{className:"pvx-card-title",children:"Championship Standings"}),e.jsxs("span",{className:"pvx-standings-subtitle",children:["After ",r.roundsCompleted," round",r.roundsCompleted!==1?"s":"",r.countingRounds>0&&` (best ${r.countingRounds} count)`]})]})}),e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"Pos"}),e.jsx("th",{className:"pvx-th",children:"Driver"}),e.jsx("th",{className:"pvx-th pvx-th--center pvx-hidden-below-sm",children:"W"}),e.jsx("th",{className:"pvx-th pvx-th--center pvx-hidden-below-sm",children:"Pod"}),e.jsx("th",{className:"pvx-th pvx-th--center",children:"Points"}),o.map(c=>e.jsxs("th",{className:"pvx-th pvx-th--center pvx-hidden-below-md",title:c.track||`Round ${c.roundNumber}`,children:["R",c.roundNumber]},c.roundNumber))]})}),e.jsx("tbody",{className:"pvx-tbody",children:r.standings.map(c=>e.jsx(ls,{driver:c,finalizedRounds:o},c.driverId||c.driverName))})]})})]})}function ls({driver:s,finalizedRounds:t}){var o,l,p;const r=s.position<=3,n=new Map(((o=s.roundResults)==null?void 0:o.map(c=>[c.roundNumber,c]))||[]),a=((l=s.roundResults)==null?void 0:l.filter(c=>c.position===1).length)||0,i=((p=s.roundResults)==null?void 0:p.filter(c=>c.position<=3).length)||0;return e.jsxs("tr",{className:`pvx-row ${r?"pvx-row--podium":""}`,children:[e.jsx("td",{className:"pvx-td",children:e.jsx(he,{position:s.position})}),e.jsxs("td",{className:"pvx-td pvx-td--primary",children:[e.jsx(ge,{nation:s.nation}),s.driverName]}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-sm",children:a||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-sm",children:i||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-standings-total",children:s.totalPoints}),t.map(c=>{const x=n.get(c.roundNumber),h=x==null?void 0:x.dropped;return e.jsx("td",{className:`pvx-td pvx-td--center pvx-hidden-below-md ${!h&&(x==null?void 0:x.position)<=3?"pvx-standings-cell--podium":""}`,children:x?e.jsxs("div",{className:`pvx-standings-round-cell ${h?"pvx-standings-round-cell--dropped":""}`,children:[e.jsxs("span",{className:"pvx-standings-round-pos",children:["P",x.position]}),e.jsx("span",{className:"pvx-standings-round-pts",children:x.points})]}):e.jsx("span",{className:"pvx-td--muted",children:"-"})},c.roundNumber)})]})}function ds({competitionId:s,roundNumber:t,className:r}){var p;const{data:n,isLoading:a}=ce(s,t);if(a)return e.jsx(I,{message:"Loading results..."});if(!n)return e.jsx(M,{message:"No results for this round."});const o=(n.sessions||[]).find(c=>c.type==="RACE"),l=(p=o==null?void 0:o.results)==null?void 0:p.filter(c=>c.position<=3).sort((c,x)=>c.position-x.position);return e.jsxs("div",{className:`pvx-round-results ${r||""}`,children:[e.jsxs("div",{className:"pvx-round-results-header",children:[e.jsxs("div",{children:[e.jsxs("h4",{className:"pvx-round-results-title",children:["Round ",n.roundNumber,n.track?`: ${n.track}`:""]}),n.startTime&&e.jsx("p",{className:"pvx-round-results-date",children:new Date(n.startTime).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric"})})]}),(l==null?void 0:l.length)>0&&e.jsx("div",{className:"pvx-round-podium-summary",children:l.map(c=>e.jsxs("span",{className:"pvx-round-podium-item",children:[e.jsx("span",{children:ve[c.position-1]}),e.jsx("span",{children:c.driverName})]},c.driverId))})]}),e.jsx(je,{round:n})]})}function je({round:s,className:t}){var l,p;const[r,n]=N.useState(null),a=(s==null?void 0:s.sessions)||[];if(!a.length)return e.jsx(M,{message:"No session data for this round."});const i=r||((l=a.find(c=>c.type==="RACE"))==null?void 0:l.type)||((p=a[0])==null?void 0:p.type),o=a.find(c=>c.type===i)||a[0];return e.jsxs("div",{className:t||"",children:[e.jsx(ss,{sessions:a,activeSession:i,onSelect:n}),e.jsx(ps,{session:o})]})}function ps({session:s}){var n;const t=s.type==="RACE";if(!((n=s.results)!=null&&n.length))return e.jsx(M,{message:`No results for ${s.type}.`});const r=rs(s.results);return e.jsx("div",{className:"pvx-table-scroll",children:e.jsxs("table",{className:"pvx-table",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"pvx-thead-row",children:[e.jsx("th",{className:"pvx-th pvx-th--narrow",children:"Pos"}),e.jsx("th",{className:"pvx-th",children:"Driver"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"Car"}),e.jsx("th",{className:"pvx-th",children:"Best Lap"}),t&&e.jsxs(e.Fragment,{children:[e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"Laps"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-sm",children:"Time / Gap"}),e.jsx("th",{className:"pvx-th pvx-th--center",children:"Points"})]})]})}),e.jsx("tbody",{className:"pvx-tbody",children:s.results.map((a,i)=>e.jsx(xs,{result:a,isRace:t,fastestSplits:r,rowIndex:i},a.driverId||i))})]})})}function xs({result:s,isRace:t,fastestSplits:r,rowIndex:n}){const a=s.position<=3;return e.jsxs("tr",{className:`pvx-row ${a?"pvx-row--podium":""}`,children:[e.jsx("td",{className:"pvx-td",children:e.jsx(he,{position:s.position})}),e.jsxs("td",{className:"pvx-td pvx-td--primary",children:[e.jsx(ge,{nation:s.nation}),s.driverName,s.carNumber!=null&&e.jsxs("span",{className:"pvx-car-number",children:["#",s.carNumber]}),s.penalty&&e.jsx("span",{className:"pvx-penalty",children:s.penalty})]}),e.jsx("td",{className:"pvx-td pvx-hidden-below-sm",children:T(s.carId)}),e.jsx("td",{className:"pvx-td pvx-td--mono",children:e.jsx(us,{bestLap:s.bestLapFormatted,hasBestLap:s.hasBestLap,splits:s.splits,fastestSplits:r,showAbove:n<=1})}),t&&e.jsxs(e.Fragment,{children:[e.jsx("td",{className:"pvx-td pvx-hidden-below-sm",children:s.lapsCompleted}),e.jsx("td",{className:"pvx-td pvx-td--mono pvx-td--muted pvx-hidden-below-sm",children:s.position===1?s.totalTime||"-":s.gap||"-"}),e.jsxs("td",{className:"pvx-td pvx-td--center",children:[e.jsx("span",{className:"pvx-session-points",children:s.points}),s.pointsOverride!==0&&s.pointsOverride&&e.jsxs("span",{className:"pvx-points-override",children:["(",s.pointsOverride>0?"+":"",s.pointsOverride,")"]})]})]})]})}function us({bestLap:s,hasBestLap:t,splits:r,fastestSplits:n,showAbove:a}){return s?e.jsxs("span",{className:`pvx-best-lap-cell ${t?"pvx-best-lap-cell--fastest":""}`,children:[e.jsx("span",{className:"pvx-best-lap-time",children:s}),(r==null?void 0:r.length)>0&&e.jsx("span",{className:"pvx-splits-tooltip-anchor",children:e.jsx("span",{className:`pvx-splits-tooltip ${a?"":"pvx-splits-tooltip--above"}`,children:r.map((i,o)=>{const l=n&&i===n[o];return e.jsxs("span",{className:"pvx-splits-tooltip-row",children:[e.jsxs("span",{className:"pvx-splits-tooltip-label",children:["S",o+1]}),e.jsx("span",{className:l?"pvx-splits-tooltip-best":"",children:i})]},o)})})})]}):e.jsx("span",{className:"pvx-td--muted",children:"-"})}function ms({competitionId:s,className:t}){const{getSteamId:r}=y(),{data:n,isLoading:a}=G(s),i=r();if(a)return e.jsx(I,{message:"Loading drivers..."});const o=(n==null?void 0:n.drivers)||(n==null?void 0:n.entries)||[];return o.length?e.jsx("div",{className:`pvx-entry-grid ${t||""}`,children:o.map(l=>{var c,x;const p=i&&l.steamId===i;return e.jsxs("div",{className:`pvx-entry-card ${p?"pvx-entry-card--you":""}`,children:[l.avatarUrl?e.jsx("img",{src:l.avatarUrl,alt:"",className:"pvx-entry-avatar"}):e.jsx("div",{className:"pvx-entry-avatar pvx-entry-avatar--placeholder",children:((x=(c=l.displayName)==null?void 0:c.charAt(0))==null?void 0:x.toUpperCase())||"?"}),e.jsxs("span",{className:"pvx-entry-name",children:[l.displayName,p&&e.jsx("span",{className:"pvx-entry-you",children:" (you)"})]})]},l.steamId||l.driverId)})}):e.jsx(M,{message:"No drivers registered yet."})}function vs({competitionId:s,driverData:t,className:r,children:n}){const{data:a,isLoading:i}=E(s),{isPowerMode:o}=F(),l=_(s),p=z(s),c=Z(s),x=(a==null?void 0:a.isRegistered)||!1,h=i||p.isPending||c.isPending,u=p.error||c.error||null,g=()=>{o&&p.mutate(t||{})},j=()=>{o&&c.mutate()};return typeof n=="function"?n({isRegistered:x,isLoading:h,register:g,withdraw:j,error:u,isPowerMode:o,registrationUrl:l}):o?e.jsx("button",{className:`pvx-comp-register-btn ${r||""}`,onClick:x?j:g,disabled:h,children:h?"Loading...":x?"Withdraw":"Register"}):e.jsx("a",{href:l,target:"_blank",rel:"noopener noreferrer",className:`pvx-comp-register-link ${r||""}`,children:x?"View Registration":"Register on PitVox"})}function hs({competitionId:s,registration:t,className:r}){const{getSteamId:n}=y(),{isPowerMode:a}=F(),i=_(s),{data:o,isLoading:l}=E(s),{data:p,isLoading:c}=G(s),x=z(s),h=Z(s),u=n(),g=(o==null?void 0:o.isRegistered)||!1,j=(p==null?void 0:p.drivers)||(p==null?void 0:p.entries)||[],d=t||{},f=d.maxParticipants&&(d.currentCount||0)>=d.maxParticipants,m=d.deadline&&new Date(d.deadline)<new Date,v=d.isOpen&&!m&&!f;return l||c?e.jsx(I,{message:"Loading registration..."}):g?e.jsx("div",{className:`pvx-reg-panel ${r||""}`,children:e.jsx(fs,{competitionId:s,drivers:j,steamId:u,isPowerMode:a,registrationUrl:i,withdrawMutation:h,registration:d})}):v?u?a?e.jsx("div",{className:`pvx-reg-panel ${r||""}`,children:e.jsx(gs,{competitionId:s,registerMutation:x,registration:d})}):e.jsx("div",{className:`pvx-reg-panel ${r||""}`,children:e.jsx("a",{href:i,target:"_blank",rel:"noopener noreferrer",className:"pvx-comp-register-link",children:"Register on PitVox"})}):e.jsx("div",{className:`pvx-reg-panel ${r||""}`,children:a?e.jsx("div",{className:"pvx-reg-status-msg",children:"Sign in to register for this competition."}):e.jsx("div",{className:"pvx-reg-status-msg",children:e.jsx("a",{href:i,target:"_blank",rel:"noopener noreferrer",className:"pvx-comp-register-link",children:"Register on PitVox"})})}):e.jsxs("div",{className:`pvx-reg-panel ${r||""}`,children:[e.jsx("div",{className:"pvx-reg-status-msg",children:f?"Registration is full.":m?"Registration deadline has passed.":"Registration is closed."}),j.length>0&&e.jsx(Ne,{drivers:j,steamId:u})]})}function gs({competitionId:s,registerMutation:t,registration:r}){const[n,a]=N.useState(""),[i,o]=N.useState("intermediate"),[l,p]=N.useState(""),c=g=>{g.preventDefault(),t.mutate({discordUsername:n||void 0,experience:i,comments:l||void 0})},x=r||{},h=x.currentCount||0,u=x.maxParticipants;return e.jsxs("form",{className:"pvx-reg-form",onSubmit:c,children:[e.jsxs("div",{className:"pvx-reg-form-header",children:[e.jsx("h3",{className:"pvx-reg-form-title",children:"Register"}),u&&e.jsx(be,{count:h,max:u})]}),t.error&&e.jsx("div",{className:"pvx-reg-error",children:t.error.message||"Registration failed"}),e.jsxs("div",{className:"pvx-reg-field",children:[e.jsxs("label",{className:"pvx-reg-label",htmlFor:`pvx-discord-${s}`,children:["Discord Username ",e.jsx("span",{className:"pvx-reg-optional",children:"(optional)"})]}),e.jsx("input",{id:`pvx-discord-${s}`,type:"text",className:"pvx-reg-input",placeholder:"e.g. username",value:n,onChange:g=>a(g.target.value)})]}),e.jsxs("div",{className:"pvx-reg-field",children:[e.jsx("label",{className:"pvx-reg-label",htmlFor:`pvx-exp-${s}`,children:"Experience Level"}),e.jsxs("select",{id:`pvx-exp-${s}`,className:"pvx-reg-select",value:i,onChange:g=>o(g.target.value),children:[e.jsx("option",{value:"beginner",children:"Beginner"}),e.jsx("option",{value:"intermediate",children:"Intermediate"}),e.jsx("option",{value:"advanced",children:"Advanced"})]})]}),e.jsxs("div",{className:"pvx-reg-field",children:[e.jsxs("label",{className:"pvx-reg-label",htmlFor:`pvx-comments-${s}`,children:["Comments ",e.jsx("span",{className:"pvx-reg-optional",children:"(optional)"})]}),e.jsx("textarea",{id:`pvx-comments-${s}`,className:"pvx-reg-textarea",rows:3,placeholder:"Anything the organisers should know?",value:l,onChange:g=>p(g.target.value)})]}),e.jsx("div",{className:"pvx-reg-actions",children:e.jsx("button",{type:"submit",className:"pvx-comp-register-btn",disabled:t.isPending,children:t.isPending?"Registering...":"Register"})})]})}function fs({competitionId:s,drivers:t,steamId:r,isPowerMode:n,registrationUrl:a,withdrawMutation:i,registration:o}){const[l,p]=N.useState(!1),c=()=>{i.mutate(void 0,{onSuccess:()=>p(!1)})},x=o||{},h=t.length||x.currentCount||0,u=x.maxParticipants;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"pvx-reg-form-header",children:[e.jsx("h3",{className:"pvx-reg-form-title",children:"Registered Drivers"}),u&&e.jsx(be,{count:h,max:u})]}),e.jsx(Ne,{drivers:t,steamId:r}),i.error&&e.jsx("div",{className:"pvx-reg-error",children:i.error.message||"Withdrawal failed"}),n?e.jsx("div",{className:"pvx-reg-actions",children:l?e.jsxs("div",{className:"pvx-reg-confirm",children:[e.jsx("p",{className:"pvx-reg-confirm-text",children:"Are you sure you want to unregister?"}),e.jsxs("div",{className:"pvx-reg-confirm-actions",children:[e.jsx("button",{type:"button",className:"pvx-reg-cancel-btn",onClick:()=>p(!1),children:"Cancel"}),e.jsx("button",{type:"button",className:"pvx-reg-danger-btn",onClick:c,disabled:i.isPending,children:i.isPending?"Unregistering...":"Yes, Unregister"})]})]}):e.jsx("button",{type:"button",className:"pvx-reg-unregister-btn",onClick:()=>p(!0),children:"Unregister"})}):e.jsx("div",{className:"pvx-reg-actions",children:e.jsx("a",{href:a,target:"_blank",rel:"noopener noreferrer",className:"pvx-comp-register-link",children:"Manage on PitVox"})})]})}function Ne({drivers:s,steamId:t}){return s.length?e.jsx("div",{className:"pvx-reg-driver-list",children:s.map(r=>{var a,i;const n=t&&r.steamId===t;return e.jsxs("div",{className:`pvx-entry-card ${n?"pvx-entry-card--you":""}`,children:[r.avatarUrl?e.jsx("img",{src:r.avatarUrl,alt:"",className:"pvx-entry-avatar"}):e.jsx("div",{className:"pvx-entry-avatar pvx-entry-avatar--placeholder",children:((i=(a=r.displayName)==null?void 0:a.charAt(0))==null?void 0:i.toUpperCase())||"?"}),e.jsxs("span",{className:"pvx-entry-name",children:[r.displayName,n&&e.jsx("span",{className:"pvx-entry-you",children:" (you)"})]})]},r.steamId||r.driverId)})}):e.jsx("div",{className:"pvx-reg-no-drivers",children:"No drivers registered yet."})}function be({count:s,max:t}){const r=t?s/t*100:0,n=r>=100?"full":r>=75?"warning":"ok";return e.jsxs("span",{className:`pvx-reg-capacity pvx-reg-capacity--${n}`,children:[s,"/",t," drivers"]})}function ye(s){const{cdnUrl:t,partnerSlug:r}=y(),n=b.useQuery({queryKey:["pitvox","laps",r,s],queryFn:()=>w(t,`laps/partners/${r}/${s}.json`),enabled:!!s,staleTime:3e4,refetchInterval:3e4}),a=n.data;return{isLoading:n.isLoading,error:n.error,data:a?{driverName:a.driverName||"Driver",lapCount:a.lapCount||0,trackBreakdown:a.trackBreakdown||[],carBreakdown:a.carBreakdown||[],recordsHeld:a.recordsHeld||0,currentRecords:a.currentRecords||[],bestRanking:a.bestRanking??null,bestRankingTrackId:a.bestRankingTrackId??null,bestRankingLayout:a.bestRankingLayout??null,bestRankingCarId:a.bestRankingCarId??null,generatedAt:a.generatedAt}:null}}function Ce(s){var i;const{cdnUrl:t,partnerSlug:r}=y(),n=b.useQuery({queryKey:["pitvox","ratings",r],queryFn:()=>w(t,`leaderboards/partners/${r}/ratings.json`),staleTime:6e4,refetchInterval:6e4}),a=N.useMemo(()=>{var o;return!((o=n.data)!=null&&o.drivers)||!s?null:n.data.drivers.find(l=>l.identifier===s)||null},[(i=n.data)==null?void 0:i.drivers,s]);return{isLoading:n.isLoading,error:n.error,data:a?{rating:a.rating,rank:a.rank,totalDrivers:n.data.driverCount||n.data.drivers.length,comboCount:a.comboCount||0,distinctCars:a.distinctCars||0,combos:a.combos||[]}:null}}function we(){const{cdnUrl:s,partnerSlug:t,getSteamId:r}=y(),n=r(),{data:a,isLoading:i}=b.useQuery({queryKey:["pitvox","competitions",t],queryFn:async()=>{const x=await w(s,"competitions/index.json");return x!=null&&x.competitions?x.competitions.filter(h=>h.partnerSlug===t):[]},staleTime:6e4}),o=(a==null?void 0:a.map(x=>x.id))||[],l=b.useQueries({queries:o.map(x=>({queryKey:["pitvox","competition",t,x,"entrylist"],queryFn:()=>w(s,`competitions/${t}/${x}/entrylist.json`),enabled:!!n&&o.length>0,staleTime:6e4}))}),p=l.some(x=>x.isLoading);return{data:N.useMemo(()=>{var u,g;if(!a||!n||p)return[];const x=new Date,h=[];for(let j=0;j<a.length;j++){const d=a[j],f=(u=l[j])==null?void 0:u.data;if(!((g=f==null?void 0:f.drivers)==null?void 0:g.some(C=>C.steamId===n)))continue;const v=d.rounds||[];for(const C of v)C.isFinalized||!C.startTime||new Date(C.startTime)<=x||h.push({competitionId:d.id,competitionName:d.name,roundNumber:C.roundNumber,track:C.track||"TBD",startTime:C.startTime})}return h.sort((j,d)=>new Date(j.startTime)-new Date(d.startTime)),h.length>0&&(h[0].isNext=!0),h},[a,n,p,l]),isLoading:i||!!n&&p}}function ke(){const{onFetchNotifications:s}=y();return!!s}function Re(s={}){const{onFetchNotifications:t,partnerSlug:r}=y(),{limit:n=20,unreadOnly:a=!1}=s;return b.useQuery({queryKey:["pitvox","notifications",r,{limit:n,unreadOnly:a}],queryFn:()=>t({limit:n,unreadOnly:a}),enabled:!!t,staleTime:3e4,refetchInterval:3e4})}function js(){const{onFetchNotifications:s,partnerSlug:t}=y(),{data:r,isLoading:n}=b.useQuery({queryKey:["pitvox","notifications",t,{limit:1,unreadOnly:!1}],queryFn:()=>s({limit:1}),enabled:!!s,staleTime:3e4,refetchInterval:3e4,select:a=>(a==null?void 0:a.unreadCount)??0});return{count:r??0,isLoading:n}}function Te(){const{onMarkNotificationRead:s,partnerSlug:t}=y(),r=b.useQueryClient();return b.useMutation({mutationFn:n=>{if(!s)throw new Error("No onMarkNotificationRead callback provided to PitVoxPartnerProvider.");return s(n)},onSuccess:(n,a)=>{r.setQueriesData({queryKey:["pitvox","notifications",t]},i=>i!=null&&i.notifications?{...i,unreadCount:Math.max(0,(i.unreadCount||0)-1),notifications:i.notifications.map(o=>o.id===a?{...o,isRead:!0,readAt:new Date().toISOString()}:o)}:i)}})}function Le(){const{onMarkAllNotificationsRead:s,partnerSlug:t}=y(),r=b.useQueryClient();return b.useMutation({mutationFn:()=>{if(!s)throw new Error("No onMarkAllNotificationsRead callback provided to PitVoxPartnerProvider.");return s()},onSuccess:()=>{r.setQueriesData({queryKey:["pitvox","notifications",t]},n=>n!=null&&n.notifications?{...n,unreadCount:0,notifications:n.notifications.map(a=>({...a,isRead:!0,readAt:a.readAt||new Date().toISOString()}))}:n)}})}function Se({driverName:s,avatarUrl:t,memberSince:r,className:n=""}){const a=r?new Date(r).toLocaleDateString("en-GB",{day:"2-digit",month:"2-digit",year:"numeric"}):null;return e.jsxs("div",{className:`pvx-card pvx-dash-profile ${n}`,children:[t?e.jsx("img",{src:t,alt:"",className:"pvx-dash-profile-avatar"}):e.jsx("div",{className:"pvx-dash-profile-avatar pvx-dash-profile-avatar--placeholder",children:(s||"?")[0].toUpperCase()}),e.jsxs("div",{className:"pvx-dash-profile-info",children:[e.jsx("h2",{className:"pvx-dash-profile-name",children:s}),a&&e.jsxs("p",{className:"pvx-dash-profile-since",children:["Racing since ",a]})]})]})}function Ns(){return e.jsxs("svg",{className:"pvx-dash-stat-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("line",{x1:"4",y1:"9",x2:"20",y2:"9"}),e.jsx("line",{x1:"4",y1:"15",x2:"20",y2:"15"}),e.jsx("line",{x1:"10",y1:"3",x2:"8",y2:"21"}),e.jsx("line",{x1:"16",y1:"3",x2:"14",y2:"21"})]})}function bs(){return e.jsxs("svg",{className:"pvx-dash-stat-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("circle",{cx:"12",cy:"12",r:"2"}),e.jsx("path",{d:"M12 14v4"}),e.jsx("path",{d:"M10.5 12.5l-4 2.5"}),e.jsx("path",{d:"M13.5 12.5l4 2.5"})]})}function ys(){return e.jsx("svg",{className:"pvx-dash-stat-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("polygon",{points:"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"})})}function te({items:s,labelKey:t,countKey:r}){if(!(s!=null&&s.length))return null;const n=s.slice().sort((a,i)=>i[r]-a[r]).slice(0,10);return e.jsxs("div",{className:"pvx-dash-tooltip",children:[n.map((a,i)=>e.jsxs("div",{className:"pvx-dash-tooltip-row",children:[e.jsx("span",{className:"pvx-dash-tooltip-label",children:a[t]}),e.jsx("span",{className:"pvx-dash-tooltip-value",children:a[r]})]},i)),s.length>10&&e.jsxs("div",{className:"pvx-dash-tooltip-row pvx-dash-tooltip-more",children:["+",s.length-10," more"]})]})}function Me({stats:s,rating:t,className:r=""}){if(!s)return null;const n=s.trackBreakdown.map(i=>({name:B(i.trackId,i.layout),lapCount:i.lapCount})),a=s.carBreakdown.map(i=>({name:T(i.carId),lapCount:i.lapCount}));return e.jsxs("div",{className:`pvx-dash-stats ${r}`,children:[e.jsxs("div",{className:"pvx-dash-stat-card pvx-dash-stat-card--has-tooltip",children:[e.jsx(Ns,{}),e.jsxs("div",{className:"pvx-dash-stat-content",children:[e.jsx("span",{className:"pvx-dash-stat-value",children:s.lapCount.toLocaleString()}),e.jsx("span",{className:"pvx-dash-stat-label",children:"Total Laps"})]}),e.jsx(te,{items:n,labelKey:"name",countKey:"lapCount"})]}),e.jsxs("div",{className:"pvx-dash-stat-card pvx-dash-stat-card--has-tooltip",children:[e.jsx(bs,{}),e.jsxs("div",{className:"pvx-dash-stat-content",children:[e.jsx("span",{className:"pvx-dash-stat-value",children:s.carBreakdown.length}),e.jsx("span",{className:"pvx-dash-stat-label",children:"Cars Used"})]}),e.jsx(te,{items:a,labelKey:"name",countKey:"lapCount"})]}),t&&e.jsxs("div",{className:"pvx-dash-stat-card pvx-dash-stat-card--rating",children:[e.jsx(ys,{}),e.jsxs("div",{className:"pvx-dash-stat-content",children:[e.jsx("span",{className:"pvx-dash-stat-value",children:t.rating.toFixed(1)}),e.jsx("span",{className:"pvx-dash-stat-label",children:"Driver Rating"}),e.jsxs("span",{className:"pvx-dash-stat-sub",children:["#",t.rank," of ",t.totalDrivers]})]})]})]})}function $e({records:s,className:t=""}){const r=N.useMemo(()=>s!=null&&s.length?s.slice().sort((n,a)=>{const i=n.recordedAt?new Date(n.recordedAt).getTime():0;return(a.recordedAt?new Date(a.recordedAt).getTime():0)-i}):[],[s]);return r.length?e.jsxs("div",{className:`pvx-card ${t}`,children:[e.jsx("div",{className:"pvx-card-header",children:e.jsxs("h3",{className:"pvx-card-title",children:[e.jsx("span",{className:"pvx-dash-records-icon",children:e.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M6 9H4.5a2.5 2.5 0 010-5H6"}),e.jsx("path",{d:"M18 9h1.5a2.5 2.5 0 000-5H18"}),e.jsx("path",{d:"M4 22h16"}),e.jsx("path",{d:"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20 7 22"}),e.jsx("path",{d:"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20 17 22"}),e.jsx("path",{d:"M18 2H6v7a6 6 0 0012 0V2z"})]})}),"Current Records",e.jsxs("span",{className:"pvx-dash-records-count",children:["(",r.length,")"]})]})}),e.jsx("div",{className:"pvx-dash-records-list",children:r.map((n,a)=>e.jsxs("div",{className:"pvx-dash-record-row",children:[e.jsxs("div",{className:"pvx-dash-record-info",children:[e.jsx("span",{className:"pvx-dash-record-track",children:B(n.trackId,n.layout,n.game)}),e.jsx("span",{className:"pvx-dash-record-car",children:T(n.carId)})]}),e.jsxs("div",{className:"pvx-dash-record-time",children:[e.jsx("span",{className:"pvx-dash-record-lap",children:$(n.lapTimeMs)}),e.jsxs("span",{className:`pvx-dash-game-badge pvx-dash-game-badge--${n.game||"evo"}`,children:[(n.game||"evo").toUpperCase(),n.gameVersion?` ${n.gameVersion}`:""]})]})]},a))})]}):null}function De({events:s,isLoading:t,className:r}){return t?e.jsx("div",{className:"pvx-loading",children:"Loading upcoming events..."}):s!=null&&s.length?e.jsxs("div",{className:`pvx-card ${r||""}`,children:[e.jsx("div",{className:"pvx-card-header",children:e.jsxs("h3",{className:"pvx-card-title",children:[e.jsx(ws,{}),"Upcoming Events",e.jsxs("span",{className:"pvx-dash-records-count",children:["(",s.length,")"]})]})}),e.jsx("div",{className:"pvx-upcoming-list",children:s.map(n=>e.jsxs("div",{className:`pvx-upcoming-item ${n.isNext?"pvx-upcoming-item--next":""}`,children:[e.jsxs("div",{className:"pvx-upcoming-info",children:[e.jsx("span",{className:"pvx-upcoming-comp",children:n.competitionName}),e.jsxs("span",{className:"pvx-upcoming-round",children:["Round ",n.roundNumber,": ",n.track]})]}),e.jsxs("div",{className:"pvx-upcoming-time",children:[e.jsx("span",{className:"pvx-upcoming-date",children:new Date(n.startTime).toLocaleDateString("en-GB",{day:"numeric",month:"short",year:"numeric"})}),e.jsx("span",{className:"pvx-upcoming-relative",children:Cs(n.startTime)}),n.isNext&&e.jsx("span",{className:"pvx-upcoming-badge",children:"Next"})]})]},`${n.competitionId}-${n.roundNumber}`))})]}):null}function Cs(s){const t=new Date(s).getTime()-Date.now();if(t<=0)return"Now";const r=Math.floor(t/(1e3*60*60));if(r<1)return"Less than 1 hour";if(r<24)return`in ${r}h`;const n=Math.floor(r/24);if(n===1)return"Tomorrow";if(n<7)return`in ${n} days`;if(n<30){const a=Math.floor(n/7);return`in ${a} week${a!==1?"s":""}`}return Q(s)}function ws(){return e.jsxs("svg",{className:"pvx-dash-records-icon",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2"}),e.jsx("path",{d:"M16 2v4M8 2v4M3 10h18"})]})}function Ie({notifications:s,unreadCount:t=0,onMarkRead:r,onMarkAllRead:n,isLoading:a,className:i}){const o=W();return a?e.jsx("div",{className:"pvx-loading",children:"Loading notifications..."}):e.jsxs("div",{className:`pvx-card ${i||""}`,children:[e.jsxs("div",{className:"pvx-card-header",children:[e.jsxs("h3",{className:"pvx-card-title",children:[e.jsx(Ts,{}),"Notifications",t>0&&e.jsx("span",{className:"pvx-notif-badge",children:t>99?"99+":t})]}),t>0&&n&&e.jsx("button",{className:"pvx-notif-mark-all",onClick:n,children:"Mark all read"})]}),s!=null&&s.length?e.jsx("div",{className:"pvx-notif-list",children:s.map(l=>e.jsx(ks,{notification:l,getUserDisplay:o,onMarkRead:r},l.id))}):e.jsx("div",{className:"pvx-notif-empty",children:"No notifications"})]})}function ks({notification:s,getUserDisplay:t,onMarkRead:r}){const n=()=>{!s.isRead&&r&&r(s.id)};return e.jsxs("button",{className:`pvx-notif-item ${s.isRead?"":"pvx-notif-item--unread"}`,onClick:n,children:[e.jsx(Rs,{type:s.type}),e.jsxs("div",{className:"pvx-notif-content",children:[e.jsx("span",{className:"pvx-notif-message",children:re(s,t)}),e.jsx("span",{className:"pvx-notif-time",children:Q(s.createdAt)})]}),!s.isRead&&e.jsx("span",{className:"pvx-notif-dot"})]})}function Rs({type:s}){return s==="RECORD_BEATEN"?e.jsx("span",{className:"pvx-notif-icon pvx-notif-icon--beaten",children:e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("path",{d:"m7 7 10 10M17 7v10H7"})})}):s==="ADMIN_MESSAGE"?e.jsx("span",{className:"pvx-notif-icon pvx-notif-icon--admin",children:e.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"m3 11 18-5v12L3 13v-2z"}),e.jsx("path",{d:"M11.6 16.8a3 3 0 1 1-5.8-1.6"})]})}):e.jsx("span",{className:"pvx-notif-icon pvx-notif-icon--record",children:e.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M6 9H4.5a2.5 2.5 0 0 1 0-5H6"}),e.jsx("path",{d:"M18 9h1.5a2.5 2.5 0 0 0 0-5H18"}),e.jsx("path",{d:"M4 22h16"}),e.jsx("path",{d:"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22"}),e.jsx("path",{d:"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22"}),e.jsx("path",{d:"M18 2H6v7a6 6 0 0 0 12 0V2Z"})]})})}function Ts(){return e.jsxs("svg",{className:"pvx-dash-records-icon",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"}),e.jsx("path",{d:"M10.3 21a1.94 1.94 0 0 0 3.4 0"})]})}function Ls({steamId:s,avatarUrl:t,memberSince:r,className:n=""}){const{data:a,isLoading:i,error:o}=ye(s),{data:l,isLoading:p}=Ce(s),{data:c,isLoading:x}=we(),h=ke(),{data:u,isLoading:g}=Re({limit:10}),j=Te(),d=Le();return i||p?e.jsx("div",{className:"pvx-loading",children:"Loading dashboard..."}):o?e.jsx("div",{className:"pvx-empty",children:"Failed to load dashboard data."}):a?e.jsxs("div",{className:`pvx-dash ${n}`,children:[e.jsx(Se,{driverName:a.driverName,avatarUrl:t,memberSince:r}),e.jsx(Me,{stats:a,rating:l}),s&&e.jsx(De,{events:c,isLoading:x}),e.jsxs("div",{className:`pvx-dash-row ${h?"pvx-dash-row--2col":""}`,children:[e.jsx($e,{records:a.currentRecords}),h&&e.jsx(Ie,{notifications:u==null?void 0:u.notifications,unreadCount:(u==null?void 0:u.unreadCount)||0,onMarkRead:f=>j.mutate(f),onMarkAllRead:()=>d.mutate(),isLoading:g})]})]}):e.jsx("div",{className:"pvx-empty",children:"No data available yet. Start driving to see your stats!"})}exports.CarsTable=Ze;exports.CompEmptyState=M;exports.CompLoadingState=I;exports.CompetitionCards=ns;exports.DriverDashboard=Ls;exports.DriverProfile=Se;exports.DriversTable=Ye;exports.EntryList=ms;exports.InfoPill=A;exports.LapHistoryTable=Je;exports.NotificationsCard=Ie;exports.PODIUM_MEDALS=ve;exports.PitVoxPartnerProvider=Ae;exports.RecordsTable=$e;exports.RegisterButton=vs;exports.RegistrationPanel=hs;exports.RoundResults=ds;exports.RoundSessionResults=je;exports.StandingsTable=cs;exports.StatsCards=Me;exports.TracksTable=ze;exports.TypeBadge=fe;exports.UpcomingEvents=De;exports.formatCarName=T;exports.formatDate=D;exports.formatDelta=Ee;exports.formatLapTime=$;exports.formatNotificationMessage=re;exports.formatRelativeTime=Q;exports.formatSectorTime=S;exports.formatTrackName=B;exports.formatTyreCompound=O;exports.useCarLeaderboard=qe;exports.useCarMetadata=_e;exports.useCompetitionAllRounds=Ke;exports.useCompetitionConfig=ie;exports.useCompetitionEntryList=G;exports.useCompetitionRound=ce;exports.useCompetitionStandings=oe;exports.useCompetitions=Ve;exports.useDriverLaps=ae;exports.useDriverRating=Ce;exports.useDriverStats=ye;exports.useLeaderboardIndex=Fe;exports.useMarkAllNotificationsRead=Le;exports.useMarkNotificationRead=Te;exports.useNotifications=Re;exports.useNotificationsEnabled=ke;exports.usePitVox=y;exports.useRegister=z;exports.useRegistrationMode=F;exports.useRegistrationStatus=E;exports.useRegistrationUrl=_;exports.useTrackLeaderboard=ne;exports.useUnreadCount=js;exports.useUpcomingEvents=we;exports.useUserLookup=W;exports.useWithdraw=Z;
|