"use client" // Resultatvisning for "Scramble mot enkeltspiller" (migrasjon 056, // 2026-08-05) -- ren V0-eksport (zip 31), uendret fra levert komponent. // Adapter fra det generiske API-svaret (ApiFormatResult) til denne // komponentens ScrambleSoloResult-props ligger i round-leaderboard.tsx // (buildScrambleSoloResult) og round-detail.tsx (lokal kopi, samme navn). import { Check, Flag, Minus } from "lucide-react" import { cn } from "@/lib/utils" // --------------------------------------------------------------------------- // Data shape (matches the API response this component is built around) // --------------------------------------------------------------------------- export interface ScrambleSoloHole { holeNumber: number par: number strokeIndex: number result: "a" | "b" | "halved" // "a" = team won hole, "b" = individual won, "halved" = tied team: { gross: number; net: number; strokesReceived: number } individual: { gross: number; net: number; strokesReceived: number } } export interface ScrambleSoloResult { ready: boolean teamLabel: string individualLabel: string teamNet: number | null individualNet: number | null margin: number | null // individualNet - teamNet; positive = team leads, negative = individual leads, 0 = tied holes: ScrambleSoloHole[] } type Leader = "team" | "individual" | "tie" function leaderFromMargin(margin: number | null): Leader { if (margin === null) return "tie" if (margin > 0) return "team" if (margin < 0) return "individual" return "tie" } // --------------------------------------------------------------------------- // Component // --------------------------------------------------------------------------- export function ScrambleSoloResultView({ result }: { result: ScrambleSoloResult }) { return (
{result.ready ? ( <> ) : ( )}
) } // --- Waiting state --------------------------------------------------------- function WaitingState() { return (

Venter på at oppsettet blir fullført

Resultatet vises så snart handicap og lag er ferdig satt opp for denne runden.

) } // --- Headline card --------------------------------------------------------- function HeadlineCard({ result }: { result: ScrambleSoloResult }) { const leader = leaderFromMargin(result.margin) const strokes = result.margin === null ? 0 : Math.abs(result.margin) return (
mot
) } function MarginBanner({ leader, strokes, result, }: { leader: Leader strokes: number result: ScrambleSoloResult }) { let text: string let tone: "team" | "individual" | "tie" if (leader === "tie") { text = "Uavgjort" tone = "tie" } else if (leader === "team") { text = `${result.teamLabel} leder med ${strokes} ${strokes === 1 ? "slag" : "slag"}` tone = "team" } else { text = `${result.individualLabel} leder med ${strokes} slag` tone = "individual" } return (
{tone === "tie" ? (
) } function SideTotal({ label, kind, net, leading, }: { label: string kind: "team" | "individual" net: number | null leading: boolean }) { return (
{label} {net ?? "–"} netto {leading && ( Leder )}
) } // --- Hole-by-hole ledger --------------------------------------------------- function HoleLedger({ result }: { result: ScrambleSoloResult }) { return (

Hull for hull

{result.holes.length} {result.holes.length === 1 ? "hull spilt" : "hull spilt"}
{/* Column legend so the two net columns are unambiguous */}
Hull {result.teamLabel} {result.individualLabel}
    {result.holes.map((hole) => ( ))}
) } function HoleRow({ hole }: { hole: ScrambleSoloHole }) { return (
  • {/* Hole meta */}
    {hole.holeNumber} Par {hole.par} , · idx {hole.strokeIndex}
  • ) } function SideCell({ gross, net, received, won, halved, kind, }: { gross: number net: number received: number won: boolean halved: boolean kind: "team" | "individual" }) { const wonLabel = won ? kind === "team" ? "Laget vant hullet" : "Utfordreren vant hullet" : halved ? "Delt hull" : undefined return (
    {/* Net (the number that decides the hole) — largest, bold */}
    {won && (
    {/* Gross + strokes received context */} Brutto {gross} {received > 0 && <> · {received} slag} {wonLabel && {wonLabel}}
    ) }