// FRD Step 4 — AI reference simulation. For the selected style, renders the // three intensity variants. Each shows a free warp preview immediately; the // paid photoreal heal runs only on explicit click (mirrors Step 5). Heals are // tagged with {style, variant, profile, scale} for A/B attribution. const VARIANT_META = [ { key: "realistic", label: "Realistic", blurb: "Conservative, identity-first." }, { key: "enhanced", label: "Enhanced", blurb: "The style's default targets." }, { key: "aspirational", label: "Aspirational", blurb: "Pushed toward the ideal." }, ]; const VariantColumn = ({ ctx, style, variantKey, profile }) => { const { state, set, runHealFor } = ctx; const v = style.variants[variantKey]; const meta = VARIANT_META.find((m) => m.key === variantKey); const [previewUrl, setPreviewUrl] = React.useState(null); const healed = state.results.find( (r) => r.meta && r.meta.style === style.name && r.meta.variant === variantKey ); React.useEffect(() => { let alive = true; api.warp(state.session.session_id, v.warp) .then((r) => { if (alive) setPreviewUrl(r.image_url); }) .catch(() => {}); return () => { alive = false; }; }, [style.key, variantKey]); const img = healed ? healed.url : previewUrl; const harmonyVal = v.harmony && v.harmony.value != null ? `${v.harmony.value}` : "—"; return (
Visit step 3 to generate style recommendations first.