function CampaignPreview({ campaign: c, onClose, tips }) { const tip = tips.find(t => t.adId === c.id); const roas = Number(c.roas); const roasColor = roas < 1.5 ? 'var(--neg)' : roas >= 3.5 ? 'var(--pos)' : 'var(--accent-strong)'; // Simple sparkline — mock 7-day trend based on ROAS const spark = Array.from({ length: 7 }, (_, i) => { const base = Number(c.revenue) / 7; return base * (0.7 + Math.sin(i * 0.9 + roas) * 0.3 + i * 0.04); }); const sparkMax = Math.max(...spark); const sparkMin = Math.min(...spark); const H = 60, W = 240; const sx = (i) => (i / 6) * W; const sy = (v) => H - ((v - sparkMin) / (sparkMax - sparkMin + 1)) * H * 0.85 - 4; const sparkPath = spark.map((v, i) => `${i ? 'L' : 'M'}${sx(i).toFixed(1)},${sy(v).toFixed(1)}`).join(' '); const sparkArea = sparkPath + ` L${W},${H} L0,${H} Z`; const kpis = [ { label:'ค่าโฆษณา', en:'SPEND', value:`฿${Number(c.spend).toLocaleString()}`, color:'var(--ink)' }, { label:'รายได้', en:'REVENUE', value:`฿${Number(c.revenue).toLocaleString()}`, color:'var(--pos)' }, { label:'ROAS', en:'RETURN', value:`${Number(c.roas).toFixed(2)}x`, color:roasColor }, { label:'CTR', en:'CLICK RATE', value:`${c.ctr}%`, color:'var(--ink)' }, { label:'CPC', en:'COST/CLICK', value:`฿${c.cpc}`, color:'var(--ink)' }, { label:'Conversions', en:'CONV.', value:String(c.conversions), color:'var(--info)' }, ]; return ( <> {/* backdrop */}
{/* panel */}