@pitvox/partner-react 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -165,22 +165,73 @@ function DashboardPage() {
165
165
  | `memberSince` | `string` | — | ISO date for "Racing since" display |
166
166
  | `className` | `string` | — | Additional class on root container |
167
167
 
168
+ The dashboard automatically includes:
169
+ - **Upcoming Events** — competition rounds the driver is registered for (CDN-based, always available)
170
+ - **Notifications** — only when `onFetchNotifications` is provided to the provider (see [Notifications](#notifications))
171
+
168
172
  ### Layer components
169
173
 
170
174
  ```jsx
171
- import { DriverProfile, StatsCards, RecordsTable } from '@pitvox/partner-react'
175
+ import { DriverProfile, StatsCards, RecordsTable, UpcomingEvents, NotificationsCard } from '@pitvox/partner-react'
172
176
  ```
173
177
 
178
+ - **`<UpcomingEvents>`** — Upcoming competition rounds card (accepts `events` array from `useUpcomingEvents()`)
179
+ - **`<NotificationsCard>`** — Notifications list with read/unread state (accepts `notifications`, `unreadCount`, `onMarkRead`, `onMarkAllRead`)
180
+
174
181
  ### Hooks
175
182
 
176
183
  ```jsx
177
- import { useDriverStats, useDriverRating } from '@pitvox/partner-react'
184
+ import { useDriverStats, useDriverRating, useUpcomingEvents } from '@pitvox/partner-react'
178
185
  ```
179
186
 
180
187
  **`useDriverStats(steamId)`** — Driver stats, records, and ranking from CDN.
181
188
 
182
189
  **`useDriverRating(steamId)`** — Driver's rating from the partner ratings file.
183
190
 
191
+ **`useUpcomingEvents()`** — Upcoming competition rounds the current user is registered for (CDN-based).
192
+
193
+ ## Notifications
194
+
195
+ Notifications require a backend to proxy requests to pitvox-api (keeping the API key server-side). Provide callbacks to the provider:
196
+
197
+ ```jsx
198
+ <PitVoxPartnerProvider
199
+ partnerSlug="your-slug"
200
+ getSteamId={() => user?.steamId ?? null}
201
+ onFetchNotifications={async (params) => {
202
+ const res = await fetch(`/api/notifications?limit=${params.limit || 20}`)
203
+ return res.json() // { notifications: [...], unreadCount: number }
204
+ }}
205
+ onMarkNotificationRead={async (id) => {
206
+ await fetch(`/api/notifications/${id}/read`, { method: 'PATCH' })
207
+ }}
208
+ onMarkAllNotificationsRead={async () => {
209
+ await fetch('/api/notifications/read-all', { method: 'PATCH' })
210
+ }}
211
+ >
212
+ ```
213
+
214
+ When no callbacks are provided, notification hooks return disabled/empty state and `DriverDashboard` hides the notifications section.
215
+
216
+ ### Hooks
217
+
218
+ ```jsx
219
+ import {
220
+ useNotifications, useUnreadCount, useMarkNotificationRead,
221
+ useMarkAllNotificationsRead, useNotificationsEnabled,
222
+ } from '@pitvox/partner-react'
223
+ ```
224
+
225
+ **`useNotifications(options?)`** — Fetch notifications (polls every 30s). Returns `{ data: { notifications, unreadCount }, isLoading }`.
226
+
227
+ **`useUnreadCount()`** — Unread count for navbar badges. Returns `{ count, isLoading }`.
228
+
229
+ **`useMarkNotificationRead()`** — Mutation to mark a notification as read.
230
+
231
+ **`useMarkAllNotificationsRead()`** — Mutation to mark all as read.
232
+
233
+ **`useNotificationsEnabled()`** — Returns `boolean` — whether notification callbacks are provided.
234
+
184
235
  ## Registration
185
236
 
186
237
  The SDK supports two registration modes, determined by whether you provide callbacks to the provider.
@@ -233,7 +284,8 @@ import {
233
284
  formatDate, // ISO string → "27 Feb 2024"
234
285
  formatRelativeTime, // ISO string → "2h ago"
235
286
  formatDelta, // 542 → "+0.542"
236
- formatTyreCompound, // "SR" → "Soft Race"
287
+ formatTyreCompound, // "SR" → "Soft Race"
288
+ formatNotificationMessage, // notification → "X beat your record on Track — Car"
237
289
  } from '@pitvox/partner-react'
238
290
  ```
239
291
 
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),N=require("react"),y=require("@tanstack/react-query"),K=N.createContext(null),ke="https://cdn.pitvox.com",Te="https://pitvox.com";let q=null;function Se({partnerSlug:s,cdnUrl:r=ke,pitvoxUrl:t=Te,getSteamId:a,onRegister:n,onWithdraw:i,children:o}){const l=N.useMemo(()=>({partnerSlug:s,cdnUrl:r.replace(/\/$/,""),pitvoxUrl:t.replace(/\/$/,""),getSteamId:a||(()=>null),onRegister:n||null,onWithdraw:i||null}),[s,r,t,a,n,i]);let p=!1;try{y.useQueryClient(),p=!0}catch{p=!1}return p?e.jsx(K.Provider,{value:l,children:o}):(q||(q=new y.QueryClient({defaultOptions:{queries:{staleTime:6e4}}})),e.jsx(y.QueryClientProvider,{client:q,children:e.jsx(K.Provider,{value:l,children:o})}))}function b(){const s=N.useContext(K);if(!s)throw new Error("usePitVox must be used within a <PitVoxPartnerProvider>");return s}async function w(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 L(s){if(!s&&s!==0)return"-";const r=Math.floor(s/1e3),t=Math.floor(r/60),a=r%60,n=s%1e3;return`${t}:${String(a).padStart(2,"0")}.${String(n).padStart(3,"0")}`}function S(s){return!s&&s!==0?"-":(s/1e3).toFixed(3)}function T(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 B(s,r,t){const a=s.split("_").map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join(" "),n=t==="acc"||!t&&(r==null?void 0:r.toLowerCase())==="track config";if(!r||r==="default"||n)return a;const i=r.split("_").map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join(" ");return`${a} ${i}`}function $(s){if(!s)return"-";try{return new Date(s).toLocaleDateString("en-GB",{day:"numeric",month:"short",year:"numeric"})}catch{return"-"}}function Re(s){if(!s)return"";const r=Date.now()-new Date(s).getTime(),t=Math.floor(r/1e3);if(t<60)return"Just now";const a=Math.floor(t/60);if(a<60)return`${a}m ago`;const n=Math.floor(a/60);if(n<24)return`${n}h ago`;const i=Math.floor(n/24);return i<30?`${i}d ago`:$(s)}function Le(s){return s==null?"":`${s>=0?"+":"-"}${(Math.abs(s)/1e3).toFixed(3)}`}function H(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 $e(s={}){var l,p,c,m,f,v;const{cdnUrl:r,partnerSlug:t}=b(),{game:a,gameVersion:n}=s,i=y.useQuery({queryKey:["pitvox","leaderboards",t,"index"],queryFn:()=>w(r,`leaderboards/partners/${t}/index.json`),staleTime:3e4,refetchInterval:3e4}),o=N.useMemo(()=>{var h;if(!((h=i.data)!=null&&h.tracks))return[];let x=i.data.tracks;return a&&(x=x.filter(d=>d.game===a)),n&&(x=x.filter(d=>d.gameVersion===n)),x.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,a,n]);return{...i,data:o,partner:((p=i.data)==null?void 0:p.partner)||null,generatedAt:(c=i.data)==null?void 0:c.generatedAt,totalLaps:((m=i.data)==null?void 0:m.totalLaps)||0,totalUsers:((f=i.data)==null?void 0:f.totalUsers)||0,versions:((v=i.data)==null?void 0:v.versions)||{}}}function re(s,r,t={}){const{cdnUrl:a,partnerSlug:n}=b(),{carId:i,game:o,gameVersion:l}=t,p=r||"default",c=l?`leaderboards/partners/${n}/v/${l}/tracks/${s}/${p}.json`:`leaderboards/partners/${n}/tracks/${s}/${p}.json`,{data:m,isLoading:f,error:v}=y.useQuery({queryKey:["pitvox","leaderboards",n,"track",s,p,l],queryFn:()=>w(a,c),enabled:!!s,staleTime:3e4,refetchInterval:3e4});return{data:N.useMemo(()=>{if(!(m!=null&&m.entries))return[];let h=m.entries;if(o&&(h=h.filter(d=>d.game===o)),!i){const d=new Map,g=new Map;for(const u of h){const j=u.steamId||u.userId;g.has(u.carId)||g.set(u.carId,new Set),g.get(u.carId).add(j),(!d.has(u.carId)||u.lapTimeMs<d.get(u.carId).lapTimeMs)&&d.set(u.carId,u)}return Array.from(d.values()).map(u=>{var j;return{...u,driverCount:((j=g.get(u.carId))==null?void 0:j.size)||0}}).sort((u,j)=>u.lapTimeMs-j.lapTimeMs)}return h.filter(d=>d.carId===i).sort((d,g)=>d.lapTimeMs-g.lapTimeMs)},[m==null?void 0:m.entries,i,o]),isLoading:f,error:v}}function te(s,r,t,a,n={}){var v,x;const{cdnUrl:i,partnerSlug:o}=b(),{showInvalid:l=!1,game:p,gameVersion:c}=n,m=y.useQuery({queryKey:["pitvox","laps",o,s],queryFn:()=>w(i,`laps/partners/${o}/${s}.json`),enabled:!!s,staleTime:3e4,refetchInterval:3e4}),f=N.useMemo(()=>{var h;return(h=m.data)!=null&&h.laps?m.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!==a||p&&d.game!==p||c&&d.gameVersion!==c||!l&&!d.isValid)}).sort((d,g)=>d.lapTimeMs-g.lapTimeMs):[]},[(v=m.data)==null?void 0:v.laps,r,t,a,p,c,l]);return{...m,data:f,driverName:((x=m.data)==null?void 0:x.driverName)||"Driver"}}function Me(){const{cdnUrl:s}=b(),{data:r}=y.useQuery({queryKey:["pitvox","users","index"],queryFn:()=>w(s,"users/index.json"),staleTime:5*6e4,gcTime:30*6e4}),t=(r==null?void 0:r.users)||{};return(a,n)=>{const i=t[a];return{displayName:(i==null?void 0:i.displayName)||n||a||"Unknown",avatarUrl:(i==null?void 0:i.avatarUrl)||null,affiliations:(i==null?void 0:i.affiliations)||[]}}}function De(){const{cdnUrl:s}=b(),{data:r}=y.useQuery({queryKey:["pitvox","cars","index"],queryFn:()=>w(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 Pe(s,r){return re(s,null,{carId:r})}function Be(){const{cdnUrl:s,partnerSlug:r}=b();return y.useQuery({queryKey:["pitvox","competitions",r],queryFn:async()=>{const t=await w(s,"competitions/index.json");return t!=null&&t.competitions?t.competitions.filter(a=>a.partnerSlug===r):[]},staleTime:6e4})}function ne(s){const{cdnUrl:r,partnerSlug:t}=b();return y.useQuery({queryKey:["pitvox","competition",t,s,"config"],queryFn:()=>w(r,`competitions/${t}/${s}/config.json`),enabled:!!s,staleTime:6e4})}function ae(s){const{cdnUrl:r,partnerSlug:t}=b();return y.useQuery({queryKey:["pitvox","competition",t,s,"standings"],queryFn:()=>w(r,`competitions/${t}/${s}/standings.json`),enabled:!!s,staleTime:6e4})}function ie(s,r){const{cdnUrl:t,partnerSlug:a}=b();return y.useQuery({queryKey:["pitvox","competition",a,s,"round",r],queryFn:()=>w(t,`competitions/${a}/${s}/rounds/${r}.json`),enabled:!!s&&r!=null,staleTime:6e4})}function Ue(s,r=[]){const{cdnUrl:t,partnerSlug:a}=b();return y.useQuery({queryKey:["pitvox","competition",a,s,"allRounds",r],queryFn:async()=>(await Promise.all(r.map(i=>w(t,`competitions/${a}/${s}/rounds/${i}.json`).catch(()=>null)))).filter(Boolean),enabled:!!s&&r.length>0,staleTime:6e4})}function Q(s){const{cdnUrl:r,partnerSlug:t}=b();return y.useQuery({queryKey:["pitvox","competition",t,s,"entrylist"],queryFn:()=>w(r,`competitions/${t}/${s}/entrylist.json`),enabled:!!s,staleTime:6e4})}function U(s){const{cdnUrl:r,partnerSlug:t,getSteamId:a}=b(),n=a();return y.useQuery({queryKey:["pitvox","registration",t,s,n],queryFn:async()=>{var p;const i=await fetch(`${r}/competitions/${t}/${s}/entrylist.json`);if(!i.ok)return{isRegistered:!1,entryList:null};const o=await i.json();return{isRegistered:!!n&&((p=o.drivers)==null?void 0:p.some(c=>c.steamId===n)),entryList:o}},enabled:!!s,staleTime:6e4})}function O(s){const{onRegister:r,partnerSlug:t}=b(),a=y.useQueryClient();return y.useMutation({mutationFn:n=>{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,n)},onSuccess:()=>{a.invalidateQueries({queryKey:["pitvox","registration",t,s]}),a.invalidateQueries({queryKey:["pitvox","competition",t,s,"entrylist"]})}})}function W(s){const{onWithdraw:r,partnerSlug:t,getSteamId:a}=b(),n=y.useQueryClient();return y.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 o=i||a();if(!o)throw new Error("No Steam ID available");return r(s,o)},onSuccess:()=>{n.invalidateQueries({queryKey:["pitvox","registration",t,s]}),n.invalidateQueries({queryKey:["pitvox","competition",t,s,"entrylist"]})}})}function I(){const{onRegister:s,onWithdraw:r}=b(),t=!!(s&&r);return{isPowerMode:t,isBasicMode:!t}}function A(s){const{pitvoxUrl:r,partnerSlug:t}=b();return`${r}/p/${t}/competitions/${s}/register`}const Ie={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"},oe=[{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 Ae(s){for(const r of oe)if(r.tags.includes(s))return r.id;return"other"}function le(s,r){if(r.size===0)return!0;const t={};for(const a of r){const n=Ae(a);t[n]||(t[n]=[]),t[n].push(a)}for(const a of Object.values(t))if(!a.some(n=>s.includes(n)))return!1;return!0}function ce(){const[s,r]=N.useState(new Set),t=N.useCallback(n=>{r(i=>{const o=new Set(i);return o.has(n)?o.delete(n):o.add(n),o})},[]),a=N.useCallback(()=>r(new Set),[]);return{activeTags:s,toggle:t,clear:a}}function G(s){const[r,t]=N.useState(s),a=N.useCallback(n=>{t(i=>i.key===n?{key:n,dir:i.dir==="asc"?"desc":"asc"}:{key:n,dir:n.includes("timestamp")||n.includes("Date")?"desc":"asc"})},[]);return[r,a]}function z(s,r,t){return[...s].sort((a,n)=>{const i=t(a,r.key),o=t(n,r.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 r.dir==="desc"?-l:l})}function de(s,r=!1){const t=r?s==null?void 0:s.filter(a=>a.isValid):s;return t!=null&&t.length?{s1:Math.min(...t.map(a=>a.sector1Ms).filter(Boolean)),s2:Math.min(...t.map(a=>a.sector2Ms).filter(Boolean)),s3:Math.min(...t.map(a=>a.sector3Ms).filter(Boolean))}:null}function Fe({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 k({label:s,sortKey:r,config:t,onSort:a,className:n=""}){return e.jsx("th",{className:`pvx-th pvx-th--sortable ${n}`,onClick:()=>a(r),children:e.jsxs("span",{className:"pvx-th-inner",children:[s,e.jsx(Fe,{active:t.key===r,dir:t.dir})]})})}function Z({userId:s,getUserDisplay:r}){const{displayName:t,avatarUrl:a}=r(s);return e.jsxs("span",{className:"pvx-driver",children:[a?e.jsx("img",{src:a,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 pe({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 xe({availableTags:s,activeTags:r,onToggle:t,onClear:a}){if(!s||s.length<2)return null;const n=oe.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:a,className:`pvx-tag ${r.size===0?"pvx-tag--active":""}`,children:"All"}),n.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:()=>t(l),className:`pvx-tag ${r.has(l)?"pvx-tag--active":""}`,children:Ie[l]||l},l))]},i.id))]})}function J({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 a=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"})}),!a&&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 F({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 _e(){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 Ee(){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 Ve({tracks:s,isLoading:r,carMetadata:t,getUserDisplay:a,onTrackSelect:n}){const[i,o]=G({key:"record.timestamp",dir:"desc"}),{activeTags:l,toggle:p,clear:c}=ce(),m=N.useMemo(()=>{var h;if(!((h=t==null?void 0:t.tags)!=null&&h.length))return[];const x=new Set;for(const d of s||[])d.recordByTag&&Object.keys(d.recordByTag).forEach(g=>x.add(g));return t.tags.filter(d=>x.has(d))},[s,t]),f=N.useMemo(()=>s?l.size===0?s:s.map(x=>{var g,u;if(!x.recordByTag)return null;let h=null;const d=new Set;for(const j of Object.values(x.recordByTag)){if(d.has(j.carId))continue;d.add(j.carId);const C=((u=(g=t==null?void 0:t.cars)==null?void 0:g[j.carId])==null?void 0:u.tags)||["sports_car"];le(C,l)&&(!h||j.lapTimeMs<h.lapTimeMs)&&(h=j)}return h?{...x,record:{visibleId:h.steamId||h.identifier,carId:h.carId,carDisplayName:T(h.carId),lapTimeMs:h.lapTimeMs,timestamp:h.recordedAt}}:null}).filter(Boolean):[],[s,l,t]),v=N.useMemo(()=>z(f,i,(x,h)=>{var d,g;switch(h){case"displayName":return x.displayName;case"record.lapTimeMs":return(d=x.record)==null?void 0:d.lapTimeMs;case"driverCount":return x.driverCount||0;case"carCount":return x.carCount||0;case"record.timestamp":default:return(g=x.record)!=null&&g.timestamp?new Date(x.record.timestamp).getTime():0}}),[f,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(xe,{availableTags:m,activeTags:l,onToggle:p,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(k,{label:"Track",sortKey:"displayName",config:i,onSort:o}),e.jsx("th",{className:"pvx-th",children:"Record Holder"}),e.jsx("th",{className:"pvx-th pvx-hidden-below-lg",children:"Car"}),e.jsx(k,{label:"Lap Time",sortKey:"record.lapTimeMs",config:i,onSort:o}),e.jsx(k,{label:"Drivers",sortKey:"driverCount",config:i,onSort:o,className:"pvx-hidden-below-md"}),e.jsx(k,{label:"Cars",sortKey:"carCount",config:i,onSort:o,className:"pvx-hidden-below-lg"}),e.jsx(k,{label:"Date",sortKey:"record.timestamp",config:i,onSort:o,className:"pvx-hidden-below-xl"})]})}),e.jsx("tbody",{className:"pvx-tbody",children:v.map(x=>{var h,d,g;return e.jsxs("tr",{className:"pvx-row pvx-row--clickable",onClick:()=>n(x.id,x.layout),children:[e.jsx("td",{className:"pvx-td pvx-td--primary",children:x.displayName}),e.jsx("td",{className:"pvx-td",children:(h=x.record)!=null&&h.visibleId?e.jsx(Z,{userId:x.record.visibleId,getUserDisplay:a}):"-"}),e.jsx("td",{className:"pvx-td pvx-hidden-below-lg",children:((d=x.record)==null?void 0:d.carDisplayName)||"-"}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:x.record?L(x.record.lapTimeMs):"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-md",children:x.driverCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:x.carCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:(g=x.record)!=null&&g.timestamp?$(x.record.timestamp):"-"})]},`${x.id}|${x.layout||""}`)})})]})})]}):e.jsx(F,{message:"No lap times recorded yet."})}function qe({entries:s,isLoading:r,track:t,carMetadata:a,getUserDisplay:n,onCarSelect:i,onNavigate:o}){const[l,p]=G({key:"lapTimeMs",dir:"asc"}),{activeTags:c,toggle:m,clear:f}=ce(),v=N.useMemo(()=>{var u,j,C;if(!s||!((u=a==null?void 0:a.tags)!=null&&u.length))return[];const g=new Set;for(const D of s)(((C=(j=a.cars)==null?void 0:j[D.carId])==null?void 0:C.tags)||["sports_car"]).forEach(E=>g.add(E));return a.tags.filter(D=>g.has(D))},[s,a]),x=N.useMemo(()=>s?c.size===0?s:s.filter(g=>{var j,C;const u=((C=(j=a==null?void 0:a.cars)==null?void 0:j[g.carId])==null?void 0:C.tags)||["sports_car"];return le(u,c)}):[],[s,c,a]),h=N.useMemo(()=>z(x,l,(g,u)=>{switch(u){case"carId":return T(g.carId);case"driverCount":return g.driverCount||0;case"lapTimeMs":default:return g.lapTimeMs}}),[x,l]),d=[{key:"tracks",label:"Tracks",onClick:()=>o("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(J,{segments:d})}),e.jsx(xe,{availableTags:v,activeTags:c,onToggle:m,onClear:f}),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(k,{label:"Car",sortKey:"carId",config:l,onSort:p}),e.jsx("th",{className:"pvx-th",children:"Record Holder"}),e.jsx(k,{label:"Lap Time",sortKey:"lapTimeMs",config:l,onSort:p}),e.jsx(k,{label:"Drivers",sortKey:"driverCount",config:l,onSort:p,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((g,u)=>e.jsxs("tr",{className:"pvx-row pvx-row--clickable",onClick:()=>i(g.carId),children:[e.jsx("td",{className:"pvx-td",children:e.jsx(pe,{rank:u+1,podium:!0})}),e.jsx("td",{className:"pvx-td pvx-td--primary",children:T(g.carId)}),e.jsx("td",{className:"pvx-td",children:e.jsx(Z,{userId:g.steamId||g.userId,getUserDisplay:n})}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:L(g.lapTimeMs)}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-md",children:g.driverCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-lg",children:g.recordedAt?$(g.recordedAt):"-"})]},g.carId))})]})}):e.jsx(F,{message:"No lap times for this track yet."})]})}function Ke({entries:s,isLoading:r,track:t,carId:a,getUserDisplay:n,onDriverSelect:i,onNavigate:o}){const[l,p]=G({key:"lapTimeMs",dir:"asc"}),c=N.useMemo(()=>de(s),[s]),m=N.useMemo(()=>z(s||[],l,(v,x)=>{switch(x){case"userId":return n(v.steamId||v.userId).displayName;case"lapCount":return v.lapCount||0;case"lapTimeMs":default:return v.lapTimeMs}}),[s,l,n]),f=[{key:"tracks",label:"Tracks",onClick:()=>o("tracks")},{key:"track",label:t.displayName,onClick:()=>o("track")},{key:"car",label:T(a)}];return r?e.jsx(_,{}):e.jsxs("div",{className:"pvx-card",children:[e.jsx("div",{className:"pvx-card-header",children:e.jsx(J,{segments:f})}),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(k,{label:"Driver",sortKey:"userId",config:l,onSort:p}),e.jsx(k,{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(k,{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:m.map((v,x)=>{const h=x+1,d=v.steamId||v.userId,g=c&&v.sector1Ms===c.s1,u=c&&v.sector2Ms===c.s2,j=c&&v.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(pe,{rank:h,podium:!0})}),e.jsx("td",{className:"pvx-td pvx-td--primary",children:e.jsx(Z,{userId:d,getUserDisplay:n})}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:L(v.lapTimeMs)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${g?"pvx-td--best-sector":""}`,children:S(v.sector1Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${u?"pvx-td--best-sector":""}`,children:S(v.sector2Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${j?"pvx-td--best-sector":""}`,children:S(v.sector3Ms)}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",title:H(v.tyreCompound),children:v.tyreCompound||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-xl",children:v.startingFuelL?`${v.startingFuelL}L`:"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:v.lapCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:v.recordedAt?$(v.recordedAt):"-"})]},d)})})]})}):e.jsx(F,{message:"No lap times for this car yet."})]})}function He({userId:s,track:r,carId:t,game:a,gameVersion:n,showInvalid:i,getUserDisplay:o,onToggleInvalid:l,onNavigate:p}){const{data:c,driverName:m,isLoading:f}=te(s,r.id,r.layout,t,{showInvalid:i,game:a,gameVersion:n}),{displayName:v,avatarUrl:x}=o(s,m),h=N.useMemo(()=>de(c,!0),[c]),d=N.useMemo(()=>{const u=(c==null?void 0:c.filter(j=>j.isValid))||[];return u.length?Math.min(...u.map(j=>j.lapTimeMs)):null},[c]),g=[{key:"tracks",label:"Tracks",onClick:()=>p("tracks")},{key:"track",label:r.displayName,onClick:()=>p("track")},{key:"car",label:T(t),onClick:()=>p("car")},{key:"driver",label:v}];return f?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(J,{segments:g}),x?e.jsx("img",{src:x,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((u,j)=>{const C=u.isValid&&u.lapTimeMs===d,D=h&&u.isValid&&u.sector1Ms===h.s1,Y=h&&u.isValid&&u.sector2Ms===h.s2,E=h&&u.isValid&&u.sector3Ms===h.s3;let V="pvx-row";return u.isValid||(V+=" pvx-row--invalid"),C&&(V+=" pvx-row--personal-best"),e.jsxs("tr",{className:V,children:[e.jsx("td",{className:"pvx-td",children:e.jsx("span",{className:`pvx-rank ${C?"pvx-rank--gold":""}`,children:j+1})}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-md",children:u.lapNumber||"-"}),e.jsx("td",{className:"pvx-td pvx-td--primary pvx-td--mono",children:L(u.lapTimeMs)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${D?"pvx-td--best-sector":""}`,children:S(u.sector1Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${Y?"pvx-td--best-sector":""}`,children:S(u.sector2Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${E?"pvx-td--best-sector":""}`,children:S(u.sector3Ms)}),e.jsx("td",{className:"pvx-td",title:u.isValid?void 0:u.invalidReason||"Invalid",children:u.isValid?e.jsx(_e,{}):e.jsx(Ee,{})}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",title:H(u.tyreCompound),children:u.tyreCompound||"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:u.startingFuelL?`${u.startingFuelL}L`:"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:$(u.timestamp)})]},u.id)})})]})}):e.jsx(F,{message:i?"No laps recorded for this combination.":'No valid laps. Try enabling "Show invalid laps".'})]})}const Qe={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:"🇰🇷"},ue=["🥇","🥈","🥉"],Oe={championship:"Championship",series:"Series",event:"Event"},X=["PRACTICE","QUALIFYING","RACE"];function me({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 ve({nation:s}){const r=s&&Qe[s];return r?e.jsx("span",{className:"pvx-nation-flag",title:s,children:r}):null}function We({sessions:s,activeSession:r,onSelect:t}){if(!s||s.length<=1)return null;const a=[...s].sort((n,i)=>X.indexOf(n.type)-X.indexOf(i.type));return e.jsx("div",{className:"pvx-session-tabs",children:a.map(n=>e.jsx("button",{onClick:()=>t(n.type),className:`pvx-session-tab ${r===n.type?"pvx-session-tab--active":""}`,children:n.type},n.type))})}function he({type:s}){return e.jsx("span",{className:`pvx-comp-badge pvx-comp-badge--${s}`,children:Oe[s]||s})}function P({children:s,variant:r="default"}){return e.jsx("span",{className:`pvx-info-pill ${r!=="default"?`pvx-info-pill--${r}`:""}`,children:s})}function Ge(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"}),a=r.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit"});return`${t} • ${a}`}function ze(s){return s.reduce((r,t)=>{var a;return(a=t.splits)!=null&&a.length?r?r.map((n,i)=>{const o=t.splits[i];return o&&o<n?o:n}):[...t.splits]:r},null)}function M({message:s="Loading..."}){return e.jsx("div",{className:"pvx-loading",children:s})}function R({message:s="No data available."}){return e.jsx("div",{className:"pvx-empty",children:e.jsx("p",{children:s})})}function Ze({competitions:s,isLoading:r,onSelect:t,onRegister:a,className:n}){return r?e.jsx(M,{message:"Loading competitions..."}):s!=null&&s.length?e.jsx("div",{className:`pvx-comp-grid ${n||""}`,children:s.map(i=>e.jsx(Je,{comp:i,onSelect:t,onRegister:a||t},i.id))}):e.jsx(R,{message:"No competitions available."})}function Je({comp:s,onSelect:r,onRegister:t}){var d,g,u;const{cdnUrl:a}=b(),n=s.posterCdnPath?`${a}/${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,m=(i==null?void 0:i.isOpen)&&!c&&!p,f=new Date,v=(d=s.rounds)==null?void 0:d.find(j=>j.startTime&&new Date(j.startTime)>=f),x=((g=s.rounds)==null?void 0:g.length)||0,h=((u=s.rounds)==null?void 0:u.filter(j=>j.isFinalized).length)||0;return e.jsxs("div",{className:"pvx-comp-card",onClick:()=>r(s.id),role:"button",tabIndex:0,onKeyDown:j=>{(j.key==="Enter"||j.key===" ")&&(j.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(Xe,{})})}),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(he,{type:s.type}),s.game&&e.jsx(P,{children:s.game.toUpperCase()}),s.formatDescription&&s.formatDescription.split(", ").map((j,C)=>e.jsx(P,{variant:"format",children:j},C))]}),s.carsDescription&&e.jsx("div",{className:"pvx-comp-card-pills",children:s.carsDescription.split(", ").map((j,C)=>e.jsx(P,{children:j},C))}),e.jsxs("div",{className:"pvx-comp-card-schedule",children:[v?e.jsxs("span",{className:"pvx-comp-card-schedule-next",children:[e.jsx("span",{className:"pvx-comp-card-schedule-label",children:"Next:"})," ","R",v.roundNumber," ",v.track||"TBD"," — ",Ge(v.startTime)]}):x>0?e.jsxs("span",{className:"pvx-comp-card-schedule-next",children:[h,"/",x," rounds completed"]}):null,x>0&&e.jsxs("span",{className:"pvx-comp-card-round-count",children:[x," round",x!==1?"s":""]})]}),i&&e.jsx(Ye,{competitionId:s.id,regOpen:m,isFull:p,deadlinePassed:c,regCount:o,regMax:l,onRegister:t})]})]})}function Ye({competitionId:s,regOpen:r,isFull:t,deadlinePassed:a,regCount:n,regMax:i,onRegister:o}){const{isPowerMode:l}=I(),p=A(s),{data:c}=U(s),m=(c==null?void 0:c.isRegistered)||!1,f=i?n/i*100:0,v=f>=100?"full":f>=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--${v}`,children:[n,"/",i||"∞"," drivers"]})}),e.jsx("div",{className:"pvx-comp-card-reg-action",children:m?e.jsx("button",{className:"pvx-comp-card-reg-btn pvx-comp-card-reg-btn--registered",onClick:x=>{x.stopPropagation(),o(s)},children:"✓ Registered"}):r?l?e.jsx("button",{className:"pvx-comp-card-reg-btn pvx-comp-card-reg-btn--open",onClick:x=>{x.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:x=>x.stopPropagation(),children:"Register"}):e.jsx("span",{className:"pvx-comp-card-reg-btn pvx-comp-card-reg-btn--closed",children:t?"Full":"Closed"})})]})}function Xe(){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 es({competitionId:s,className:r}){var l,p;const{data:t,isLoading:a}=ae(s),{data:n,isLoading:i}=ne(s);if(a||i)return e.jsx(M,{message:"Loading standings..."});if(!((l=t==null?void 0:t.standings)!=null&&l.length))return e.jsx(R,{message:"No standings data yet. Results will appear once rounds are finalised."});const o=((p=n==null?void 0:n.rounds)==null?void 0:p.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"}),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:t.standings.map(c=>e.jsx(ss,{driver:c,finalizedRounds:o},c.driverId||c.driverName))})]})})]})}function ss({driver:s,finalizedRounds:r}){var o,l,p;const t=s.position<=3,a=new Map(((o=s.roundResults)==null?void 0:o.map(c=>[c.roundNumber,c]))||[]),n=((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 ${t?"pvx-row--podium":""}`,children:[e.jsx("td",{className:"pvx-td",children:e.jsx(me,{position:s.position})}),e.jsxs("td",{className:"pvx-td pvx-td--primary",children:[e.jsx(ve,{nation:s.nation}),s.driverName]}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-sm",children:n||"-"}),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 m=a.get(c.roundNumber),f=m==null?void 0:m.dropped;return e.jsx("td",{className:`pvx-td pvx-td--center pvx-hidden-below-md ${!f&&(m==null?void 0:m.position)<=3?"pvx-standings-cell--podium":""}`,children:m?e.jsxs("div",{className:`pvx-standings-round-cell ${f?"pvx-standings-round-cell--dropped":""}`,children:[e.jsxs("span",{className:"pvx-standings-round-pos",children:["P",m.position]}),e.jsx("span",{className:"pvx-standings-round-pts",children:m.points})]}):e.jsx("span",{className:"pvx-td--muted",children:"-"})},c.roundNumber)})]})}function rs({competitionId:s,roundNumber:r,className:t}){var p;const{data:a,isLoading:n}=ie(s,r);if(n)return e.jsx(M,{message:"Loading results..."});if(!a)return e.jsx(R,{message:"No results for this round."});const o=(a.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,m)=>c.position-m.position);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 ",a.roundNumber,a.track?`: ${a.track}`:""]}),a.startTime&&e.jsx("p",{className:"pvx-round-results-date",children:new Date(a.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:ue[c.position-1]}),e.jsx("span",{children:c.driverName})]},c.driverId))})]}),e.jsx(ge,{round:a})]})}function ge({round:s,className:r}){var l,p;const[t,a]=N.useState(null),n=(s==null?void 0:s.sessions)||[];if(!n.length)return e.jsx(R,{message:"No session data for this round."});const i=t||((l=n.find(c=>c.type==="RACE"))==null?void 0:l.type)||((p=n[0])==null?void 0:p.type),o=n.find(c=>c.type===i)||n[0];return e.jsxs("div",{className:r||"",children:[e.jsx(We,{sessions:n,activeSession:i,onSelect:a}),e.jsx(ts,{session:o})]})}function ts({session:s}){var a;const r=s.type==="RACE";if(!((a=s.results)!=null&&a.length))return e.jsx(R,{message:`No results for ${s.type}.`});const t=ze(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((n,i)=>e.jsx(ns,{result:n,isRace:r,fastestSplits:t,rowIndex:i},n.driverId||i))})]})})}function ns({result:s,isRace:r,fastestSplits:t,rowIndex:a}){const n=s.position<=3;return e.jsxs("tr",{className:`pvx-row ${n?"pvx-row--podium":""}`,children:[e.jsx("td",{className:"pvx-td",children:e.jsx(me,{position:s.position})}),e.jsxs("td",{className:"pvx-td pvx-td--primary",children:[e.jsx(ve,{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(as,{bestLap:s.bestLapFormatted,hasBestLap:s.hasBestLap,splits:s.splits,fastestSplits:t,showAbove:a<=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 as({bestLap:s,hasBestLap:r,splits:t,fastestSplits:a,showAbove:n}){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 ${n?"":"pvx-splits-tooltip--above"}`,children:t.map((i,o)=>{const l=a&&i===a[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 is({competitionId:s,className:r}){const{getSteamId:t}=b(),{data:a,isLoading:n}=Q(s),i=t();if(n)return e.jsx(M,{message:"Loading drivers..."});const o=(a==null?void 0:a.drivers)||(a==null?void 0:a.entries)||[];return o.length?e.jsx("div",{className:`pvx-entry-grid ${r||""}`,children:o.map(l=>{var c,m;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:((m=(c=l.displayName)==null?void 0:c.charAt(0))==null?void 0:m.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(R,{message:"No drivers registered yet."})}function os({competitionId:s,driverData:r,className:t,children:a}){const{data:n,isLoading:i}=U(s),{isPowerMode:o}=I(),l=A(s),p=O(s),c=W(s),m=(n==null?void 0:n.isRegistered)||!1,f=i||p.isPending||c.isPending,v=p.error||c.error||null,x=()=>{o&&p.mutate(r||{})},h=()=>{o&&c.mutate()};return typeof a=="function"?a({isRegistered:m,isLoading:f,register:x,withdraw:h,error:v,isPowerMode:o,registrationUrl:l}):o?e.jsx("button",{className:`pvx-comp-register-btn ${t||""}`,onClick:m?h:x,disabled:f,children:f?"Loading...":m?"Withdraw":"Register"}):e.jsx("a",{href:l,target:"_blank",rel:"noopener noreferrer",className:`pvx-comp-register-link ${t||""}`,children:m?"View Registration":"Register on PitVox"})}function ls({competitionId:s,registration:r,className:t}){const{getSteamId:a}=b(),{isPowerMode:n}=I(),i=A(s),{data:o,isLoading:l}=U(s),{data:p,isLoading:c}=Q(s),m=O(s),f=W(s),v=a(),x=(o==null?void 0:o.isRegistered)||!1,h=(p==null?void 0:p.drivers)||(p==null?void 0:p.entries)||[],d=r||{},g=d.maxParticipants&&(d.currentCount||0)>=d.maxParticipants,u=d.deadline&&new Date(d.deadline)<new Date,j=d.isOpen&&!u&&!g;return l||c?e.jsx(M,{message:"Loading registration..."}):x?e.jsx("div",{className:`pvx-reg-panel ${t||""}`,children:e.jsx(ds,{competitionId:s,drivers:h,steamId:v,isPowerMode:n,registrationUrl:i,withdrawMutation:f,registration:d})}):j?v?n?e.jsx("div",{className:`pvx-reg-panel ${t||""}`,children:e.jsx(cs,{competitionId:s,registerMutation:m,registration:d})}):e.jsx("div",{className:`pvx-reg-panel ${t||""}`,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 ${t||""}`,children:n?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 ${t||""}`,children:[e.jsx("div",{className:"pvx-reg-status-msg",children:g?"Registration is full.":u?"Registration deadline has passed.":"Registration is closed."}),h.length>0&&e.jsx(je,{drivers:h,steamId:v})]})}function cs({competitionId:s,registerMutation:r,registration:t}){const[a,n]=N.useState(""),[i,o]=N.useState("intermediate"),[l,p]=N.useState(""),c=x=>{x.preventDefault(),r.mutate({discordUsername:a||void 0,experience:i,comments:l||void 0})},m=t||{},f=m.currentCount||0,v=m.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"}),v&&e.jsx(fe,{count:f,max:v})]}),r.error&&e.jsx("div",{className:"pvx-reg-error",children:r.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:a,onChange:x=>n(x.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:x=>o(x.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:x=>p(x.target.value)})]}),e.jsx("div",{className:"pvx-reg-actions",children:e.jsx("button",{type:"submit",className:"pvx-comp-register-btn",disabled:r.isPending,children:r.isPending?"Registering...":"Register"})})]})}function ds({competitionId:s,drivers:r,steamId:t,isPowerMode:a,registrationUrl:n,withdrawMutation:i,registration:o}){const[l,p]=N.useState(!1),c=()=>{i.mutate(void 0,{onSuccess:()=>p(!1)})},m=o||{},f=r.length||m.currentCount||0,v=m.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"}),v&&e.jsx(fe,{count:f,max:v})]}),e.jsx(je,{drivers:r,steamId:t}),i.error&&e.jsx("div",{className:"pvx-reg-error",children:i.error.message||"Withdrawal failed"}),a?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:n,target:"_blank",rel:"noopener noreferrer",className:"pvx-comp-register-link",children:"Manage on PitVox"})})]})}function je({drivers:s,steamId:r}){return s.length?e.jsx("div",{className:"pvx-reg-driver-list",children:s.map(t=>{var n,i;const a=r&&t.steamId===r;return e.jsxs("div",{className:`pvx-entry-card ${a?"pvx-entry-card--you":""}`,children:[t.avatarUrl?e.jsx("img",{src:t.avatarUrl,alt:"",className:"pvx-entry-avatar"}):e.jsx("div",{className:"pvx-entry-avatar pvx-entry-avatar--placeholder",children:((i=(n=t.displayName)==null?void 0:n.charAt(0))==null?void 0:i.toUpperCase())||"?"}),e.jsxs("span",{className:"pvx-entry-name",children:[t.displayName,a&&e.jsx("span",{className:"pvx-entry-you",children:" (you)"})]})]},t.steamId||t.driverId)})}):e.jsx("div",{className:"pvx-reg-no-drivers",children:"No drivers registered yet."})}function fe({count:s,max:r}){const t=r?s/r*100:0,a=t>=100?"full":t>=75?"warning":"ok";return e.jsxs("span",{className:`pvx-reg-capacity pvx-reg-capacity--${a}`,children:[s,"/",r," drivers"]})}function Ne(s){const{cdnUrl:r,partnerSlug:t}=b(),a=y.useQuery({queryKey:["pitvox","laps",t,s],queryFn:()=>w(r,`laps/partners/${t}/${s}.json`),enabled:!!s,staleTime:3e4,refetchInterval:3e4}),n=a.data;return{isLoading:a.isLoading,error:a.error,data:n?{driverName:n.driverName||"Driver",lapCount:n.lapCount||0,trackBreakdown:n.trackBreakdown||[],carBreakdown:n.carBreakdown||[],recordsHeld:n.recordsHeld||0,currentRecords:n.currentRecords||[],bestRanking:n.bestRanking??null,bestRankingTrackId:n.bestRankingTrackId??null,bestRankingLayout:n.bestRankingLayout??null,bestRankingCarId:n.bestRankingCarId??null,generatedAt:n.generatedAt}:null}}function be(s){var i;const{cdnUrl:r,partnerSlug:t}=b(),a=y.useQuery({queryKey:["pitvox","ratings",t],queryFn:()=>w(r,`leaderboards/partners/${t}/ratings.json`),staleTime:6e4,refetchInterval:6e4}),n=N.useMemo(()=>{var o;return!((o=a.data)!=null&&o.drivers)||!s?null:a.data.drivers.find(l=>l.identifier===s)||null},[(i=a.data)==null?void 0:i.drivers,s]);return{isLoading:a.isLoading,error:a.error,data:n?{rating:n.rating,rank:n.rank,totalDrivers:a.data.driverCount||a.data.drivers.length,comboCount:n.comboCount||0,distinctCars:n.distinctCars||0,combos:n.combos||[]}:null}}function ye({driverName:s,avatarUrl:r,memberSince:t,className:a=""}){const n=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 ${a}`,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}),n&&e.jsxs("p",{className:"pvx-dash-profile-since",children:["Racing since ",n]})]})]})}function ps(){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 xs(){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 us(){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 ee({items:s,labelKey:r,countKey:t}){if(!(s!=null&&s.length))return null;const a=s.slice().sort((n,i)=>i[t]-n[t]).slice(0,10);return e.jsxs("div",{className:"pvx-dash-tooltip",children:[a.map((n,i)=>e.jsxs("div",{className:"pvx-dash-tooltip-row",children:[e.jsx("span",{className:"pvx-dash-tooltip-label",children:n[r]}),e.jsx("span",{className:"pvx-dash-tooltip-value",children:n[t]})]},i)),s.length>10&&e.jsxs("div",{className:"pvx-dash-tooltip-row pvx-dash-tooltip-more",children:["+",s.length-10," more"]})]})}function Ce({stats:s,rating:r,className:t=""}){if(!s)return null;const a=s.trackBreakdown.map(i=>({name:B(i.trackId,i.layout),lapCount:i.lapCount})),n=s.carBreakdown.map(i=>({name:T(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(ps,{}),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(ee,{items:a,labelKey:"name",countKey:"lapCount"})]}),e.jsxs("div",{className:"pvx-dash-stat-card pvx-dash-stat-card--has-tooltip",children:[e.jsx(xs,{}),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(ee,{items:n,labelKey:"name",countKey:"lapCount"})]}),r&&e.jsxs("div",{className:"pvx-dash-stat-card pvx-dash-stat-card--rating",children:[e.jsx(us,{}),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 se=10;function we({records:s,className:r=""}){const[t,a]=N.useState(!1),n=N.useMemo(()=>s!=null&&s.length?s.slice().sort((l,p)=>{const c=l.recordedAt?new Date(l.recordedAt).getTime():0;return(p.recordedAt?new Date(p.recordedAt).getTime():0)-c}):[],[s]);if(!n.length)return null;const i=t?n:n.slice(0,se),o=n.length>se;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:["(",n.length,")"]})]})}),e.jsx("div",{className:"pvx-dash-records-list",children:i.map((l,p)=>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(l.trackId,l.layout,l.game)}),e.jsx("span",{className:"pvx-dash-record-car",children:T(l.carId)})]}),e.jsxs("div",{className:"pvx-dash-record-time",children:[e.jsx("span",{className:"pvx-dash-record-lap",children:L(l.lapTimeMs)}),e.jsxs("span",{className:`pvx-dash-game-badge pvx-dash-game-badge--${l.game||"evo"}`,children:[(l.game||"evo").toUpperCase(),l.gameVersion?` ${l.gameVersion}`:""]})]})]},p))}),o&&e.jsx("button",{className:"pvx-dash-records-toggle",onClick:()=>a(!t),children:t?"Show less":`Show all ${n.length} records`})]})}function ms({steamId:s,avatarUrl:r,memberSince:t,className:a=""}){const{data:n,isLoading:i,error:o}=Ne(s),{data:l,isLoading:p}=be(s);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."}):n?e.jsxs("div",{className:`pvx-dash ${a}`,children:[e.jsx(ye,{driverName:n.driverName,avatarUrl:r,memberSince:t}),e.jsx(Ce,{stats:n,rating:l}),e.jsx(we,{records:n.currentRecords})]}):e.jsx("div",{className:"pvx-empty",children:"No data available yet. Start driving to see your stats!"})}exports.CarsTable=qe;exports.CompEmptyState=R;exports.CompLoadingState=M;exports.CompetitionCards=Ze;exports.DriverDashboard=ms;exports.DriverProfile=ye;exports.DriversTable=Ke;exports.EntryList=is;exports.InfoPill=P;exports.LapHistoryTable=He;exports.PODIUM_MEDALS=ue;exports.PitVoxPartnerProvider=Se;exports.RecordsTable=we;exports.RegisterButton=os;exports.RegistrationPanel=ls;exports.RoundResults=rs;exports.RoundSessionResults=ge;exports.StandingsTable=es;exports.StatsCards=Ce;exports.TracksTable=Ve;exports.TypeBadge=he;exports.formatCarName=T;exports.formatDate=$;exports.formatDelta=Le;exports.formatLapTime=L;exports.formatRelativeTime=Re;exports.formatSectorTime=S;exports.formatTrackName=B;exports.formatTyreCompound=H;exports.useCarLeaderboard=Pe;exports.useCarMetadata=De;exports.useCompetitionAllRounds=Ue;exports.useCompetitionConfig=ne;exports.useCompetitionEntryList=Q;exports.useCompetitionRound=ie;exports.useCompetitionStandings=ae;exports.useCompetitions=Be;exports.useDriverLaps=te;exports.useDriverRating=be;exports.useDriverStats=Ne;exports.useLeaderboardIndex=$e;exports.usePitVox=b;exports.useRegister=O;exports.useRegistrationMode=I;exports.useRegistrationStatus=U;exports.useRegistrationUrl=A;exports.useTrackLeaderboard=re;exports.useUserLookup=Me;exports.useWithdraw=W;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),b=require("react"),y=require("@tanstack/react-query"),H=b.createContext(null),Be="https://cdn.pitvox.com",Ue="https://pitvox.com";let K=null;function Ae({partnerSlug:s,cdnUrl:r=Be,pitvoxUrl:n=Ue,getSteamId:t,onRegister:a,onWithdraw:i,onFetchNotifications:o,onMarkNotificationRead:l,onMarkAllNotificationsRead:p,children:c}){const x=b.useMemo(()=>({partnerSlug:s,cdnUrl:r.replace(/\/$/,""),pitvoxUrl:n.replace(/\/$/,""),getSteamId:t||(()=>null),onRegister:a||null,onWithdraw:i||null,onFetchNotifications:o||null,onMarkNotificationRead:l||null,onMarkAllNotificationsRead:p||null}),[s,r,n,t,a,i,o,l,p]);let h=!1;try{y.useQueryClient(),h=!0}catch{h=!1}return h?e.jsx(H.Provider,{value:x,children:c}):(K||(K=new y.QueryClient({defaultOptions:{queries:{staleTime:6e4}}})),e.jsx(y.QueryClientProvider,{client:K,children:e.jsx(H.Provider,{value:x,children:c})}))}function C(){const s=b.useContext(H);if(!s)throw new Error("usePitVox must be used within a <PitVoxPartnerProvider>");return s}async function k(s,r){const n=await fetch(`${s}/${r}`);if(!n.ok){if(n.status===404||n.status===403)return null;throw new Error(`CDN fetch failed: ${n.status}`)}return n.json()}function $(s){if(!s&&s!==0)return"-";const r=Math.floor(s/1e3),n=Math.floor(r/60),t=r%60,a=s%1e3;return`${n}:${String(t).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 r=s;return r.startsWith("ks_")&&(r=r.slice(3)),r.split("_").map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" ")}function B(s,r,n){const t=s.split("_").map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join(" "),a=n==="acc"||!n&&(r==null?void 0:r.toLowerCase())==="track config";if(!r||r==="default"||a)return t;const i=r.split("_").map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join(" ");return`${t} ${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 r=Date.now()-new Date(s).getTime(),n=Math.floor(r/1e3);if(n<60)return"Just now";const t=Math.floor(n/60);if(t<60)return`${t}m ago`;const a=Math.floor(t/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,r){const{type:n,title:t,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 n==="RECORD_BEATEN"&&h?`${p!=null&&p.beatenBySteamId&&r?r(p.beatenBySteamId).displayName:"Someone"} beat your record on ${h}`:n==="RECORD_SET"&&h?`You set a new record on ${h}`:t||"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,m;const{cdnUrl:r,partnerSlug:n}=C(),{game:t,gameVersion:a}=s,i=y.useQuery({queryKey:["pitvox","leaderboards",n,"index"],queryFn:()=>k(r,`leaderboards/partners/${n}/index.json`),staleTime:3e4,refetchInterval:3e4}),o=b.useMemo(()=>{var j;if(!((j=i.data)!=null&&j.tracks))return[];let g=i.data.tracks;return t&&(g=g.filter(d=>d.game===t)),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,t,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:((m=i.data)==null?void 0:m.versions)||{}}}function ne(s,r,n={}){const{cdnUrl:t,partnerSlug:a}=C(),{carId:i,game:o,gameVersion:l}=n,p=r||"default",c=l?`leaderboards/partners/${a}/v/${l}/tracks/${s}/${p}.json`:`leaderboards/partners/${a}/tracks/${s}/${p}.json`,{data:x,isLoading:h,error:m}=y.useQuery({queryKey:["pitvox","leaderboards",a,"track",s,p,l],queryFn:()=>k(t,c),enabled:!!s,staleTime:3e4,refetchInterval:3e4});return{data:b.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 u of j){const v=u.steamId||u.userId;f.has(u.carId)||f.set(u.carId,new Set),f.get(u.carId).add(v),(!d.has(u.carId)||u.lapTimeMs<d.get(u.carId).lapTimeMs)&&d.set(u.carId,u)}return Array.from(d.values()).map(u=>{var v;return{...u,driverCount:((v=f.get(u.carId))==null?void 0:v.size)||0}}).sort((u,v)=>u.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:m}}function ae(s,r,n,t,a={}){var m,g;const{cdnUrl:i,partnerSlug:o}=C(),{showInvalid:l=!1,game:p,gameVersion:c}=a,x=y.useQuery({queryKey:["pitvox","laps",o,s],queryFn:()=>k(i,`laps/partners/${o}/${s}.json`),enabled:!!s,staleTime:3e4,refetchInterval:3e4}),h=b.useMemo(()=>{var j;return(j=x.data)!=null&&j.laps?x.data.laps.filter(d=>{if(d.trackId!==r)return!1;if(n){if(d.trackLayout!==n)return!1}else if(d.trackLayout&&d.trackLayout!=="default")return!1;return!(d.carId!==t||p&&d.game!==p||c&&d.gameVersion!==c||!l&&!d.isValid)}).sort((d,f)=>d.lapTimeMs-f.lapTimeMs):[]},[(m=x.data)==null?void 0:m.laps,r,n,t,p,c,l]);return{...x,data:h,driverName:((g=x.data)==null?void 0:g.driverName)||"Driver"}}function W(){const{cdnUrl:s}=C(),{data:r}=y.useQuery({queryKey:["pitvox","users","index"],queryFn:()=>k(s,"users/index.json"),staleTime:5*6e4,gcTime:30*6e4}),n=(r==null?void 0:r.users)||{};return(t,a)=>{const i=n[t];return{displayName:(i==null?void 0:i.displayName)||a||t||"Unknown",avatarUrl:(i==null?void 0:i.avatarUrl)||null,affiliations:(i==null?void 0:i.affiliations)||[]}}}function _e(){const{cdnUrl:s}=C(),{data:r}=y.useQuery({queryKey:["pitvox","cars","index"],queryFn:()=>k(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 qe(s,r){return ne(s,null,{carId:r})}function Ve(){const{cdnUrl:s,partnerSlug:r}=C();return y.useQuery({queryKey:["pitvox","competitions",r],queryFn:async()=>{const n=await k(s,"competitions/index.json");return n!=null&&n.competitions?n.competitions.filter(t=>t.partnerSlug===r):[]},staleTime:6e4})}function ie(s){const{cdnUrl:r,partnerSlug:n}=C();return y.useQuery({queryKey:["pitvox","competition",n,s,"config"],queryFn:()=>k(r,`competitions/${n}/${s}/config.json`),enabled:!!s,staleTime:6e4})}function oe(s){const{cdnUrl:r,partnerSlug:n}=C();return y.useQuery({queryKey:["pitvox","competition",n,s,"standings"],queryFn:()=>k(r,`competitions/${n}/${s}/standings.json`),enabled:!!s,staleTime:6e4})}function ce(s,r){const{cdnUrl:n,partnerSlug:t}=C();return y.useQuery({queryKey:["pitvox","competition",t,s,"round",r],queryFn:()=>k(n,`competitions/${t}/${s}/rounds/${r}.json`),enabled:!!s&&r!=null,staleTime:6e4})}function Ke(s,r=[]){const{cdnUrl:n,partnerSlug:t}=C();return y.useQuery({queryKey:["pitvox","competition",t,s,"allRounds",r],queryFn:async()=>(await Promise.all(r.map(i=>k(n,`competitions/${t}/${s}/rounds/${i}.json`).catch(()=>null)))).filter(Boolean),enabled:!!s&&r.length>0,staleTime:6e4})}function G(s){const{cdnUrl:r,partnerSlug:n}=C();return y.useQuery({queryKey:["pitvox","competition",n,s,"entrylist"],queryFn:()=>k(r,`competitions/${n}/${s}/entrylist.json`),enabled:!!s,staleTime:6e4})}function E(s){const{cdnUrl:r,partnerSlug:n,getSteamId:t}=C(),a=t();return y.useQuery({queryKey:["pitvox","registration",n,s,a],queryFn:async()=>{var p;const i=await fetch(`${r}/competitions/${n}/${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:r,partnerSlug:n,getSteamId:t}=C(),a=y.useQueryClient(),i=W();return y.useMutation({mutationFn:o=>{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,o)},onSuccess:()=>{const o=t();if(a.setQueriesData({queryKey:["pitvox","registration",n,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",n,s,"entrylist"]},c=>{var h;return c?((h=c.drivers)==null?void 0:h.some(m=>m.steamId===o))?c:{...c,drivers:[...c.drivers||[],p]}:{drivers:[p]}})}}})}function Y(s){const{onWithdraw:r,partnerSlug:n,getSteamId:t}=C(),a=y.useQueryClient();return y.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 o=i||t();if(!o)throw new Error("No Steam ID available");return r(s,o)},onSuccess:()=>{const i=t();a.setQueriesData({queryKey:["pitvox","registration",n,s]},o=>o?{...o,isRegistered:!1}:{isRegistered:!1,entryList:null}),i&&a.setQueriesData({queryKey:["pitvox","competition",n,s,"entrylist"]},o=>o!=null&&o.drivers?{...o,drivers:o.drivers.filter(l=>l.steamId!==i)}:o)}})}function F(){const{onRegister:s,onWithdraw:r}=C(),n=!!(s&&r);return{isPowerMode:n,isBasicMode:!n}}function _(s){const{pitvoxUrl:r,partnerSlug:n}=C();return`${r}/p/${n}/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 r of le)if(r.tags.includes(s))return r.id;return"other"}function de(s,r){if(r.size===0)return!0;const n={};for(const t of r){const a=Qe(t);n[a]||(n[a]=[]),n[a].push(t)}for(const t of Object.values(n))if(!t.some(a=>s.includes(a)))return!1;return!0}function pe(s,r){const[n,t]=b.useState(new Set),a=s!==void 0,i=a?s:n,o=b.useCallback(p=>{const c=new Set(i);c.has(p)?c.delete(p):c.add(p),a&&r?r(c):t(c)},[i,a,r]),l=b.useCallback(()=>{a&&r?r(new Set):t(new Set)},[a,r]);return{activeTags:i,toggle:o,clear:l}}function Z(s){const[r,n]=b.useState(s),t=b.useCallback(a=>{n(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,t]}function J(s,r,n){return[...s].sort((t,a)=>{const i=n(t,r.key),o=n(a,r.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 r.dir==="desc"?-l:l})}function xe(s,r=!1){const n=r?s==null?void 0:s.filter(t=>t.isValid):s;return n!=null&&n.length?{s1:Math.min(...n.map(t=>t.sector1Ms).filter(Boolean)),s2:Math.min(...n.map(t=>t.sector2Ms).filter(Boolean)),s3:Math.min(...n.map(t=>t.sector3Ms).filter(Boolean))}:null}function Oe({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:n,onSort:t,className:a=""}){return e.jsx("th",{className:`pvx-th pvx-th--sortable ${a}`,onClick:()=>t(r),children:e.jsxs("span",{className:"pvx-th-inner",children:[s,e.jsx(Oe,{active:n.key===r,dir:n.dir})]})})}function X({userId:s,getUserDisplay:r}){const{displayName:n,avatarUrl:t}=r(s);return e.jsxs("span",{className:"pvx-driver",children:[t?e.jsx("img",{src:t,alt:"",className:"pvx-driver-avatar"}):e.jsx("span",{className:"pvx-driver-avatar pvx-driver-avatar--placeholder"}),e.jsx("span",{className:"pvx-driver-name",children:n})]})}function ue({rank:s,podium:r=!1}){const n=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:n,children:s})}function me({availableTags:s,activeTags:r,onToggle:n,onClear:t}){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:t,className:`pvx-tag ${r.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:()=>n(l),className:`pvx-tag ${r.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((r,n)=>{const t=n===s.length-1;return e.jsxs("li",{className:"pvx-breadcrumb-item",children:[n>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"})}),!t&&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 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:r,carMetadata:n,getUserDisplay:t,onTrackSelect:a,tags:i,onTagChange:o}){const[l,p]=Z({key:"record.timestamp",dir:"desc"}),{activeTags:c,toggle:x,clear:h}=pe(i,o),m=b.useMemo(()=>{var f;if(!((f=n==null?void 0:n.tags)!=null&&f.length))return[];const d=new Set;for(const u of s||[])u.recordByTag&&Object.keys(u.recordByTag).forEach(v=>d.add(v));return n.tags.filter(u=>d.has(u))},[s,n]),g=b.useMemo(()=>s?c.size===0?s:s.map(d=>{var v,N;if(!d.recordByTag)return null;let f=null;const u=new Set;for(const w of Object.values(d.recordByTag)){if(u.has(w.carId))continue;u.add(w.carId);const L=((N=(v=n==null?void 0:n.cars)==null?void 0:v[w.carId])==null?void 0:N.tags)||["sports_car"];de(L,c)&&(!f||w.lapTimeMs<f.lapTimeMs)&&(f=w)}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,n]),j=b.useMemo(()=>J(g,l,(d,f)=>{var u,v;switch(f){case"displayName":return d.displayName;case"record.lapTimeMs":return(u=d.record)==null?void 0:u.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 r?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:m,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,u,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:t}):"-"}),e.jsx("td",{className:"pvx-td pvx-hidden-below-lg",children:((u=d.record)==null?void 0:u.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 Ye({entries:s,isLoading:r,track:n,carMetadata:t,getUserDisplay:a,onCarSelect:i,onNavigate:o,tags:l,onTagChange:p}){const[c,x]=Z({key:"lapTimeMs",dir:"asc"}),{activeTags:h,toggle:m,clear:g}=pe(l,p),j=b.useMemo(()=>{var N,w,L;if(!s||!((N=t==null?void 0:t.tags)!=null&&N.length))return[];const v=new Set;for(const P of s)(((L=(w=t.cars)==null?void 0:w[P.carId])==null?void 0:L.tags)||["sports_car"]).forEach(Pe=>v.add(Pe));return t.tags.filter(P=>v.has(P))},[s,t]),d=b.useMemo(()=>s?h.size===0?s:s.filter(v=>{var w,L;const N=((L=(w=t==null?void 0:t.cars)==null?void 0:w[v.carId])==null?void 0:L.tags)||["sports_car"];return de(N,h)}):[],[s,h,t]),f=b.useMemo(()=>J(d,c,(v,N)=>{switch(N){case"carId":return T(v.carId);case"driverCount":return v.driverCount||0;case"lapTimeMs":default:return v.lapTimeMs}}),[d,c]),u=[{key:"tracks",label:"Tracks",onClick:()=>o("tracks")},{key:"track",label:n.displayName}];return r?e.jsx(V,{}):e.jsxs("div",{className:"pvx-card",children:[e.jsx("div",{className:"pvx-card-header",children:e.jsx(ee,{segments:u})}),e.jsx(me,{availableTags:j,activeTags:h,onToggle:m,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,N)=>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:N+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 Ze({entries:s,isLoading:r,track:n,carId:t,getUserDisplay:a,onDriverSelect:i,onNavigate:o}){const[l,p]=Z({key:"lapTimeMs",dir:"asc"}),c=b.useMemo(()=>xe(s),[s]),x=b.useMemo(()=>J(s||[],l,(m,g)=>{switch(g){case"userId":return a(m.steamId||m.userId).displayName;case"lapCount":return m.lapCount||0;case"lapTimeMs":default:return m.lapTimeMs}}),[s,l,a]),h=[{key:"tracks",label:"Tracks",onClick:()=>o("tracks")},{key:"track",label:n.displayName,onClick:()=>o("track")},{key:"car",label:T(t)}];return r?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((m,g)=>{const j=g+1,d=m.steamId||m.userId,f=c&&m.sector1Ms===c.s1,u=c&&m.sector2Ms===c.s2,v=c&&m.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:$(m.lapTimeMs)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${f?"pvx-td--best-sector":""}`,children:S(m.sector1Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${u?"pvx-td--best-sector":""}`,children:S(m.sector2Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${v?"pvx-td--best-sector":""}`,children:S(m.sector3Ms)}),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-xl",children:m.startingFuelL?`${m.startingFuelL}L`:"-"}),e.jsx("td",{className:"pvx-td pvx-td--center pvx-hidden-below-lg",children:m.lapCount||"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:m.recordedAt?D(m.recordedAt):"-"})]},d)})})]})}):e.jsx(q,{message:"No lap times for this car yet."})]})}function Je({userId:s,track:r,carId:n,game:t,gameVersion:a,showInvalid:i,getUserDisplay:o,onToggleInvalid:l,onNavigate:p}){const{data:c,driverName:x,isLoading:h}=ae(s,r.id,r.layout,n,{showInvalid:i,game:t,gameVersion:a}),{displayName:m,avatarUrl:g}=o(s,x),j=b.useMemo(()=>xe(c,!0),[c]),d=b.useMemo(()=>{const u=(c==null?void 0:c.filter(v=>v.isValid))||[];return u.length?Math.min(...u.map(v=>v.lapTimeMs)):null},[c]),f=[{key:"tracks",label:"Tracks",onClick:()=>p("tracks")},{key:"track",label:r.displayName,onClick:()=>p("track")},{key:"car",label:T(n),onClick:()=>p("car")},{key:"driver",label:m}];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((u,v)=>{const N=u.isValid&&u.lapTimeMs===d,w=j&&u.isValid&&u.sector1Ms===j.s1,L=j&&u.isValid&&u.sector2Ms===j.s2,P=j&&u.isValid&&u.sector3Ms===j.s3;let U="pvx-row";return u.isValid||(U+=" pvx-row--invalid"),N&&(U+=" pvx-row--personal-best"),e.jsxs("tr",{className:U,children:[e.jsx("td",{className:"pvx-td",children:e.jsx("span",{className:`pvx-rank ${N?"pvx-rank--gold":""}`,children:v+1})}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-md",children:u.lapNumber||"-"}),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 ${w?"pvx-td--best-sector":""}`,children:S(u.sector1Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${L?"pvx-td--best-sector":""}`,children:S(u.sector2Ms)}),e.jsx("td",{className:`pvx-td pvx-td--mono pvx-td--sector pvx-hidden-below-sm ${P?"pvx-td--best-sector":""}`,children:S(u.sector3Ms)}),e.jsx("td",{className:"pvx-td",title:u.isValid?void 0:u.invalidReason||"Invalid",children:u.isValid?e.jsx(We,{}):e.jsx(Ge,{})}),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-lg",children:u.startingFuelL?`${u.startingFuelL}L`:"-"}),e.jsx("td",{className:"pvx-td pvx-td--muted pvx-hidden-below-xl",children:D(u.timestamp)})]},u.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 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 ge({nation:s}){const r=s&&Xe[s];return r?e.jsx("span",{className:"pvx-nation-flag",title:s,children:r}):null}function ss({sessions:s,activeSession:r,onSelect:n}){if(!s||s.length<=1)return null;const t=[...s].sort((a,i)=>se.indexOf(a.type)-se.indexOf(i.type));return e.jsx("div",{className:"pvx-session-tabs",children:t.map(a=>e.jsx("button",{onClick:()=>n(a.type),className:`pvx-session-tab ${r===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:r="default"}){return e.jsx("span",{className:`pvx-info-pill ${r!=="default"?`pvx-info-pill--${r}`:""}`,children:s})}function ts(s){if(!s)return"TBD";const r=new Date(s);if(isNaN(r))return"TBD";const n=r.toLocaleDateString("en-GB",{weekday:"short",day:"numeric",month:"short"}),t=r.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit"});return`${n} • ${t}`}function rs(s){return s.reduce((r,n)=>{var t;return(t=n.splits)!=null&&t.length?r?r.map((a,i)=>{const o=n.splits[i];return o&&o<a?o:a}):[...n.splits]:r},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:r,onSelect:n,onRegister:t,className:a}){return r?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:n,onRegister:t||n},i.id))}):e.jsx(M,{message:"No competitions available."})}function as({comp:s,onSelect:r,onRegister:n}){var d,f,u;const{cdnUrl:t}=C(),a=s.posterCdnPath?`${t}/${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,m=(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=((u=s.rounds)==null?void 0:u.filter(v=>v.isFinalized).length)||0;return e.jsxs("div",{className:"pvx-comp-card",onClick:()=>r(s.id),role:"button",tabIndex:0,onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),r(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,N)=>e.jsx(A,{variant:"format",children:v},N))]}),s.carsDescription&&e.jsx("div",{className:"pvx-comp-card-pills",children:s.carsDescription.split(", ").map((v,N)=>e.jsx(A,{children:v},N))}),e.jsxs("div",{className:"pvx-comp-card-schedule",children:[m?e.jsxs("span",{className:"pvx-comp-card-schedule-next",children:[e.jsx("span",{className:"pvx-comp-card-schedule-label",children:"Next:"})," ","R",m.roundNumber," ",m.track||"TBD"," — ",ts(m.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:n})]})]})}function is({competitionId:s,regOpen:r,isFull:n,deadlinePassed:t,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,m=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--${m}`,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"}):r?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:n?"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:r}){var l,p;const{data:n,isLoading:t}=oe(s),{data:a,isLoading:i}=ie(s);if(t||i)return e.jsx(I,{message:"Loading standings..."});if(!((l=n==null?void 0:n.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 ${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 ",n.roundsCompleted," round",n.roundsCompleted!==1?"s":"",n.countingRounds>0&&` (best ${n.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:n.standings.map(c=>e.jsx(ls,{driver:c,finalizedRounds:o},c.driverId||c.driverName))})]})})]})}function ls({driver:s,finalizedRounds:r}){var o,l,p;const n=s.position<=3,t=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 ${n?"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}),r.map(c=>{const x=t.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:r,className:n}){var p;const{data:t,isLoading:a}=ce(s,r);if(a)return e.jsx(I,{message:"Loading results..."});if(!t)return e.jsx(M,{message:"No results for this round."});const o=(t.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 ${n||""}`,children:[e.jsxs("div",{className:"pvx-round-results-header",children:[e.jsxs("div",{children:[e.jsxs("h4",{className:"pvx-round-results-title",children:["Round ",t.roundNumber,t.track?`: ${t.track}`:""]}),t.startTime&&e.jsx("p",{className:"pvx-round-results-date",children:new Date(t.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:t})]})}function je({round:s,className:r}){var l,p;const[n,t]=b.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=n||((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:r||"",children:[e.jsx(ss,{sessions:a,activeSession:i,onSelect:t}),e.jsx(ps,{session:o})]})}function ps({session:s}){var t;const r=s.type==="RACE";if(!((t=s.results)!=null&&t.length))return e.jsx(M,{message:`No results for ${s.type}.`});const n=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"}),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(xs,{result:a,isRace:r,fastestSplits:n,rowIndex:i},a.driverId||i))})]})})}function xs({result:s,isRace:r,fastestSplits:n,rowIndex:t}){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:n,showAbove:t<=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 us({bestLap:s,hasBestLap:r,splits:n,fastestSplits:t,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}),(n==null?void 0:n.length)>0&&e.jsx("span",{className:"pvx-splits-tooltip-anchor",children:e.jsx("span",{className:`pvx-splits-tooltip ${a?"":"pvx-splits-tooltip--above"}`,children:n.map((i,o)=>{const l=t&&i===t[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:r}){const{getSteamId:n}=C(),{data:t,isLoading:a}=G(s),i=n();if(a)return e.jsx(I,{message:"Loading drivers..."});const o=(t==null?void 0:t.drivers)||(t==null?void 0:t.entries)||[];return o.length?e.jsx("div",{className:`pvx-entry-grid ${r||""}`,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:r,className:n,children:t}){const{data:a,isLoading:i}=E(s),{isPowerMode:o}=F(),l=_(s),p=z(s),c=Y(s),x=(a==null?void 0:a.isRegistered)||!1,h=i||p.isPending||c.isPending,m=p.error||c.error||null,g=()=>{o&&p.mutate(r||{})},j=()=>{o&&c.mutate()};return typeof t=="function"?t({isRegistered:x,isLoading:h,register:g,withdraw:j,error:m,isPowerMode:o,registrationUrl:l}):o?e.jsx("button",{className:`pvx-comp-register-btn ${n||""}`,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 ${n||""}`,children:x?"View Registration":"Register on PitVox"})}function hs({competitionId:s,registration:r,onWithdrawSuccess:n,className:t}){const{getSteamId:a}=C(),{isPowerMode:i}=F(),o=_(s),{data:l,isLoading:p}=E(s),{data:c,isLoading:x}=G(s),h=z(s),m=Y(s),g=a(),j=(l==null?void 0:l.isRegistered)||!1,d=(c==null?void 0:c.drivers)||(c==null?void 0:c.entries)||[],f=r||{},u=d.length||f.currentCount||0,v=f.maxParticipants&&u>=f.maxParticipants,N=f.deadline&&new Date(f.deadline)<new Date,w=f.isOpen&&!N&&!v;return p||x?e.jsx(I,{message:"Loading registration..."}):j?e.jsx("div",{className:`pvx-reg-panel ${t||""}`,children:e.jsx(fs,{competitionId:s,drivers:d,steamId:g,isPowerMode:i,registrationUrl:o,withdrawMutation:m,onWithdrawSuccess:n,registration:f})}):w?g?i?e.jsx("div",{className:`pvx-reg-panel ${t||""}`,children:e.jsx(gs,{competitionId:s,registerMutation:h,registration:f})}):e.jsx("div",{className:`pvx-reg-panel ${t||""}`,children:e.jsx("a",{href:o,target:"_blank",rel:"noopener noreferrer",className:"pvx-comp-register-link",children:"Register on PitVox"})}):e.jsx("div",{className:`pvx-reg-panel ${t||""}`,children:i?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:o,target:"_blank",rel:"noopener noreferrer",className:"pvx-comp-register-link",children:"Register on PitVox"})})}):e.jsxs("div",{className:`pvx-reg-panel ${t||""}`,children:[e.jsx("div",{className:"pvx-reg-status-msg",children:v?"Registration is full.":N?"Registration deadline has passed.":"Registration is closed."}),d.length>0&&e.jsx(Ne,{drivers:d,steamId:g})]})}function gs({competitionId:s,registerMutation:r,registration:n}){const[t,a]=b.useState(""),[i,o]=b.useState("intermediate"),[l,p]=b.useState(""),c=g=>{g.preventDefault(),r.mutate({discordUsername:t||void 0,experience:i,comments:l||void 0})},x=n||{},h=x.currentCount||0,m=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"}),m&&e.jsx(be,{count:h,max:m})]}),r.error&&e.jsx("div",{className:"pvx-reg-error",children:r.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:t,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:r.isPending,children:r.isPending?"Registering...":"Register"})})]})}function fs({competitionId:s,drivers:r,steamId:n,isPowerMode:t,registrationUrl:a,withdrawMutation:i,onWithdrawSuccess:o,registration:l}){const[p,c]=b.useState(!1),x=()=>{i.mutate(void 0,{onSuccess:()=>{c(!1),o&&o()}})},h=l||{},m=r.length||h.currentCount||0,g=h.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"}),g&&e.jsx(be,{count:m,max:g})]}),e.jsx(Ne,{drivers:r,steamId:n}),i.error&&e.jsx("div",{className:"pvx-reg-error",children:i.error.message||"Withdrawal failed"}),t?e.jsx("div",{className:"pvx-reg-actions",children:p?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:()=>c(!1),children:"Cancel"}),e.jsx("button",{type:"button",className:"pvx-reg-danger-btn",onClick:x,disabled:i.isPending,children:i.isPending?"Unregistering...":"Yes, Unregister"})]})]}):e.jsx("button",{type:"button",className:"pvx-reg-unregister-btn",onClick:()=>c(!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:r}){if(!s.length)return e.jsx("div",{className:"pvx-reg-no-drivers",children:"No drivers registered yet."});const n=[...s].sort((t,a)=>{const i=r&&t.steamId===r?-1:0,o=r&&a.steamId===r?-1:0;return i-o});return e.jsx("div",{className:"pvx-reg-driver-list",children:n.map(t=>{var i,o;const a=r&&t.steamId===r;return e.jsxs("div",{className:`pvx-reg-driver-row ${a?"pvx-reg-driver-row--you":""}`,children:[t.avatarUrl?e.jsx("img",{src:t.avatarUrl,alt:"",className:"pvx-reg-driver-avatar"}):e.jsx("div",{className:"pvx-reg-driver-avatar pvx-reg-driver-avatar--placeholder",children:((o=(i=t.displayName)==null?void 0:i.charAt(0))==null?void 0:o.toUpperCase())||"?"}),e.jsxs("span",{className:"pvx-reg-driver-name",children:[t.displayName,a&&e.jsx("span",{className:"pvx-entry-you",children:" (you)"})]})]},t.steamId||t.driverId)})})}function be({count:s,max:r}){const n=r?s/r*100:0,t=n>=100?"full":n>=75?"warning":"ok";return e.jsxs("span",{className:`pvx-reg-capacity pvx-reg-capacity--${t}`,children:[s,"/",r," drivers"]})}function ye(s){const{cdnUrl:r}=C(),n=y.useQuery({queryKey:["pitvox","laps","global",s],queryFn:()=>k(r,`laps/${s}.json`),enabled:!!s,staleTime:3e4,refetchInterval:3e4}),t=n.data;return{isLoading:n.isLoading,error:n.error,data:t?{driverName:t.driverName||"Driver",lapCount:t.lapCount||0,trackBreakdown:t.trackBreakdown||[],carBreakdown:t.carBreakdown||[],recordsHeld:t.recordsHeld||0,currentRecords:t.currentRecords||[],bestRanking:t.bestRanking??null,bestRankingTrackId:t.bestRankingTrackId??null,bestRankingLayout:t.bestRankingLayout??null,bestRankingCarId:t.bestRankingCarId??null,generatedAt:t.generatedAt}:null}}function Ce(s){var i;const{cdnUrl:r,partnerSlug:n}=C(),t=y.useQuery({queryKey:["pitvox","ratings",n],queryFn:()=>k(r,`leaderboards/partners/${n}/ratings.json`),staleTime:6e4,refetchInterval:6e4}),a=b.useMemo(()=>{var o;return!((o=t.data)!=null&&o.drivers)||!s?null:t.data.drivers.find(l=>l.identifier===s)||null},[(i=t.data)==null?void 0:i.drivers,s]);return{isLoading:t.isLoading,error:t.error,data:a?{rating:a.rating,rank:a.rank,totalDrivers:t.data.driverCount||t.data.drivers.length,comboCount:a.comboCount||0,distinctCars:a.distinctCars||0,combos:a.combos||[]}:null}}function we(){const{cdnUrl:s,partnerSlug:r,getSteamId:n}=C(),t=n(),{data:a,isLoading:i}=y.useQuery({queryKey:["pitvox","competitions",r],queryFn:async()=>{const x=await k(s,"competitions/index.json");return x!=null&&x.competitions?x.competitions.filter(h=>h.partnerSlug===r):[]},staleTime:6e4}),o=(a==null?void 0:a.map(x=>x.id))||[],l=y.useQueries({queries:o.map(x=>({queryKey:["pitvox","competition",r,x,"entrylist"],queryFn:()=>k(s,`competitions/${r}/${x}/entrylist.json`),enabled:!!t&&o.length>0,staleTime:6e4}))}),p=l.some(x=>x.isLoading);return{data:b.useMemo(()=>{var m,g;if(!a||!t||p)return[];const x=new Date,h=[];for(let j=0;j<a.length;j++){const d=a[j],f=(m=l[j])==null?void 0:m.data;if(!((g=f==null?void 0:f.drivers)==null?void 0:g.some(N=>N.steamId===t)))continue;const v=d.rounds||[];for(const N of v)N.isFinalized||!N.startTime||new Date(N.startTime)<=x||h.push({competitionId:d.id,competitionName:d.name,roundNumber:N.roundNumber,track:N.track||"TBD",startTime:N.startTime})}return h.sort((j,d)=>new Date(j.startTime)-new Date(d.startTime)),h.length>0&&(h[0].isNext=!0),h},[a,t,p,l]),isLoading:i||!!t&&p}}function ke(){const{onFetchNotifications:s}=C();return!!s}function Re(s={}){const{onFetchNotifications:r,partnerSlug:n}=C(),{limit:t=20,unreadOnly:a=!1}=s;return y.useQuery({queryKey:["pitvox","notifications",n,{limit:t,unreadOnly:a}],queryFn:()=>r({limit:t,unreadOnly:a}),enabled:!!r,staleTime:3e4,refetchInterval:3e4})}function js(){const{onFetchNotifications:s,partnerSlug:r}=C(),{data:n,isLoading:t}=y.useQuery({queryKey:["pitvox","notifications",r,{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:n??0,isLoading:t}}function Te(){const{onMarkNotificationRead:s,partnerSlug:r}=C(),n=y.useQueryClient();return y.useMutation({mutationFn:t=>{if(!s)throw new Error("No onMarkNotificationRead callback provided to PitVoxPartnerProvider.");return s(t)},onSuccess:(t,a)=>{n.setQueriesData({queryKey:["pitvox","notifications",r]},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:r}=C(),n=y.useQueryClient();return y.useMutation({mutationFn:()=>{if(!s)throw new Error("No onMarkAllNotificationsRead callback provided to PitVoxPartnerProvider.");return s()},onSuccess:()=>{n.setQueriesData({queryKey:["pitvox","notifications",r]},t=>t!=null&&t.notifications?{...t,unreadCount:0,notifications:t.notifications.map(a=>({...a,isRead:!0,readAt:a.readAt||new Date().toISOString()}))}:t)}})}function Se({driverName:s,avatarUrl:r,memberSince:n,className:t=""}){const a=n?new Date(n).toLocaleDateString("en-GB",{day:"2-digit",month:"2-digit",year:"numeric"}):null;return e.jsxs("div",{className:`pvx-card pvx-dash-profile ${t}`,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 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:r,countKey:n}){if(!(s!=null&&s.length))return null;const t=s.slice().sort((a,i)=>i[n]-a[n]).slice(0,10);return e.jsxs("div",{className:"pvx-dash-tooltip",children:[t.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[n]})]},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:r,className:n=""}){if(!s)return null;const t=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 ${n}`,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:t,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"})]}),r&&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: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]})]})]})]})}function $e({records:s,className:r=""}){const n=b.useMemo(()=>s!=null&&s.length?s.slice().sort((t,a)=>{const i=t.recordedAt?new Date(t.recordedAt).getTime():0;return(a.recordedAt?new Date(a.recordedAt).getTime():0)-i}):[],[s]);return n.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("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:["(",n.length,")"]})]})}),e.jsx("div",{className:"pvx-dash-records-list",children:n.map((t,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(t.trackId,t.layout,t.game)}),e.jsx("span",{className:"pvx-dash-record-car",children:T(t.carId)})]}),e.jsxs("div",{className:"pvx-dash-record-time",children:[e.jsx("span",{className:"pvx-dash-record-lap",children:$(t.lapTimeMs)}),e.jsxs("span",{className:`pvx-dash-game-badge pvx-dash-game-badge--${t.game||"evo"}`,children:[(t.game||"evo").toUpperCase(),t.gameVersion?` ${t.gameVersion}`:""]})]})]},a))})]}):null}function De({events:s,isLoading:r,className:n}){return r?e.jsx("div",{className:"pvx-loading",children:"Loading upcoming events..."}):s!=null&&s.length?e.jsxs("div",{className:`pvx-card ${n||""}`,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(t=>e.jsxs("div",{className:`pvx-upcoming-item ${t.isNext?"pvx-upcoming-item--next":""}`,children:[e.jsxs("div",{className:"pvx-upcoming-info",children:[e.jsx("span",{className:"pvx-upcoming-comp",children:t.competitionName}),e.jsxs("span",{className:"pvx-upcoming-round",children:["Round ",t.roundNumber,": ",t.track]})]}),e.jsxs("div",{className:"pvx-upcoming-time",children:[e.jsx("span",{className:"pvx-upcoming-date",children:new Date(t.startTime).toLocaleDateString("en-GB",{day:"numeric",month:"short",year:"numeric"})}),e.jsx("span",{className:"pvx-upcoming-relative",children:Cs(t.startTime)}),t.isNext&&e.jsx("span",{className:"pvx-upcoming-badge",children:"Next"})]})]},`${t.competitionId}-${t.roundNumber}`))})]}):null}function Cs(s){const r=new Date(s).getTime()-Date.now();if(r<=0)return"Now";const n=Math.floor(r/(1e3*60*60));if(n<1)return"Less than 1 hour";if(n<24)return`in ${n}h`;const t=Math.floor(n/24);if(t===1)return"Tomorrow";if(t<7)return`in ${t} days`;if(t<30){const a=Math.floor(t/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:r=0,onMarkRead:n,onMarkAllRead:t,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",r>0&&e.jsx("span",{className:"pvx-notif-badge",children:r>99?"99+":r})]}),r>0&&t&&e.jsx("button",{className:"pvx-notif-mark-all",onClick:t,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:n},l.id))}):e.jsx("div",{className:"pvx-notif-empty",children:"No notifications"})]})}function ks({notification:s,getUserDisplay:r,onMarkRead:n}){const t=()=>{!s.isRead&&n&&n(s.id)};return e.jsxs("button",{className:`pvx-notif-item ${s.isRead?"":"pvx-notif-item--unread"}`,onClick:t,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,r)}),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:r,memberSince:n,className:t=""}){const{data:a,isLoading:i,error:o}=ye(s),{data:l,isLoading:p}=Ce(s),{data:c,isLoading:x}=we(),h=ke(),{data:m,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 ${t}`,children:[e.jsx(Se,{driverName:a.driverName,avatarUrl:r,memberSince:n}),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:m==null?void 0:m.notifications,unreadCount:(m==null?void 0:m.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=Ye;exports.CompEmptyState=M;exports.CompLoadingState=I;exports.CompetitionCards=ns;exports.DriverDashboard=Ls;exports.DriverProfile=Se;exports.DriversTable=Ze;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=C;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=Y;