feat(brand): AV BEAT 2026 rebrand — blue/navy/white identity
- New AvBeatLogo inline-SVG component (rounded-square emblem with forward-leaning AV monogram + horizontal beam detail) at src/components/AvBeatLogo.tsx, three variants (full/wordmark/icon). - Header.tsx now uses the responsive AV BEAT logo lockup in the top-left, links to /, full lockup on desktop (emblem+wordmark+tagline), emblem+wordmark on tablet, emblem-only on mobile. - Removed DualSpeedTicker (the 'RECENT FORUM POSTS' ticker strip); the news ticker / glow chrome does not match the new aesthetic and the forum row was the explicit removal target. - Tailwind theme + globals.css now expose the AV BEAT 2026 palette as semantic tokens: --brand-blue (#1D4ED8), --brand-blue-bright (#38BDF8), --brand-navy (#0F172A), --brand-bg (#F8FAFC), --brand-surface, --brand-border, --brand-text, --brand-text-muted. Legacy --color-* aliases re-point to the new tokens so any inline-styled component re-themes for free. - Site-wide hex sweep migrates 2,769 hardcoded color literals across 144 files from the old dark-broadcast palette to the new tokens (orange -> blue, dark-brown -> white surface / navy text, cream -> navy). - Layout body class flipped from 'bb-neon' to 'bg-brand-bg text-brand-text' so the dark glow chrome no longer leaks through the new light theme.
This commit is contained in:
@@ -90,7 +90,7 @@ function StatCard({
|
||||
label,
|
||||
value,
|
||||
sub,
|
||||
accent = '#F0A623',
|
||||
accent = '#1D4ED8',
|
||||
icon,
|
||||
trend,
|
||||
}: {
|
||||
@@ -102,7 +102,7 @@ function StatCard({
|
||||
trend?: { value: number; label: string };
|
||||
}) {
|
||||
return (
|
||||
<div className="bg-[#111] border border-[#3a322b] rounded-xl p-5 flex flex-col gap-3">
|
||||
<div className="bg-[#111] border border-[#DCE6F2] rounded-xl p-5 flex flex-col gap-3">
|
||||
<div className="flex items-start justify-between">
|
||||
<div
|
||||
className="w-10 h-10 rounded-lg flex items-center justify-center flex-shrink-0"
|
||||
@@ -134,7 +134,7 @@ function StatCard({
|
||||
function ChartTooltip({ active, payload, label }: any) {
|
||||
if (!active || !payload?.length) return null;
|
||||
return (
|
||||
<div className="bg-[#231d18] border border-[#333] rounded-lg px-3 py-2 text-xs font-body shadow-xl">
|
||||
<div className="bg-[#FFFFFF] border border-[#333] rounded-lg px-3 py-2 text-xs font-body shadow-xl">
|
||||
{label && <p className="text-[#888] mb-1.5 font-semibold">{label}</p>}
|
||||
{payload.map((entry: any, i: number) => (
|
||||
<p key={i} style={{ color: entry.color }} className="leading-5">
|
||||
@@ -252,7 +252,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0a0a0a] flex items-center justify-center">
|
||||
<div className="flex flex-col items-center gap-3">
|
||||
<div className="w-8 h-8 border-2 border-[#F0A623] border-t-transparent rounded-full animate-spin" />
|
||||
<div className="w-8 h-8 border-2 border-[#1D4ED8] border-t-transparent rounded-full animate-spin" />
|
||||
<p className="text-[#555] text-sm font-body">Loading analytics…</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -262,7 +262,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0a0a0a] text-white">
|
||||
{/* Header */}
|
||||
<div className="border-b border-[#231d18] bg-[#1c1815] sticky top-0 z-10">
|
||||
<div className="border-b border-[#FFFFFF] bg-[#F8FAFC] sticky top-0 z-10">
|
||||
<div className="max-w-7xl mx-auto px-6 py-4 flex items-center justify-between">
|
||||
<div className="flex items-center gap-3">
|
||||
<Link href="/admin" className="text-[#555] hover:text-white transition-colors">
|
||||
@@ -270,7 +270,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18" />
|
||||
</svg>
|
||||
</Link>
|
||||
<div className="w-px h-5 bg-[#3a322b]" />
|
||||
<div className="w-px h-5 bg-[#DCE6F2]" />
|
||||
<span className="text-white text-sm font-body font-semibold">Email Analytics</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
@@ -280,17 +280,17 @@ export default function EmailAnalyticsDashboard() {
|
||||
onClick={() => setTimeRange(r)}
|
||||
className={`px-3 py-1.5 text-xs font-semibold font-body rounded-lg transition-colors ${
|
||||
timeRange === r
|
||||
? 'bg-[#F0A623] text-white'
|
||||
: 'text-[#555] hover:text-white border border-[#3a322b] hover:border-[#444]'
|
||||
? 'bg-[#1D4ED8] text-white'
|
||||
: 'text-[#555] hover:text-white border border-[#DCE6F2] hover:border-[#444]'
|
||||
}`}
|
||||
>
|
||||
{r === '3m' ? '3 Mo' : r === '6m' ? '6 Mo' : 'All'}
|
||||
</button>
|
||||
))}
|
||||
<div className="w-px h-6 bg-[#3a322b] mx-1" />
|
||||
<div className="w-px h-6 bg-[#DCE6F2] mx-1" />
|
||||
<Link
|
||||
href="/admin/newsletter/analytics"
|
||||
className="flex items-center gap-1.5 px-3 py-1.5 text-xs font-body font-semibold text-[#888] hover:text-white border border-[#3a322b] rounded-lg transition-colors"
|
||||
className="flex items-center gap-1.5 px-3 py-1.5 text-xs font-body font-semibold text-[#888] hover:text-white border border-[#DCE6F2] rounded-lg transition-colors"
|
||||
>
|
||||
<svg className="w-3.5 h-3.5" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M3 10h18M3 14h18M10 3v18M14 3v18" />
|
||||
@@ -317,7 +317,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
label="Active Subscribers"
|
||||
value={fmt(stats.activeSubscribers)}
|
||||
sub={`${fmt(stats.unsubscribed)} unsubscribed`}
|
||||
accent="#F0A623"
|
||||
accent="#1D4ED8"
|
||||
trend={{ value: 12, label: 'vs last month' }}
|
||||
icon={
|
||||
<svg className="w-5 h-5" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
|
||||
@@ -365,7 +365,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
</div>
|
||||
|
||||
{/* Send Volume Chart */}
|
||||
<div className="bg-[#111] border border-[#3a322b] rounded-xl p-6">
|
||||
<div className="bg-[#111] border border-[#DCE6F2] rounded-xl p-6">
|
||||
<SectionHeader
|
||||
title="Send Volume Over Time"
|
||||
subtitle="Total emails sent, opens, and clicks per month"
|
||||
@@ -378,7 +378,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
<YAxis tick={{ fill: '#555', fontSize: 10 }} tickLine={false} axisLine={false} tickFormatter={(v) => fmt(v)} />
|
||||
<Tooltip content={<ChartTooltip />} />
|
||||
<Legend wrapperStyle={{ fontSize: 11, color: '#888', paddingTop: 12 }} />
|
||||
<Bar dataKey="sent" name="Sent" fill="#3b82f620" stroke="#F0A623" strokeWidth={1} radius={[3, 3, 0, 0]} />
|
||||
<Bar dataKey="sent" name="Sent" fill="#3b82f620" stroke="#1D4ED8" strokeWidth={1} radius={[3, 3, 0, 0]} />
|
||||
<Bar dataKey="opens" name="Opens" fill="#10b98120" stroke="#10b981" strokeWidth={1} radius={[3, 3, 0, 0]} />
|
||||
<Bar dataKey="clicks" name="Clicks" fill="#f59e0b20" stroke="#f59e0b" strokeWidth={1} radius={[3, 3, 0, 0]} />
|
||||
</ComposedChart>
|
||||
@@ -387,7 +387,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
</div>
|
||||
|
||||
{/* Open Rate & CTR Trend */}
|
||||
<div className="bg-[#111] border border-[#3a322b] rounded-xl p-6">
|
||||
<div className="bg-[#111] border border-[#DCE6F2] rounded-xl p-6">
|
||||
<SectionHeader
|
||||
title="Open Rate & Click-Through Rate Trend"
|
||||
subtitle="Monthly engagement rates as a percentage of recipients"
|
||||
@@ -397,8 +397,8 @@ export default function EmailAnalyticsDashboard() {
|
||||
<AreaChart data={filteredRates} margin={{ top: 4, right: 8, left: -10, bottom: 0 }}>
|
||||
<defs>
|
||||
<linearGradient id="openGrad" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="5%" stopColor="#F0A623" stopOpacity={0.2} />
|
||||
<stop offset="95%" stopColor="#F0A623" stopOpacity={0} />
|
||||
<stop offset="5%" stopColor="#1D4ED8" stopOpacity={0.2} />
|
||||
<stop offset="95%" stopColor="#1D4ED8" stopOpacity={0} />
|
||||
</linearGradient>
|
||||
<linearGradient id="clickGrad" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="5%" stopColor="#10b981" stopOpacity={0.2} />
|
||||
@@ -418,10 +418,10 @@ export default function EmailAnalyticsDashboard() {
|
||||
<Area
|
||||
type="monotone"
|
||||
dataKey="Open Rate"
|
||||
stroke="#F0A623"
|
||||
stroke="#1D4ED8"
|
||||
strokeWidth={2}
|
||||
fill="url(#openGrad)"
|
||||
dot={{ r: 3, fill: '#F0A623' }}
|
||||
dot={{ r: 3, fill: '#1D4ED8' }}
|
||||
activeDot={{ r: 5 }}
|
||||
/>
|
||||
<Area
|
||||
@@ -441,7 +441,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
{/* Subscriber Growth */}
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
{/* Growth Over Time */}
|
||||
<div className="bg-[#111] border border-[#3a322b] rounded-xl p-6">
|
||||
<div className="bg-[#111] border border-[#DCE6F2] rounded-xl p-6">
|
||||
<SectionHeader
|
||||
title="Subscriber Growth"
|
||||
subtitle="Total subscribers and monthly net change"
|
||||
@@ -463,14 +463,14 @@ export default function EmailAnalyticsDashboard() {
|
||||
fill="#8b5cf618"
|
||||
dot={false}
|
||||
/>
|
||||
<Bar dataKey="net" name="Net New" fill="#F0A623" radius={[3, 3, 0, 0]} />
|
||||
<Bar dataKey="net" name="Net New" fill="#1D4ED8" radius={[3, 3, 0, 0]} />
|
||||
</ComposedChart>
|
||||
</ResponsiveContainer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* New vs Unsubscribed */}
|
||||
<div className="bg-[#111] border border-[#3a322b] rounded-xl p-6">
|
||||
<div className="bg-[#111] border border-[#DCE6F2] rounded-xl p-6">
|
||||
<SectionHeader
|
||||
title="New Subscribers vs Unsubscribes"
|
||||
subtitle="Monthly acquisition vs churn"
|
||||
@@ -492,7 +492,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
</div>
|
||||
|
||||
{/* Benchmark Comparison */}
|
||||
<div className="bg-[#111] border border-[#3a322b] rounded-xl p-6">
|
||||
<div className="bg-[#111] border border-[#DCE6F2] rounded-xl p-6">
|
||||
<SectionHeader
|
||||
title="Performance vs Industry Benchmarks"
|
||||
subtitle="How your metrics compare to email marketing industry averages"
|
||||
@@ -503,7 +503,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
label: 'Open Rate',
|
||||
yours: stats.avgOpenRate,
|
||||
benchmark: 21.5,
|
||||
color: '#F0A623',
|
||||
color: '#1D4ED8',
|
||||
unit: '%',
|
||||
},
|
||||
{
|
||||
@@ -584,7 +584,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
<div className="flex flex-wrap gap-3 pb-4">
|
||||
<Link
|
||||
href="/admin/newsletter"
|
||||
className="flex items-center gap-2 px-4 py-2 bg-[#111] border border-[#3a322b] rounded-lg text-sm font-body text-[#888] hover:text-white hover:border-[#444] transition-colors"
|
||||
className="flex items-center gap-2 px-4 py-2 bg-[#111] border border-[#DCE6F2] rounded-lg text-sm font-body text-[#888] hover:text-white hover:border-[#444] transition-colors"
|
||||
>
|
||||
<svg className="w-4 h-4" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75" />
|
||||
@@ -593,7 +593,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
</Link>
|
||||
<Link
|
||||
href="/admin/newsletter/analytics"
|
||||
className="flex items-center gap-2 px-4 py-2 bg-[#111] border border-[#3a322b] rounded-lg text-sm font-body text-[#888] hover:text-white hover:border-[#444] transition-colors"
|
||||
className="flex items-center gap-2 px-4 py-2 bg-[#111] border border-[#DCE6F2] rounded-lg text-sm font-body text-[#888] hover:text-white hover:border-[#444] transition-colors"
|
||||
>
|
||||
<svg className="w-4 h-4" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z" />
|
||||
@@ -602,7 +602,7 @@ export default function EmailAnalyticsDashboard() {
|
||||
</Link>
|
||||
<Link
|
||||
href="/admin/newsletter/templates"
|
||||
className="flex items-center gap-2 px-4 py-2 bg-[#111] border border-[#3a322b] rounded-lg text-sm font-body text-[#888] hover:text-white hover:border-[#444] transition-colors"
|
||||
className="flex items-center gap-2 px-4 py-2 bg-[#111] border border-[#DCE6F2] rounded-lg text-sm font-body text-[#888] hover:text-white hover:border-[#444] transition-colors"
|
||||
>
|
||||
<svg className="w-4 h-4" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" />
|
||||
|
||||
Reference in New Issue
Block a user