/* Brand Lens — the living photography style guide (built from your real calls) */
function StyleGuide({ recs, goReview }) {
const reviewed = useMemo(() => recs.filter((r) => r.user && r.ai), [recs]);
const liked = useMemo(() => recs.filter((r) => r.user && r.user.like).sort((a, b) => (b.ai ? b.ai.score : 0) - (a.ai ? a.ai.score : 0)), [recs]);
const disliked = useMemo(() => recs.filter((r) => r.user && !r.user.like), [recs]);
const [guide, setGuide] = useState(() => {
try { return JSON.parse(localStorage.getItem('lens-guide') || 'null'); } catch (e) { return null; }
});
const [busy, setBusy] = useState(false);
const [err, setErr] = useState(null);
async function build() {
setBusy(true); setErr(null);
try {
const g = await window.Lens.generateGuide(recs);
setGuide(g);
localStorage.setItem('lens-guide', JSON.stringify(g));
} catch (e) { setErr(e.message || 'Generation failed'); }
setBusy(false);
}
if (reviewed.length < 3) {
return
Distilled from your {reviewed.length} reviewed images and your own comments. Generating or refreshing it re-teaches the judge — your next Calibrate round will score with this folded in, so agreement climbs over rounds.
{err &&{guide.social.note}
)} {guide.social.rules && guide.social.rules.length > 0 && ({sub}
} {children}
{empty}
; return (