"use client" // MIDLERTIDIG hånd-kodet hull-diagram (ADR-083, 2026-08-17) -- bygget for // å bevise geometrikjeden (frontend/lib/hole-geometry.ts) fungerer riktig // ende-til-ende FØR en V0-prompt skrives, samme rekkefølge som // FlagPlantSheet/PlayerImportPanel tidligere denne økten. Erstattes med en // V0-eksportert visning senere -- selve geometri-utregningen (i // hole-target-distance.tsx) endres ikke ved bytte, kun denne rene // visningen. // // Tee vises alltid nederst, green (senter) alltid øverst -- fast akse // (IKKE spillerens gangretning), se hole-target-distance.tsx sin // teeRef-uthenting. alongPercent/crossMeters kommer ferdigregnet inn, // klippes KUN her (ved selve tegningen), ikke i dataen. import { Flag, MapPin } from "lucide-react" import { cn } from "@/lib/utils" type DiagramHazard = { label: string distanceMeters: number alongPercent: number crossMeters: number } export function HoleDiagram({ distances, playerPosition, hazards, size = "full", className, }: { distances: { front: number; middle: number; back: number } playerPosition: { alongPercent: number; crossMeters: number } hazards: DiagramHazard[] size?: "compact" | "full" className?: string }) { // Diagrammet trenger plass -- kompakt-visningen (badge ved GIR-merket) // viser fortsatt kun tallene + full hindringsliste, ikke selve tegningen. if (size === "compact") { return (
) } return (
{hazards.length > 0 && (
)}
) } const LANE_HEIGHT_PX = 260 // Faktisk fairway-bredde er ikke kjent fra dataen -- klipper visuelt til // ±30 m fra midtlinjen, en fornuftig typisk verdi (se ADR-083). Selve // TALLENE (distanceMeters) er alltid nøyaktige uansett -- kun selve // PLASSERINGEN i tegningen klippes. const MAX_CROSS_METERS = 30 function clampAlong(percent: number): number { return Math.min(100, Math.max(0, percent)) } function crossToOffsetPercent(crossMeters: number): number { const clamped = Math.min(MAX_CROSS_METERS, Math.max(-MAX_CROSS_METERS, crossMeters)) return (clamped / MAX_CROSS_METERS) * 42 // maks ±42% fra senter, litt luft i kantene } function Lane({ playerPosition, hazards, }: { playerPosition: { alongPercent: number; crossMeters: number } hazards: DiagramHazard[] }) { return (
{/* Midtlinje -- ren visuell referanse, ikke en ekte fairway-kant. */} ) } function NumberColumn({ label, value, emphasized, }: { label: string value: number emphasized?: boolean }) { return (
{label} {value} m
) } function HazardTextList({ hazards, compact }: { hazards: DiagramHazard[]; compact?: boolean }) { if (hazards.length === 0) return null return ( ) }