From 49caad8252fb65426b2ae9f713c34d22d41a1e10 Mon Sep 17 00:00:00 2001 From: Jeff Chen Date: Wed, 12 Aug 2026 11:32:12 -0600 Subject: [PATCH 1/3] Points calculator: box the mark/points results, add equivalent-marks table Wrap the mark and points fields in a tinted, bordered box so they read as calculator output rather than more form inputs. Below them, add a collapsed-by-default table listing the mark worth the same points in every other event for the selected category and gender. Co-Authored-By: Claude Fable 5 --- pages/projects/track/points-calculator.tsx | 118 ++++++++++++++++----- styles/pages/track-calculators.module.scss | 48 +++++++++ 2 files changed, 141 insertions(+), 25 deletions(-) diff --git a/pages/projects/track/points-calculator.tsx b/pages/projects/track/points-calculator.tsx index e862d99..56fb51c 100644 --- a/pages/projects/track/points-calculator.tsx +++ b/pages/projects/track/points-calculator.tsx @@ -110,6 +110,24 @@ function markToUserMark(mark: number, markType: MarkType) { } } +function equivalentMark(eventType: string, points: number, gender: string) { + const eventCoefficients = coefficients[gender][eventType]; + if (!eventCoefficients) { + return null; + } + + const markType = markTypes[eventType]; + const mark = getMarkFromScore(eventCoefficients, points); + if (!Number.isFinite(mark) || mark <= 0) { + return null; + } + + return markToUserMark( + markType === "points" ? Math.round(mark) : mark, + markType, + ); +} + export const metas: Metas = { title: "World Athletics Points Calculator", description: @@ -296,6 +314,23 @@ export default function PointsCalculator({ pages }: PointsCalculatorProps) { ); }, [category, gender]); + const equivalentMarks = useMemo(() => { + const pointsNum = Number(points); + if (points === "" || !Number.isFinite(pointsNum)) { + return []; + } + return events + .filter(other => other !== event) + .map(other => ({ + event: other, + mark: equivalentMark(other, pointsNum, gender), + unit: units[markTypes[other]], + })) + .filter((row): row is { event: string; mark: string; unit: string } => + Boolean(row.mark), + ); + }, [points, events, event, gender]); + return (
@@ -355,31 +390,64 @@ export default function PointsCalculator({ pages }: PointsCalculatorProps) { - - +
+ + +
+
+ Equivalent marks in other events + {equivalentMarks.length > 0 ? ( + <> +

+ Marks worth {points} points in other {category}{" "} + {gender === "men" ? "men’s" : "women’s"} events. +

+ + + + + + + + + {equivalentMarks.map(({ event, mark, unit }) => ( + + + + + ))} + +
EventMark
{eventNames[event]} + {mark} {unit} +
+ + ) : ( +

Enter a mark or points above to compare across events.

+ )} +
+ ))} + {equivalentMarks.length > 0 ? ( <>

- Marks worth {points} points in other {category}{" "} + Marks worth {points} points in {tableCategory}{" "} {gender === "men" ? "men’s" : "women’s"} events.

diff --git a/styles/pages/track-calculators.module.scss b/styles/pages/track-calculators.module.scss index a047580..58caf07 100644 --- a/styles/pages/track-calculators.module.scss +++ b/styles/pages/track-calculators.module.scss @@ -70,7 +70,6 @@ .results { margin: 1rem 0; padding: 0.25rem 1rem 0.75rem; - background-color: var(--secondary-light-gray); border: 1px solid var(--secondary); border-radius: 0.25rem; } @@ -85,6 +84,39 @@ font-size: 1.2em; } + .tabs { + display: flex; + gap: 0.5rem; + margin: 0.75rem 0 0; + + button { + padding: 0.25rem 1rem; + border: 1px solid var(--dark-gray); + border-radius: 0.25rem; + background: var(--white); + color: var(--dark-gray); + font-size: 1em; + cursor: pointer; + transition: background-color 0.2s; + + &:hover { + background-color: var(--light-gray); + } + } + + .activeTab { + background: var(--primary); + border-color: var(--primary); + color: var(--primary-gray); + font-weight: bold; + cursor: default; + + &:hover { + background-color: var(--primary); + } + } + } + p { margin: 0.5rem 0; color: var(--gray); From ffe57dd2f9b95e96465ef199b86cb0850366c15b Mon Sep 17 00:00:00 2001 From: Jeff Chen Date: Wed, 12 Aug 2026 12:21:50 -0600 Subject: [PATCH 3/3] Drop the results box around mark/points Co-Authored-By: Claude Fable 5 --- pages/projects/track/points-calculator.tsx | 52 +++++++++++----------- styles/pages/track-calculators.module.scss | 7 --- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/pages/projects/track/points-calculator.tsx b/pages/projects/track/points-calculator.tsx index d259400..7a3600a 100644 --- a/pages/projects/track/points-calculator.tsx +++ b/pages/projects/track/points-calculator.tsx @@ -397,33 +397,31 @@ export default function PointsCalculator({ pages }: PointsCalculatorProps) { -
- - -
+ +
Equivalent marks in other events
diff --git a/styles/pages/track-calculators.module.scss b/styles/pages/track-calculators.module.scss index 58caf07..9f2004f 100644 --- a/styles/pages/track-calculators.module.scss +++ b/styles/pages/track-calculators.module.scss @@ -67,13 +67,6 @@ } } -.results { - margin: 1rem 0; - padding: 0.25rem 1rem 0.75rem; - border: 1px solid var(--secondary); - border-radius: 0.25rem; -} - .equivalents { margin: 1rem 0; font-size: 16px;