mirror of
https://github.com/christianvidalwolf-prog/CrazeAnalytix.git
synced 2026-08-03 11:05:23 +02:00
style: condense advertising performance panel in dashboard
This commit is contained in:
+31
-30
@@ -508,21 +508,21 @@ const Dashboard: React.FC<DashboardProps> = ({ data, contextData, adsData = [] }
|
||||
return (
|
||||
<div className="p-6 space-y-6 max-w-7xl mx-auto animate-fade-in pb-24">
|
||||
|
||||
{/* Ads Performance Section - Supports Multiple Years and Growth */}
|
||||
{/* Ads Performance Section - Condensed Layout */}
|
||||
{adsKPIsByYear && availableAdsYears.length > 0 && (
|
||||
<div className="bg-gradient-to-br from-fuchsia-950/20 to-indigo-950/30 border border-fuchsia-500/30 rounded-2xl p-6 animate-fade-in shadow-xl">
|
||||
<div className="flex items-center gap-3 mb-6">
|
||||
<div className="bg-gradient-to-br from-fuchsia-950/20 to-indigo-950/30 border border-fuchsia-500/30 rounded-2xl p-4 animate-fade-in shadow-xl">
|
||||
<div className="flex items-center gap-2 mb-4">
|
||||
<div className="relative">
|
||||
<span className="absolute inset-0 bg-fuchsia-400 rounded-full animate-ping opacity-20"></span>
|
||||
<span className="relative block w-2.5 h-2.5 rounded-full bg-fuchsia-400 shadow-[0_0_8px_rgba(232,121,249,0.8)]"></span>
|
||||
<span className="relative block w-2 h-2 rounded-full bg-fuchsia-400 shadow-[0_0_8px_rgba(232,121,249,0.8)]"></span>
|
||||
</div>
|
||||
<h3 className="text-sm font-black text-fuchsia-400 uppercase tracking-[0.2em]">Advertising Performance Breakdown</h3>
|
||||
<div className="ml-auto px-3 py-1 bg-slate-900/50 rounded-full border border-fuchsia-500/20 text-[10px] text-fuchsia-300 font-bold">
|
||||
{adsData.length.toLocaleString('de-DE')} AD RECORDS LOADED
|
||||
<h3 className="text-xs font-black text-fuchsia-400 uppercase tracking-widest">Advertising Performance</h3>
|
||||
<div className="ml-auto px-2 py-0.5 bg-slate-900/50 rounded-full border border-fuchsia-500/10 text-[9px] text-fuchsia-300/70 font-bold uppercase">
|
||||
{adsData.length.toLocaleString('de-DE')} Records
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="space-y-6">
|
||||
<div className={`grid gap-4 ${availableAdsYears.length > 1 ? 'grid-cols-1 lg:grid-cols-2' : 'grid-cols-1'}`}>
|
||||
{availableAdsYears.map((year, idx) => {
|
||||
const kpi = adsKPIsByYear[year];
|
||||
const prevYear = availableAdsYears[idx + 1];
|
||||
@@ -537,54 +537,55 @@ const Dashboard: React.FC<DashboardProps> = ({ data, contextData, adsData = [] }
|
||||
: (isPositive ? 'text-emerald-400' : 'text-red-400');
|
||||
|
||||
return (
|
||||
<span className={`text-[10px] font-black ml-1.5 ${colorClass}`}>
|
||||
{isPositive ? '▲' : '▼'}{Math.abs(pct).toFixed(1)}%
|
||||
<span className={`text-[9px] font-black ml-1 ${colorClass} whitespace-nowrap`}>
|
||||
{isPositive ? '▲' : '▼'}{Math.abs(pct).toFixed(0)}%
|
||||
</span>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div key={year} className="relative">
|
||||
<div className="flex items-center gap-3 mb-3">
|
||||
<span className="text-xs font-black text-slate-500 font-mono tracking-widest">{year}</span>
|
||||
<div key={year} className="relative bg-slate-950/40 rounded-xl p-3 border border-white/5">
|
||||
<div className="flex items-center gap-2 mb-2">
|
||||
<span className="text-[10px] font-black text-slate-400 font-mono bg-slate-900 px-1.5 py-0.5 rounded">{year}</span>
|
||||
<div className="h-[1px] flex-1 bg-gradient-to-r from-slate-800 to-transparent"></div>
|
||||
</div>
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||
|
||||
<div className="grid grid-cols-2 sm:grid-cols-4 gap-2">
|
||||
{/* Ad Spend */}
|
||||
<div className="bg-slate-900/40 rounded-xl p-4 border border-white/5 transition-all hover:border-fuchsia-500/20">
|
||||
<span className="text-[10px] font-bold text-slate-500 uppercase tracking-wider block mb-1">Ad Spend</span>
|
||||
<div className="flex items-baseline">
|
||||
<span className="text-xl font-black text-fuchsia-400">
|
||||
<div className="group">
|
||||
<span className="text-[9px] font-bold text-slate-500 uppercase tracking-tighter block mb-0.5">Spend</span>
|
||||
<div className="flex items-baseline overflow-hidden">
|
||||
<span className="text-sm font-black text-fuchsia-400 truncate">
|
||||
€{kpi.totalSpend.toLocaleString('de-DE', { maximumFractionDigits: 0 })}
|
||||
</span>
|
||||
{renderGrowth(kpi.totalSpend, prevKpi?.totalSpend)}
|
||||
</div>
|
||||
</div>
|
||||
{/* Attributed Sales */}
|
||||
<div className="bg-slate-900/40 rounded-xl p-4 border border-white/5 transition-all hover:border-emerald-500/20">
|
||||
<span className="text-[10px] font-bold text-slate-500 uppercase tracking-wider block mb-1">Attr. Sales</span>
|
||||
<div className="flex items-baseline">
|
||||
<span className="text-xl font-black text-emerald-400">
|
||||
<div className="group">
|
||||
<span className="text-[9px] font-bold text-slate-500 uppercase tracking-tighter block mb-0.5">Sales</span>
|
||||
<div className="flex items-baseline overflow-hidden">
|
||||
<span className="text-sm font-black text-emerald-400 truncate">
|
||||
€{kpi.attributedSales.toLocaleString('de-DE', { maximumFractionDigits: 0 })}
|
||||
</span>
|
||||
{renderGrowth(kpi.attributedSales, prevKpi?.attributedSales)}
|
||||
</div>
|
||||
</div>
|
||||
{/* ACOS */}
|
||||
<div className="bg-slate-900/40 rounded-xl p-4 border border-white/5 transition-all hover:border-amber-500/20">
|
||||
<span className="text-[10px] font-bold text-slate-500 uppercase tracking-wider block mb-1">ACOS</span>
|
||||
<div className="flex items-baseline">
|
||||
<span className={`text-xl font-black ${kpi.acos <= 30 ? 'text-emerald-400' : kpi.acos <= 50 ? 'text-amber-400' : 'text-red-400'}`}>
|
||||
<div className="group">
|
||||
<span className="text-[9px] font-bold text-slate-500 uppercase tracking-tighter block mb-0.5">ACOS</span>
|
||||
<div className="flex items-baseline overflow-hidden">
|
||||
<span className={`text-sm font-black truncate ${kpi.acos <= 30 ? 'text-emerald-400' : kpi.acos <= 50 ? 'text-amber-400' : 'text-red-400'}`}>
|
||||
{kpi.acos.toFixed(1)}%
|
||||
</span>
|
||||
{renderGrowth(kpi.acos, prevKpi?.acos, true)}
|
||||
</div>
|
||||
</div>
|
||||
{/* ROAS */}
|
||||
<div className="bg-slate-900/40 rounded-xl p-4 border border-white/5 transition-all hover:border-indigo-500/20">
|
||||
<span className="text-[10px] font-bold text-slate-500 uppercase tracking-wider block mb-1">ROAS</span>
|
||||
<div className="flex items-baseline">
|
||||
<span className={`text-xl font-black ${kpi.roas >= 3 ? 'text-emerald-400' : kpi.roas >= 2 ? 'text-amber-400' : 'text-red-400'}`}>
|
||||
<div className="group">
|
||||
<span className="text-[9px] font-bold text-slate-500 uppercase tracking-tighter block mb-0.5">ROAS</span>
|
||||
<div className="flex items-baseline overflow-hidden">
|
||||
<span className={`text-sm font-black truncate ${kpi.roas >= 3 ? 'text-emerald-400' : kpi.roas >= 2 ? 'text-amber-400' : 'text-red-400'}`}>
|
||||
{kpi.roas.toFixed(2)}x
|
||||
</span>
|
||||
{renderGrowth(kpi.roas, prevKpi?.roas)}
|
||||
|
||||
Reference in New Issue
Block a user