feat: key based tankopedia

This commit is contained in:
tresabhi committed 2024-11-12 15:40:57 -06:00
1 parent a83ce6d350
commit bc60b4b42c
3 files changed
+402 -209

No files matched your search

@@ -13,8 +13,8 @@ import { StickyRowHeaderCell } from '../StickyRowHeaderCell';
interface CompareRowProps { interface CompareRowProps {
name: string; name: string;
value: value:
| keyof Awaited<TankCharacteristics> | keyof TankCharacteristics
| ((member: Awaited<TankCharacteristics>) => number | undefined); | ((member: TankCharacteristics) => number | undefined);
display?: ( display?: (
member: Awaited<TankCharacteristics>, member: Awaited<TankCharacteristics>,
) => number | string | undefined; ) => number | string | undefined;
@@ -38,7 +38,6 @@ export function CompareRow({
const mutateCompareEphemeral = CompareEphemeral.useMutation(); const mutateCompareEphemeral = CompareEphemeral.useMutation();
const sorting = CompareEphemeral.use((state) => state.sorting); const sorting = CompareEphemeral.use((state) => state.sorting);
const deltaMode = ComparePersistent.use((state) => state.deltaMode); const deltaMode = ComparePersistent.use((state) => state.deltaMode);
const values = stats.map((stat) => const values = stats.map((stat) =>
typeof value === 'function' ? value(stat)! : (stat[value] as number), typeof value === 'function' ? value(stat)! : (stat[value] as number),
); );
@@ -1,16 +1,20 @@
import type { TankCharacteristics } from '../../../../../../core/blitzkit/tankCharacteristics';
import { useDelta } from '../../../../../../hooks/useDelta'; import { useDelta } from '../../../../../../hooks/useDelta';
import { type InfoProps, Info } from './Info'; import { type InfoProps, Info } from './Info';
interface InfoWithDeltaProps extends InfoProps { interface InfoWithDeltaProps extends InfoProps {
children: number; stats: TankCharacteristics;
value: keyof TankCharacteristics | (() => number | undefined);
} }
export function InfoWithDelta({ children, ...props }: InfoWithDeltaProps) { export function InfoWithDelta({ value, stats, ...props }: InfoWithDeltaProps) {
const delta = useDelta(children); const uhWhatDoICallThisVariable =
typeof value === 'function' ? value()! : (stats[value] as number);
const delta = useDelta(uhWhatDoICallThisVariable);
return ( return (
<Info {...props} delta={delta}> <Info {...props} delta={delta}>
{children} {uhWhatDoICallThisVariable}
</Info> </Info>
); );
} }
@@ -181,21 +181,25 @@ export function Characteristics() {
</Flex> </Flex>
</Flex> </Flex>
<Info name="Gun type">{GUN_TYPE_NAMES[gun.gun_type!.$case]}</Info> <Info name="Gun type">{GUN_TYPE_NAMES[gun.gun_type!.$case]}</Info>
<InfoWithDelta name="DPM" decimals={0} unit="hp / min"> <InfoWithDelta
{stats.dpm} stats={stats}
</InfoWithDelta> name="DPM"
decimals={0}
unit="hp / min"
value="dpm"
/>
{gun.gun_type!.$case === 'auto_reloader' && ( {gun.gun_type!.$case === 'auto_reloader' && (
<InfoWithDelta <InfoWithDelta
stats={stats}
decimals={0} decimals={0}
indent indent
name="Effective at 60s" name="Effective at 60s"
unit="hp / min" unit="hp / min"
> value="dpmEffective"
{stats.dpmEffective!} />
</InfoWithDelta>
)} )}
{gun.gun_type!.$case !== 'regular' && ( {gun.gun_type!.$case !== 'regular' && (
<InfoWithDelta name="Shells">{stats.shells}</InfoWithDelta> <InfoWithDelta stats={stats} name="Shells" value="shells" />
)} )}
{gun.gun_type!.$case === 'auto_reloader' ? ( {gun.gun_type!.$case === 'auto_reloader' ? (
<> <>
@@ -205,56 +209,62 @@ export function Characteristics() {
<Info name="Shell reloads" unit="s" /> <Info name="Shell reloads" unit="s" />
{stats.shellReloads!.map((reload, index) => ( {stats.shellReloads!.map((reload, index) => (
<InfoWithDelta <InfoWithDelta
stats={stats}
key={index} key={index}
indent indent
name={`Shell ${index + 1}`} name={`Shell ${index + 1}`}
decimals={2} decimals={2}
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value={() => reload}
{reload} />
</InfoWithDelta>
))} ))}
</> </>
) : ( ) : (
<InfoWithDelta <InfoWithDelta
stats={stats}
decimals={2} decimals={2}
name="Reload" name="Reload"
unit="s" unit="s"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="shellReload"
{stats.shellReload!} />
</InfoWithDelta>
)} )}
{(gun.gun_type!.$case === 'auto_loader' || {(gun.gun_type!.$case === 'auto_loader' ||
gun.gun_type!.$case === 'auto_reloader') && ( gun.gun_type!.$case === 'auto_reloader') && (
<InfoWithDelta <InfoWithDelta
stats={stats}
indent indent
decimals={2} decimals={2}
name="Intra-clip" name="Intra-clip"
unit="s" unit="s"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="intraClip"
{stats.intraClip!} />
</InfoWithDelta>
)} )}
<InfoWithDelta decimals={0} name="Penetration" unit="mm"> <InfoWithDelta
{stats.penetration} stats={stats}
</InfoWithDelta> decimals={0}
name="Penetration"
unit="mm"
value="penetration"
/>
{typeof shell.penetration !== 'number' && ( {typeof shell.penetration !== 'number' && (
<> <>
<InfoWithDelta <InfoWithDelta
stats={stats}
indent indent
decimals={0} decimals={0}
name={`At ${penetrationDistance}m`} name={`At ${penetrationDistance}m`}
> value={() =>
{lerp( lerp(
shell.penetration.near, shell.penetration.near,
shell.penetration.far, shell.penetration.far,
(penetrationDistance * (penetrationDistance *
penetrationLossOverDistanceCoefficient) / penetrationLossOverDistanceCoefficient) /
500, 500,
) * penetrationCoefficient} ) * penetrationCoefficient
</InfoWithDelta> }
/>
<Flex align="center" gap="2" style={{ paddingLeft: 24 }}> <Flex align="center" gap="2" style={{ paddingLeft: 24 }}>
<Text color="gray">Distance</Text> <Text color="gray">Distance</Text>
<Slider <Slider
@@ -294,146 +304,213 @@ export function Characteristics() {
</Flex> </Flex>
</> </>
)} )}
<InfoWithDelta name="Damage" unit="hp" decimals={0}> <InfoWithDelta
{stats.damage} stats={stats}
</InfoWithDelta> name="Damage"
unit="hp"
decimals={0}
value="damage"
/>
{gun.gun_type!.$case !== 'regular' && ( {gun.gun_type!.$case !== 'regular' && (
<InfoWithDelta name="Clipping potential" indent> <InfoWithDelta
{stats.clipDamage!} stats={stats}
</InfoWithDelta> name="Clipping potential"
indent
value="clipDamage"
/>
)} )}
<InfoWithDelta name="Module damage" unit="hp" decimals={0}> <InfoWithDelta
{stats.moduleDamage} stats={stats}
</InfoWithDelta> name="Module damage"
unit="hp"
decimals={0}
value="moduleDamage"
/>
{isExplosive(shell.type) && ( {isExplosive(shell.type) && (
<InfoWithDelta name="Splash radius" unit="m" decimals={0}> <InfoWithDelta
{stats.explosionRadius!} stats={stats}
</InfoWithDelta> name="Splash radius"
unit="m"
decimals={0}
value="explosionRadius"
/>
)} )}
<InfoWithDelta name="Caliber" decimals={0} unit="mm"> <InfoWithDelta
{stats.caliber} stats={stats}
</InfoWithDelta> name="Caliber"
<InfoWithDelta name="Normalization" decimals={0} unit="°"> decimals={0}
{stats.shellNormalization} unit="mm"
</InfoWithDelta> value="caliber"
/>
<InfoWithDelta
stats={stats}
name="Normalization"
decimals={0}
unit="°"
value="shellNormalization"
/>
{!isExplosive(shell.type) && ( {!isExplosive(shell.type) && (
<InfoWithDelta <InfoWithDelta
stats={stats}
name="Ricochet" name="Ricochet"
decimals={0} decimals={0}
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
unit="°" unit="°"
> value="shellRicochet"
{stats.shellRicochet!} />
</InfoWithDelta>
)} )}
<InfoWithDelta name="Shell velocity" unit="m/s" decimals={0}>
{stats.shellVelocity}
</InfoWithDelta>
<InfoWithDelta name="Shell range" unit="m/s" decimals={0}>
{stats.shellRange}
</InfoWithDelta>
<InfoWithDelta name="Shell capacity" unit="m/s" decimals={0}>
{stats.shellCapacity}
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
stats={stats}
name="Shell velocity"
unit="m/s"
decimals={0}
value="shellVelocity"
/>
<InfoWithDelta
stats={stats}
name="Shell range"
unit="m/s"
decimals={0}
value="shellRange"
/>
<InfoWithDelta
stats={stats}
name="Shell capacity"
unit="m/s"
decimals={0}
value="shellCapacity"
/>
<InfoWithDelta
stats={stats}
decimals={2} decimals={2}
name="Aim time" name="Aim time"
unit="s" unit="s"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="aimTime"
{stats.aimTime} />
</InfoWithDelta>
<Info name="Dispersion at 100m" /> <Info name="Dispersion at 100m" />
<InfoWithDelta <InfoWithDelta
stats={stats}
decimals={3} decimals={3}
indent indent
name="Still" name="Still"
unit="m" unit="m"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="dispersion"
{stats.dispersion} />
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
stats={stats}
prefix="+" prefix="+"
decimals={3} decimals={3}
indent indent
name="Moving" name="Moving"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="dispersionMoving"
{stats.dispersionMoving} />
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
stats={stats}
decimals={3} decimals={3}
prefix="+" prefix="+"
indent indent
name="Hull traversing" name="Hull traversing"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="dispersionHullTraversing"
{stats.dispersionHullTraversing} />
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
stats={stats}
decimals={3} decimals={3}
prefix="+" prefix="+"
indent indent
name="Turret traversing" name="Turret traversing"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="dispersionTurretTraversing"
{stats.dispersionTurretTraversing} />
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
stats={stats}
decimals={3} decimals={3}
prefix="+" prefix="+"
indent indent
name="After shooting" name="After shooting"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="dispersionShooting"
{stats.dispersionShooting} />
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
stats={stats}
decimals={1} decimals={1}
prefix="x " prefix="x "
indent indent
name="Gun damaged" name="Gun damaged"
unit="scalar" unit="scalar"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="dispersionGunDamaged"
{stats.dispersionGunDamaged} />
</InfoWithDelta>
<Info name="Gun flexibility" unit="°" /> <Info name="Gun flexibility" unit="°" />
<InfoWithDelta decimals={1} indent name="Depression"> <InfoWithDelta
{stats.gunDepression} value="gunDepression"
</InfoWithDelta> stats={stats}
<InfoWithDelta decimals={1} indent name="Elevation"> decimals={1}
{stats.gunElevation} indent
</InfoWithDelta> name="Depression"
/>
<InfoWithDelta
stats={stats}
decimals={1}
indent
name="Elevation"
value="gunElevation"
/>
{gunModelDefinition.pitch.front && ( {gunModelDefinition.pitch.front && (
<> <>
<InfoWithDelta decimals={1} indent name="Frontal depression"> <InfoWithDelta
{stats.gunFrontalDepression!} stats={stats}
</InfoWithDelta> decimals={1}
<InfoWithDelta decimals={1} indent name="Frontal elevation"> indent
{stats.gunFrontalElevation!} name="Frontal depression"
</InfoWithDelta> value="gunFrontalDepression"
/>
<InfoWithDelta
stats={stats}
decimals={1}
indent
name="Frontal elevation"
value="gunFrontalElevation"
/>
</> </>
)} )}
{gunModelDefinition.pitch.back && ( {gunModelDefinition.pitch.back && (
<> <>
<InfoWithDelta decimals={1} indent name="Rear depression"> <InfoWithDelta
{stats.gunRearDepression!} stats={stats}
</InfoWithDelta> decimals={1}
<InfoWithDelta decimals={1} indent name="Rear elevation"> indent
{stats.gunRearElevation!} name="Rear depression"
</InfoWithDelta> value="gunRearDepression"
/>
<InfoWithDelta
stats={stats}
decimals={1}
indent
name="Rear elevation"
value="gunRearElevation"
/>
</> </>
)} )}
{turretModelDefinition.yaw && ( {turretModelDefinition.yaw && (
<> <>
<InfoWithDelta decimals={1} indent name="Azimuth left"> <InfoWithDelta
{stats.azimuthLeft!} stats={stats}
</InfoWithDelta> decimals={1}
<InfoWithDelta decimals={1} indent name="Azimuth right"> indent
{stats.azimuthRight!} name="Azimuth left"
</InfoWithDelta> value="azimuthLeft"
/>
<InfoWithDelta
stats={stats}
decimals={1}
indent
name="Azimuth right"
value="azimuthRight"
/>
</> </>
)} )}
</Flex> </Flex>
@@ -459,28 +536,34 @@ export function Characteristics() {
</Popover.Root> </Popover.Root>
</Flex> </Flex>
<InfoWithDelta name="Crew count" decimals={0}> <InfoWithDelta
{stats.crewCount} value="crewCount"
</InfoWithDelta> stats={stats}
name="Crew count"
decimals={0}
/>
{tank.crew.map((member) => { {tank.crew.map((member) => {
return ( return (
<Fragment key={member.type}> <Fragment key={member.type}>
<InfoWithDelta <InfoWithDelta
stats={stats}
key={`${member.type}-root`} key={`${member.type}-root`}
name={`${CREW_MEMBER_NAMES[member.type]}${ name={`${CREW_MEMBER_NAMES[member.type]}${
member.count > 1 ? ` x ${member.count}` : '' member.count > 1 ? ` x ${member.count}` : ''
}`} }`}
unit="%" unit="%"
decimals={0} decimals={0}
> value={() =>
{(member.type === CrewType.COMMANDER (member.type === CrewType.COMMANDER
? commanderMastery ? commanderMastery
: commanderMastery * 1.1) * 100} : commanderMastery * 1.1) * 100
</InfoWithDelta> }
/>
{member.substitute.length > 0 && ( {member.substitute.length > 0 && (
<InfoWithDelta <InfoWithDelta
stats={stats}
key={`${member.type}-substitute`} key={`${member.type}-substitute`}
decimals={0} decimals={0}
unit="%" unit="%"
@@ -497,9 +580,8 @@ export function Characteristics() {
</Flex> </Flex>
</> </>
} }
> value={() => commanderMastery * 1.05 * 100}
{commanderMastery * 1.05 * 100} />
</InfoWithDelta>
)} )}
</Fragment> </Fragment>
); );
@@ -511,123 +593,231 @@ export function Characteristics() {
<Flex direction="column" gap="2"> <Flex direction="column" gap="2">
<Heading size="5">Maneuverability</Heading> <Heading size="5">Maneuverability</Heading>
<Info name="Speed" unit="kph" /> <Info name="Speed" unit="kph" />
<InfoWithDelta decimals={0} indent name="Forwards">
{stats.speedForwards}
</InfoWithDelta>
<InfoWithDelta decimals={0} indent name="Backwards">
{stats.speedBackwards}
</InfoWithDelta>
<InfoWithDelta decimals={0} name="Engine power" unit="hp">
{stats.enginePower}
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
value="speedForwards"
stats={stats}
decimals={0}
indent
name="Forwards"
/>
<InfoWithDelta
value="speedBackwards"
stats={stats}
decimals={0}
indent
name="Backwards"
/>
<InfoWithDelta
stats={stats}
decimals={0}
name="Engine power"
unit="hp"
value="enginePower"
/>
<InfoWithDelta
stats={stats}
decimals={1} decimals={1}
name="Weight" name="Weight"
unit="tn" unit="tn"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="weight"
{stats.weight} />
</InfoWithDelta>
<Info name="Terrain coefficients" /> <Info name="Terrain coefficients" />
<InfoWithDelta decimals={0} unit="%" indent name="Hard">
{stats.hardTerrainCoefficient}
</InfoWithDelta>
<InfoWithDelta decimals={0} unit="%" indent name="Medium">
{stats.mediumTerrainCoefficient}
</InfoWithDelta>
<InfoWithDelta decimals={0} unit="%" indent name="Soft">
{stats.softTerrainCoefficient}
</InfoWithDelta>
<Info name="Raw terrain coefficients" deltaType="lowerIsBetter" />
<InfoWithDelta decimals={2} unit="%" indent name="Hard">
{stats.hardTerrainCoefficientRaw}
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
value="hardTerrainCoefficient"
stats={stats}
decimals={0}
unit="%"
indent
name="Hard"
/>
<InfoWithDelta
stats={stats}
decimals={0}
unit="%"
indent
name="Medium"
value="mediumTerrainCoefficient"
/>
<InfoWithDelta
value="softTerrainCoefficient"
stats={stats}
decimals={0}
unit="%"
indent
name="Soft"
/>
<Info name="Raw terrain coefficients" deltaType="lowerIsBetter" />
<InfoWithDelta
value="hardTerrainCoefficientRaw"
stats={stats}
decimals={2}
unit="%"
indent
name="Hard"
/>
<InfoWithDelta
stats={stats}
decimals={2} decimals={2}
unit="%" unit="%"
indent indent
name="Medium" name="Medium"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="mediumTerrainCoefficientRaw"
{stats.mediumTerrainCoefficientRaw} />
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
stats={stats}
decimals={2} decimals={2}
unit="%" unit="%"
indent indent
name="Soft" name="Soft"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
> value="softTerrainCoefficientRaw"
{stats.softTerrainCoefficientRaw} />
</InfoWithDelta>
<Info name="Power to weight ratio" unit="hp/tn" /> <Info name="Power to weight ratio" unit="hp/tn" />
<InfoWithDelta decimals={1} indent name="On hard terrain"> <InfoWithDelta
{stats.powerToWeightRatioHardTerrain} stats={stats}
</InfoWithDelta> decimals={1}
<InfoWithDelta decimals={1} indent name="On medium terrain"> indent
{stats.powerToWeightRatioMediumTerrain} name="On hard terrain"
</InfoWithDelta> value="powerToWeightRatioHardTerrain"
<InfoWithDelta decimals={1} indent name="On soft terrain"> />
{stats.powerToWeightRatioSoftTerrain} <InfoWithDelta
</InfoWithDelta> stats={stats}
<InfoWithDelta name="Turret traverse speed" unit="°/s" decimals={1}> decimals={1}
{stats.turretTraverseSpeed} indent
</InfoWithDelta> name="On medium terrain"
value="powerToWeightRatioMediumTerrain"
/>
<InfoWithDelta
stats={stats}
decimals={1}
indent
name="On soft terrain"
value="powerToWeightRatioSoftTerrain"
/>
<InfoWithDelta
stats={stats}
name="Turret traverse speed"
unit="°/s"
decimals={1}
value="turretTraverseSpeed"
/>
<Info name="Hull traverse speed" unit="°/s" /> <Info name="Hull traverse speed" unit="°/s" />
<InfoWithDelta decimals={1} indent name="On hard terrain"> <InfoWithDelta
{stats.hullTraverseHardTerrain} stats={stats}
</InfoWithDelta> decimals={1}
<InfoWithDelta decimals={1} indent name="On medium terrain"> indent
{stats.hullTraverseMediumTerrain} name="On hard terrain"
</InfoWithDelta> value="hullTraverseHardTerrain"
<InfoWithDelta decimals={1} indent name="On soft terrain"> />
{stats.hullTraverseSoftTerrain} <InfoWithDelta
</InfoWithDelta> stats={stats}
decimals={1}
indent
name="On medium terrain"
value="hullTraverseMediumTerrain"
/>
<InfoWithDelta
stats={stats}
decimals={1}
indent
name="On soft terrain"
value="hullTraverseSoftTerrain"
/>
</Flex> </Flex>
<Flex direction="column" gap="2"> <Flex direction="column" gap="2">
<Heading size="5">Survivability</Heading> <Heading size="5">Survivability</Heading>
<InfoWithDelta name="Health" unit="hp" decimals={0}>
{stats.health}
</InfoWithDelta>
<InfoWithDelta <InfoWithDelta
value="health"
stats={stats}
name="Health"
unit="hp"
decimals={0}
/>
<InfoWithDelta
stats={stats}
name="Fire chance" name="Fire chance"
unit="%" unit="%"
deltaType="lowerIsBetter" deltaType="lowerIsBetter"
decimals={0} decimals={0}
> value={() => stats.fireChance * 100}
{stats.fireChance * 100} />
</InfoWithDelta> <InfoWithDelta
<InfoWithDelta name="View range" unit="m" decimals={0}> value="viewRange"
{stats.viewRange} stats={stats}
</InfoWithDelta> name="View range"
unit="m"
decimals={0}
/>
<Info name="Camouflage" unit="%" /> <Info name="Camouflage" unit="%" />
<InfoWithDelta indent name="Still" decimals={2}> <InfoWithDelta
{stats.camouflageStill * 100} value={() => stats.camouflageStill * 100}
</InfoWithDelta> stats={stats}
<InfoWithDelta indent name="Moving" decimals={2}> indent
{stats.camouflageMoving * 100} name="Still"
</InfoWithDelta> decimals={2}
<InfoWithDelta indent name="Shooting still" decimals={2}> />
{stats.camouflageShootingStill * 100} <InfoWithDelta
</InfoWithDelta> value={() => stats.camouflageMoving * 100}
<InfoWithDelta indent name="Shooting moving" decimals={2}> stats={stats}
{stats.camouflageShootingMoving * 100} indent
</InfoWithDelta> name="Moving"
<InfoWithDelta indent name="Caught on fire" decimals={2}> decimals={2}
{stats.camouflageCaughtOnFire * 100} />
</InfoWithDelta> <InfoWithDelta
<Info name="Width" unit="m" decimals={0} deltaType="lowerIsBetter"> stats={stats}
{stats.width} indent
</Info> name="Shooting still"
<Info name="Height" unit="m" decimals={0} deltaType="lowerIsBetter"> decimals={2}
{stats.height} value={() => stats.camouflageShootingStill * 100}
</Info> />
<Info name="Length" unit="m" decimals={0} deltaType="lowerIsBetter"> <InfoWithDelta
{stats.length} stats={stats}
</Info> indent
<Info name="Volume" unit="m" decimals={0} deltaType="lowerIsBetter"> name="Shooting moving"
{stats.volume} decimals={2}
</Info> value={() => stats.camouflageShootingMoving * 100}
/>
<InfoWithDelta
stats={stats}
indent
name="Caught on fire"
decimals={2}
value={() => stats.camouflageCaughtOnFire * 100}
/>
<InfoWithDelta
name="Width"
unit="m"
decimals={0}
deltaType="lowerIsBetter"
stats={stats}
value="width"
/>
<InfoWithDelta
name="Height"
unit="m"
decimals={0}
deltaType="lowerIsBetter"
stats={stats}
value="height"
/>
<InfoWithDelta
name="Length"
unit="m"
decimals={0}
deltaType="lowerIsBetter"
stats={stats}
value="length"
/>
<InfoWithDelta
name="Volume"
unit="m"
decimals={0}
deltaType="lowerIsBetter"
stats={stats}
value="volume"
/>
</Flex> </Flex>
</Flex> </Flex>
</Flex> </Flex>