"use client" // Delte, utelukkende trykkbaserte input-primitiver for hull-for-hull- // statistikkregistrering (ALDRI dropdowns) -- trukket ut av round-detail.tsx // sin ScoringWizard (frittstående runder) 2026-08-15 (ADR-071) for gjenbruk // i org-turneringers nye HoleStatsSheet, som nå har samme statistikkdybde // (migrasjon 075). Ren UI, ingen datahenting/state utover det som sendes inn. import { useState, type ReactNode } from "react" import { ArrowDown, ArrowLeft, ArrowRight, ArrowUp, Flag, Minus, Plus, Target } from "lucide-react" import { cn } from "@/lib/utils" export function golfTermForScore(n: number, par: number): string | null { const diff = n - par if (diff <= -3) return "Albatross" if (diff === -2) return "Eagle" if (diff === -1) return "Birdie" if (diff === 0) return "Par" if (diff === 1) return "Bogey" if (diff === 2) return "Dobbel bogey" return null } export function NumberPicker({ label, value, directValues, expandValues, expandLabel, parValue, showGolfTerms, maxValue, strokesReceived, accent, onChange, readOnly, }: { label: string value: number | null directValues: number[] expandValues: number[] expandLabel: string // Hullets par -- brukt til golf-term-bildeteksten når showGolfTerms er satt. parValue?: number // Viser Eagle/Birdie/Par/Bogey/Dobbel bogey under HVERT tall (relativt til // parValue), i stedet for kun å merke selve par-knappen -- kun meningsfullt // for Slag-velgeren, ikke Putter/Anywayslag. showGolfTerms?: boolean // Skjuler valg høyere enn dette (f.eks. Putter kan aldri overstige // antall slag registrert på hullet) -- ingen vits i å tilby et tall som // uansett ville vært selvmotsigende. maxValue?: number // Spillerens tildelte handicap-slag PÅ DETTE hullet. Når satt (og // showGolfTerms er på, dvs. Slag-velgeren), markeres knappen som // tilsvarer spillerens PERSONLIGE netto par (rå par + mottatte slag) med // en liten, diskret prikk -- tydelig forskjellig fra "valgt"-tilstanden, // og de to kan opptre samtidig på samme knapp. strokesReceived?: number | null // Valgfri egen aksent for seksjonen (brukes til å gi Putter-velgeren en // distinkt visuell identitet så den ikke forveksles med Slag-velgeren). // Rører IKKE selve tallknappene -- kun tittelrad/ikon. accent?: "primary" | "orange" onChange: (value: number) => void readOnly: boolean }) { const cap = (values: number[]) => (maxValue === undefined ? values : values.filter((n) => n <= maxValue)) const cappedDirect = cap(directValues) const cappedExpand = cap(expandValues) const valueInExpand = value !== null && cappedExpand.includes(value) const [expanded, setExpanded] = useState(false) const showExpanded = expanded || valueInExpand const visibleValues = showExpanded ? [...cappedDirect, ...cappedExpand] : cappedDirect // Spillerens netto par for hullet = rå par + tildelte slag. Kun beregnet // når vi faktisk har begge (Slag-velgeren med kjent strokesReceived). const netPar = parValue !== undefined && strokesReceived !== null && strokesReceived !== undefined ? parValue + strokesReceived : null // Putter-velgeren får en egen aksent (oransje) og et eget ikon på // tittelraden, så den ikke er til å forveksle med Slag-velgeren -- som // ellers er nøyaktig samme rutenett. Kun tittelraden/venstre aksentbånd // endres; selve tallknappene beholder den etablerte grønne "valgt"-stilen. const isOrange = accent === "orange" return (
{isOrange && ( )} {label} {/* Netto par-forklaring: gjør prikken selvforklarende uten å stole på fargesyn alene (tilgjengelighet -- sol/utendørs). Vises kun når det faktisk finnes en netto par-markør å forklare. */} {netPar !== null && ( )} {/* Numpad: tre kolonner, knappene fyller bredden -- store trykkflater for bruk utendørs, ofte med sol på skjermen. */}
{visibleValues.map((n) => { const selected = value === n const isNetPar = netPar !== null && n === netPar const term = showGolfTerms && parValue !== undefined ? golfTermForScore(n, parValue) : n === parValue ? "par" : null return ( ) })} {!showExpanded && !readOnly && cappedExpand.length > 0 && ( )}
) } // --- Retningskors (D-pad for Utslag / Innspill) ----------------------------- function DirButton({ icon: Icon, label, selected, onClick, readOnly, }: { icon: typeof ArrowUp label: string selected: boolean onClick: () => void readOnly: boolean }) { return ( ) } export function DirectionCross({ label, value, onChange, readOnly, variant, centerLabel, }: { label: string value: string | null onChange: (value: string) => void readOnly: boolean // "horizontal" = kun venstre/senter/høyre (Utslag); "full" = 5-veis (Innspill) variant: "horizontal" | "full" centerLabel: string }) { const spacer =