Initial commit v1

This commit is contained in:
Rolf
2026-03-18 12:37:17 +01:00
commit 4897d3003f
55 changed files with 14241 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
/**
* Returns the number of handicap strokes a player receives on a given hole.
* WHS allocation: distribute course_handicap strokes across holes by stroke index.
*/
export function strokesReceived(
courseHandicap: number,
strokeIndex: number,
holesCount: number,
): number {
if (courseHandicap <= 0) return 0
const fullStrokes = Math.floor(courseHandicap / holesCount)
const extraStrokes = courseHandicap % holesCount
return fullStrokes + (strokeIndex <= extraStrokes ? 1 : 0)
}
/**
* Net score on a hole (gross strokes minus strokes received).
*/
export function netStrokes(
gross: number,
courseHandicap: number,
strokeIndex: number,
holesCount: number,
): number {
return gross - strokesReceived(courseHandicap, strokeIndex, holesCount)
}
/**
* Score vs par as a display string: "2", "E", "+1", "+3"
*/
export function formatVsPar(diff: number): string {
if (diff === 0) return 'E'
return diff > 0 ? `+${diff}` : `${diff}`
}
/**
* CSS class for a gross score vs par (standard golf scorecard conventions).
*/
export function scoreColorClass(vsPar: number | null): string {
if (vsPar === null) return ''
if (vsPar <= -2) return 'bg-yellow-300 text-yellow-900 rounded-full' // Eagle or better
if (vsPar === -1) return 'bg-red-500 text-white rounded-full' // Birdie
if (vsPar === 0) return '' // Par
if (vsPar === 1) return 'border border-border rounded-sm' // Bogey
if (vsPar === 2) return 'border-2 border-border rounded-sm' // Double
return 'border-2 border-destructive rounded-sm text-destructive' // Triple+
}