From aecc2adb07e5bdb99f6203337a536affedf0f59f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 26 Oct 2025 22:01:42 -0500 Subject: [PATCH] feat: generalize colored delta cells --- .../website/src/components/Compare/Body.tsx | 37 +++++++++-------- .../src/components/Compare/CompareRow.tsx | 39 ++++++------------ .../src/components/Compare/CompareTable.tsx | 4 +- .../website/src/components/CompareCell.tsx | 41 +++++++++++++++++++ 4 files changed, 74 insertions(+), 47 deletions(-) create mode 100644 packages/website/src/components/CompareCell.tsx diff --git a/packages/website/src/components/Compare/Body.tsx b/packages/website/src/components/Compare/Body.tsx index 814d5f798..47d8ca7f1 100644 --- a/packages/website/src/components/Compare/Body.tsx +++ b/packages/website/src/components/Compare/Body.tsx @@ -3,6 +3,7 @@ import { Flex, Heading, IconButton, Table } from "@radix-ui/themes"; import type { TankCharacteristics } from "../../core/blitzkit/tankCharacteristics"; import { useLocale } from "../../hooks/useLocale"; import { CompareEphemeral } from "../../stores/compareEphemeral"; +import { CompareCellDirection } from "../CompareCell"; import { StickyColumnHeaderCell } from "../StickyColumnHeaderCell"; import { CompareRow } from "./CompareRow"; import { CompareSectionTitle } from "./CompareSectionTitle"; @@ -79,7 +80,7 @@ export function Body({ stats }: BodyProps) { stats.shellReload ?? stats.shellReloads!.reduce((a, b) => a + b, 0) / @@ -95,7 +96,7 @@ export function Body({ stats }: BodyProps) { <> @@ -107,7 +108,7 @@ export function Body({ stats }: BodyProps) { @@ -116,48 +117,48 @@ export function Body({ stats }: BodyProps) { @@ -186,21 +187,21 @@ export function Body({ stats }: BodyProps) { (stats.fireChance * 100).toFixed(0)} deltaNominalDisplay={(delta) => (delta * 100).toFixed(0)} /> @@ -288,28 +289,28 @@ export function Body({ stats }: BodyProps) { diff --git a/packages/website/src/components/Compare/CompareRow.tsx b/packages/website/src/components/Compare/CompareRow.tsx index 37509ff6e..566a3741a 100644 --- a/packages/website/src/components/Compare/CompareRow.tsx +++ b/packages/website/src/components/Compare/CompareRow.tsx @@ -6,17 +6,17 @@ import { import { Flex, IconButton, Table, Text } from "@radix-ui/themes"; import { useRef } from "react"; import type { TankCharacteristics } from "../../core/blitzkit/tankCharacteristics"; -import { Var } from "../../core/radix/var"; import { useLocale } from "../../hooks/useLocale"; import { CompareEphemeral } from "../../stores/compareEphemeral"; import { ComparePersistent } from "../../stores/comparePersistent"; +import { CompareCell, CompareCellDirection } from "../CompareCell"; import { StickyRowHeaderCell } from "../StickyRowHeaderCell"; type CompareRowProps = { display?: ( member: Awaited ) => number | string | undefined; - deltaType?: "higherIsBetter" | "lowerIsBetter"; + deltaType?: CompareCellDirection; decimals?: number; deltaNominalDisplay?: (delta: number) => string | number; indent?: boolean; @@ -33,7 +33,7 @@ type CompareRowProps = { export function CompareRow({ display, - deltaType = "higherIsBetter", + deltaType = CompareCellDirection.HIGHER_IS_BETTER, decimals, deltaNominalDisplay, indent, @@ -108,33 +108,18 @@ export function CompareRow({ {values.map((value, index) => { const delta = value - values[0]; const deltaPercentage = value / values[0] - 1; - const normalizedDeltaPercentage = Math.round( - Math.min(100, Math.abs(deltaPercentage) * 2 * 100 + 25) - ); const resolvedDisplayValue = display ? display(stats[index]) : decimals === undefined - ? value - : value?.toFixed(decimals); + ? value + : value?.toFixed(decimals); return ( - values[0] - : value < values[0] - ) - ? `color-mix(in srgb, ${Var("green-7")} ${normalizedDeltaPercentage}%, ${Var("green-3")})` - : `color-mix(in srgb, ${Var("red-7")} ${normalizedDeltaPercentage}%, ${Var("red-3")})`, - }} + truth={values[0]} + value={value} + direction={deltaType} > @@ -179,7 +164,7 @@ export function CompareRow({ )} - + ); })} diff --git a/packages/website/src/components/Compare/CompareTable.tsx b/packages/website/src/components/Compare/CompareTable.tsx index 0e67d20ec..307038cbf 100644 --- a/packages/website/src/components/Compare/CompareTable.tsx +++ b/packages/website/src/components/Compare/CompareTable.tsx @@ -107,8 +107,8 @@ export function CompareTable({ stats }: CompareTableProps) { crewSkills[skill] === 0 ? Var("gray-11") : permanentSkills.includes(skill) - ? Var("crimson-11") - : Var("amber-11"), + ? Var("crimson-11") + : Var("amber-11"), }} /> ))} diff --git a/packages/website/src/components/CompareCell.tsx b/packages/website/src/components/CompareCell.tsx new file mode 100644 index 000000000..16812803d --- /dev/null +++ b/packages/website/src/components/CompareCell.tsx @@ -0,0 +1,41 @@ +import { Table } from "@radix-ui/themes"; +import type { CellProps } from "@radix-ui/themes/components/table"; + +export enum CompareCellDirection { + HIGHER_IS_BETTER, + LOWER_IS_BETTER, +} + +interface CompareCellProps extends CellProps { + value: number; + truth: number; + direction?: CompareCellDirection; +} + +export function CompareCell({ + value, + truth, + style, + direction, + ...props +}: CompareCellProps) { + const percentage = value / truth - 1; + const shiftedPercentage = Math.round( + Math.min(100, Math.abs(percentage) * 2 * 100 + 25) + ); + + return ( + truth + ? `color-mix(in srgb, var(--green-7) ${shiftedPercentage}%, var(--green-3))` + : `color-mix(in srgb, var(--red-7) ${shiftedPercentage}%, var(--red-3))`, + }} + {...props} + /> + ); +}