/* CompareModal — comparador de propiedades lado a lado */ const compareStyles = ` .cmp-overlay { position: fixed; inset: 0; background: oklch(0.2 0.03 290 / .55); backdrop-filter: blur(4px); z-index: 90; display: flex; align-items: flex-start; justify-content: center; padding: 24px 16px; overflow-y: auto; } .cmp { background: #fff; border-radius: 20px; width: min(980px, 100%); padding: 24px; box-shadow: 0 30px 80px oklch(0.3 0.08 295 / .4); margin: auto; } .cmp-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .cmp-head h2 { font-size: 20px; font-weight: 800; display: flex; align-items: center; gap: 9px; } .cmp-head button { border: none; background: oklch(0.94 0.006 290); width: 34px; height: 34px; border-radius: 50%; font-size: 15px; cursor: pointer; } .cmp-sub { font-size: 13px; color: var(--ink-soft); font-weight: 600; margin-top: 4px; } .cmp-pick { display: flex; gap: 8px; flex-wrap: wrap; margin: 16px 0 4px; } .cmp-chip { display: flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 700; padding: 8px 13px; border-radius: 999px; border: 1.5px solid var(--line); background: #fff; cursor: pointer; } .cmp-chip.on { border-color: var(--purple); background: var(--purple-soft); color: var(--purple-deep); } .cmp-chip:disabled { opacity: .4; cursor: not-allowed; } .cmp-grid { display: grid; margin-top: 18px; border: 1px solid var(--line); border-radius: 14px; overflow: hidden; } .cmp-grid .cell { padding: 11px 14px; font-size: 13px; border-bottom: 1px solid var(--line); display: flex; align-items: center; } .cmp-grid .rowlbl { font-weight: 700; color: var(--ink-soft); font-size: 12px; background: var(--bg); } .cmp-grid .val { font-weight: 700; justify-content: center; text-align: center; } .cmp-grid .val.best { background: var(--green-soft, oklch(0.95 0.04 152)); color: oklch(0.4 0.13 152); font-weight: 800; } .cmp-grid .val.best::after { content: "★"; font-size: 10px; margin-left: 5px; } .cmp-grid .phead { flex-direction: column; align-items: stretch; gap: 8px; padding: 14px; border-bottom: 1px solid var(--line); } .cmp-grid .phead .ph-img { height: 86px; border-radius: 10px; background: linear-gradient(145deg, var(--purple-soft), oklch(0.9 0.04 295)); display: grid; place-items: center; font-size: 30px; overflow: hidden; } .cmp-grid .phead .ph-img img { width: 100%; height: 100%; object-fit: cover; } .cmp-grid .phead .ph-t { font-family: "Sora"; font-weight: 800; font-size: 13px; line-height: 1.25; text-align: center; } .cmp-grid .phead .ph-c { font-size: 11.5px; color: var(--ink-soft); font-weight: 600; text-align: center; } .cmp-empty { text-align: center; padding: 40px 20px; color: var(--ink-soft); font-weight: 600; font-size: 14px; } .cmp-note { font-size: 11.5px; color: var(--ink-soft); font-weight: 600; margin-top: 12px; } @media (max-width: 640px) { .cmp-grid .cell { padding: 9px 8px; font-size: 11.5px; } .cmp-grid .rowlbl { font-size: 10.5px; } } `; function CompareModal({ properties, initial, onClose, onGo }) { const { useState } = React; const fmt = window.CCV.fmtMXN; const [sel, setSel] = useState(initial && initial.length ? initial.slice(0, 3) : properties.slice(0, 2).map((p) => p.id)); const chosen = sel.map((id) => properties.find((p) => p.id === id)).filter(Boolean); function toggle(id) { setSel((s) => s.includes(id) ? s.filter((x) => x !== id) : (s.length >= 3 ? s : s.concat(id))); } const mensual = (p) => window.CCV.calcBanco(p.precio, 0.15, 20).mensualidad; const pm2 = (p) => (p.m2 ? p.precio / p.m2 : 0); // best: "min" gana el menor, "max" gana el mayor, null sin estrella const ROWS = [ { l: "Precio", v: (p) => fmt(p.precio), n: (p) => p.precio, best: "min" }, { l: "Mensualidad est.", v: (p) => fmt(mensual(p)) + "/mes", n: mensual, best: "min" }, { l: "Precio por m²", v: (p) => pm2(p) ? fmt(pm2(p)) : "—", n: pm2, best: "min", skipZero: true }, { l: "M² construcción", v: (p) => p.m2 ? p.m2 + " m²" : "—", n: (p) => p.m2 || 0, best: "max", skipZero: true }, { l: "M² terreno", v: (p) => p.m2Terreno ? p.m2Terreno + " m²" : "—", n: (p) => p.m2Terreno || 0, best: "max", skipZero: true }, { l: "Recámaras", v: (p) => p.recamaras || "—", n: (p) => p.recamaras || 0, best: "max", skipZero: true }, { l: "Baños", v: (p) => p.banos || "—", n: (p) => p.banos || 0, best: "max", skipZero: true }, { l: "Estacionamientos", v: (p) => p.estac || "—", n: (p) => p.estac || 0, best: "max", skipZero: true }, { l: "Tipo", v: (p) => p.tipo || "Casa", best: null }, { l: "Segmento", v: (p) => p.tag || "—", best: null }, { l: "Zona", v: (p) => (p.colonia ? p.colonia + ", " : "") + (p.ciudad || ""), best: null }, { l: "Vendedor", v: (p) => p.inmobiliaria || "—", best: null }, ]; function bestIdx(row) { if (!row.best || chosen.length < 2) return -1; const vals = chosen.map(row.n); if (row.skipZero && vals.some((v) => !v)) return -1; const target = row.best === "min" ? Math.min(...vals) : Math.max(...vals); const winners = vals.filter((v) => v === target).length; return winners === 1 ? vals.indexOf(target) : -1; } const cols = "150px " + chosen.map(() => "1fr").join(" "); const ico = (p) => window.CCV.tipoIcon ? window.CCV.tipoIcon(p.tipo) : "🏠"; return (