diff --git a/src/components/Badge.tsx b/src/components/Badge.tsx
index 84bca0d5..4b2a936b 100644
--- a/src/components/Badge.tsx
+++ b/src/components/Badge.tsx
@@ -33,7 +33,7 @@ export default function Badge({
contrast === 'high'
? 'text-invert bg-invert'
: contrast === 'frosted'
- ? 'text-black bg-white/30'
+ ? 'text-black bg-white/30 border border-white/20'
: 'text-medium bg-gray-300/30 dark:bg-gray-700/50',
interactive && (contrast === 'high'
? 'hover:opacity-70'
diff --git a/src/photo/PhotoRecipe.tsx b/src/photo/PhotoRecipe.tsx
index f48776f6..fcd17ea9 100644
--- a/src/photo/PhotoRecipe.tsx
+++ b/src/photo/PhotoRecipe.tsx
@@ -2,6 +2,7 @@ import { FujifilmRecipe } from '@/platforms/fujifilm/recipe';
import { FilmSimulation } from '@/simulation';
import PhotoFilmSimulation from '@/simulation/PhotoFilmSimulation';
import clsx from 'clsx/lite';
+import { ReactNode } from 'react';
import { IoCloseCircle } from 'react-icons/io5';
const addSign = (value = 0) => value < 0 ? value : `+${value}`;
@@ -51,27 +52,32 @@ export default function PhotoRecipe({
.replaceAll('auto', ' ')
.replaceAll('-', ' ');
- const hasBWAdjustments =
- Boolean(bwAdjustment) ||
- Boolean(bwMagentaGreen);
+ const renderRow = (children: ReactNode) =>
+
-
-
- DR{dynamicRange ?? 100}
-
-
- {iso}
-
-
- {exposure}
-
-
-
+ {renderRow(<>
+ {renderDataSquare(`DR${dynamicRange ?? 100}`)}
+ {renderDataSquare(iso)}
+ {renderDataSquare(exposure)}
+ >)}
+ {renderRow(<>
{renderDataSquare(
- `R${addSign(whiteBalance?.red)} / B${addSign(whiteBalance?.blue)}`,
whiteBalanceFormatted,
+ `R${addSign(whiteBalance?.red)} / B${addSign(whiteBalance?.blue)}`,
+ 'basis-2/3',
)}
-
-
- {renderDataSquare('Highlight', highlight || random.highlight)}
- {renderDataSquare('Shadow', shadow || random.shadow)}
-
-
- {/* TODO: Confirm color vs saturation label */}
- {renderDataSquare('Color', color || random.color)}
- {renderDataSquare('Sharpness', sharpness || random.sharpness)}
- {renderDataSquare('Clarity', clarity || random.clarity)}
-
-
- {renderDataSquare('Color Chrome', colorChromeEffect)}
- {renderDataSquare('FX Blue', colorChromeFXBlue)}
-
- {grainEffect &&
-
- {renderDataSquare(
- highISONoiseReduction !== undefined
- ? 'High ISO NR'
- : 'Noise Reduction',
- highISONoiseReduction ?? noiseReductionBasic,
- )}
- {renderDataSquare(
- 'Grain',
- // eslint-disable-next-line max-len
- `${grainEffect.roughness} / ${grainEffect.size === 'large' ? 'LG' : grainEffect.size === 'small' ? 'SM' : 'OFF'}`,
- )}
-
}
- {hasBWAdjustments &&
-
- {renderDataSquare('BW Adjustment', bwAdjustment)}
- {renderDataSquare('BW Magenta Green', bwMagentaGreen)}
-
}
+ {renderDataSquare(
+ highISONoiseReduction ?? noiseReductionBasic,
+ 'ISO NR',
+ 'basis-1/3',
+ )}
+ >)}
+ {renderRow(<>
+ {renderDataSquare(highlight || random.highlight, 'Highlight')}
+ {renderDataSquare(shadow || random.shadow, 'Shadow')}
+ >)}
+ {renderRow(<>
+ {renderDataSquare(color || random.color, 'Color')}
+ {renderDataSquare(sharpness || random.sharpness, 'Sharpness')}
+ {renderDataSquare(clarity || random.clarity, 'Clarity')}
+ >)}
+ {renderRow(<>
+ {renderDataSquare(colorChromeEffect, 'Color Chrome')}
+ {renderDataSquare(colorChromeFXBlue, 'FX Blue')}
+ >)}
+ {renderRow(<>
+ {renderDataSquare(
+ <>
+ {grainEffect?.roughness === 'strong'
+ ? 'Str'
+ : grainEffect?.roughness === 'weak'
+ ? 'Wk'
+ : 'OFF'}
+ {' / '}
+ {grainEffect?.size === 'large'
+ ? 'LG'
+ : grainEffect?.size === 'small'
+ ? 'SM' : 'OFF'}
+ >,
+ 'Grain',
+ )}
+ {renderDataSquare(bwAdjustment, 'BW')}
+ {renderDataSquare(bwMagentaGreen, 'BW M/G')}
+ >)}
;