android: add the CLASSIC VIVIDIPES sim and the FX MONOCHROME switch

Straight off PLAN-WEB-TO-ANDROID.md: the sim keeps Classic Chrome's blue row
verbatim and takes Velvia's red and green rows, so skies stay muted while
everything else reads loud, and it carries Chrome's shadow pull.

MONOCHROME is a switch, not a look: it swaps the base filter for the mono stock
and swaps right back, leaving adjustments untouched so a knob turned while it is
on survives the round trip. It goes through commit(), so UNDO undoes it.
This commit is contained in:
2026-09-21 17:20:42 +07:00
parent 1e1ead6f54
commit c8e2b6ea5a
6 changed files with 52 additions and 2 deletions
+25
View File
@@ -764,6 +764,29 @@ export default function App() {
lastStepRef.current = 0;
setUndoDepth(0);
};
// FX's MONOCHROME switch: not a look of its own — it swaps the base filter for
// the mono stock and swaps right back. Adjustments are never touched, so a knob
// turned while it is on survives the round trip.
const monoOn = selectedRecipe?.baseFilter === 'monochrome';
const monoPrevRef = useRef<Recipe | null>(null);
const handleToggleMono = () => {
commit(true, () => {
if (selectedRecipe?.baseFilter === 'monochrome') {
const back = monoPrevRef.current ?? filmSimToRecipe(FILM_SIMS.find((f) => f.id === 'sim-provia')!);
monoPrevRef.current = null;
setSelectedRecipe(back);
} else {
monoPrevRef.current = selectedRecipe;
setSelectedRecipe({
...(selectedRecipe ?? filmSimToRecipe(FILM_SIMS[0])),
id: 'mono',
name: 'MONOCHROME',
baseFilter: 'monochrome',
});
}
});
};
const applyLook = (l: Look) => {
setSelectedRecipe(l.recipe);
setAdjustments(l.adjustments);
@@ -1963,6 +1986,8 @@ export default function App() {
openParam={openParamKey}
onOpenParamChange={setOpenParamKey}
currentBaseFilter={selectedRecipe?.baseFilter}
monoOn={monoOn}
onToggleMono={handleToggleMono}
onCreateRecipe={handleCreateRecipe}
editingRecipe={editingRecipe}
onCloseEdit={() => setEditingRecipe(null)}