{options.map((o) => {
const val = typeof o === 'string' ? o : o.value;
const lab = typeof o === 'string' ? o : o.label;
const on = val === value;
return (
);
})}
);
}
function Btn({ v = 'glass', size, icon, iconR, block, children, ...rest }) {
const isz = size === 'lg' ? 20 : size === 'sm' ? 16 : 18;
return (
);
}
function SHead({ icon, tone = 'blue', title, right }) {
return (
{icon && }
{title}
{right && {right}}
);
}
/* ---------- radar ---------- */
function Radar({ ids, size = 268 }) {
const c = size / 2, R = size / 2 - 40, keys = ATTR_KEYS, n = keys.length;
const ang = (i) => -Math.PI / 2 + (i * 2 * Math.PI) / n;
const pt = (i, r) => [c + Math.cos(ang(i)) * r, c + Math.sin(ang(i)) * r];
const ringPoly = (f) => keys.map((_, i) => pt(i, R * f).join(',')).join(' ');
const tvs = TVS.filter((t) => ids.includes(t.id));
return (
);
}
/* ---------- compare screen ---------- */
function scoreTV(tv, scene) {
let s = 0; for (const k in scene.w) s += scene.w[k] * (tv.attrs[k] || 0);
return s;
}
function topReasons(tv, scene) {
return Object.keys(scene.w)
.map((k) => ({ k, c: scene.w[k] * (tv.attrs[k] || 0) }))
.sort((a, b) => b.c - a.c).slice(0, 3).map((x) => x.k);
}
function bestId(metric, ids) {
if (!metric.better) return null;
let best = null, bv = null;
ids.forEach((id) => {
const v = metric.vals[id];
if (typeof v !== 'number') return;
if (bv === null || (metric.better === 'hi' ? v > bv : v < bv)) { bv = v; best = id; }
});
return best;
}
function CompareScreen() {
const [sel, setSel] = useState(['g5', 'e8s', 'sny']);
const [dim, setDim] = useState('pic');
const [sc, setSc] = useState('living');
const scene = SCENES.find((s) => s.key === sc);
const dimObj = DIMS.find((d) => d.key === dim);
const selTvs = TVS.filter((t) => sel.includes(t.id));
const toggle = (id) => setSel((p) => (p.includes(id) ? (p.length > 2 ? p.filter((x) => x !== id) : p) : [...p, id]));
const ranked = [...selTvs].map((t) => ({ t, s: scoreTV(t, scene) })).sort((a, b) => b.s - a.s);
const winner = ranked[0];
const maxScore = Math.max(...ranked.map((r) => r.s), 1);
return (