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:
@@ -134,7 +134,7 @@ export default function WPImportPage() {
|
||||
if (loading || (!user && !loading)) {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0a0a0a] flex items-center justify-center">
|
||||
<div className="w-6 h-6 border-2 border-[#F0A623] border-t-transparent rounded-full animate-spin" />
|
||||
<div className="w-6 h-6 border-2 border-[#1D4ED8] border-t-transparent rounded-full animate-spin" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -142,10 +142,10 @@ export default function WPImportPage() {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0a0a0a] text-[#cccccc]">
|
||||
{/* Page Header */}
|
||||
<div className="bg-[#1c1815] border-b border-[#3a322b]">
|
||||
<div className="bg-[#F8FAFC] border-b border-[#DCE6F2]">
|
||||
<div className="max-w-6xl mx-auto px-4 py-5">
|
||||
<div className="flex items-center gap-3 mb-1">
|
||||
<Link href="/home-page" className="text-[#555] hover:text-[#F0A623] transition-colors text-sm">
|
||||
<Link href="/home-page" className="text-[#555] hover:text-[#1D4ED8] transition-colors text-sm">
|
||||
Home
|
||||
</Link>
|
||||
<span className="text-[#333]">/</span>
|
||||
@@ -158,14 +158,14 @@ export default function WPImportPage() {
|
||||
<h1 className="text-2xl font-bold text-white font-heading">WordPress Post Importer</h1>
|
||||
<p className="text-[#666] text-sm mt-1">
|
||||
Import posts from{' '}
|
||||
<a href="https://www.avbeat.com" target="_blank" rel="noopener noreferrer" className="text-[#F0A623] hover:underline">
|
||||
<a href="https://www.avbeat.com" target="_blank" rel="noopener noreferrer" className="text-[#1D4ED8] hover:underline">
|
||||
avbeat.com
|
||||
</a>{' '}
|
||||
via WordPress REST API
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-2 text-xs text-[#555] bg-[#231d18] border border-[#3a322b] rounded px-3 py-2">
|
||||
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" className="text-[#F0A623]">
|
||||
<div className="flex items-center gap-2 text-xs text-[#555] bg-[#FFFFFF] border border-[#DCE6F2] rounded px-3 py-2">
|
||||
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" className="text-[#1D4ED8]">
|
||||
<circle cx="12" cy="12" r="10" /><path d="M12 8v4l3 3" />
|
||||
</svg>
|
||||
{posts.length} posts imported
|
||||
@@ -176,9 +176,9 @@ export default function WPImportPage() {
|
||||
|
||||
<div className="max-w-6xl mx-auto px-4 py-6 space-y-6">
|
||||
{/* Import Controls */}
|
||||
<div className="bg-[#1c1815] border border-[#3a322b] rounded-lg p-5">
|
||||
<div className="bg-[#F8FAFC] border border-[#DCE6F2] rounded-lg p-5">
|
||||
<h2 className="text-base font-bold text-white font-heading mb-4 flex items-center gap-2">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" className="text-[#F0A623]">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" className="text-[#1D4ED8]">
|
||||
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" /><polyline points="7 10 12 15 17 10" /><line x1="12" y1="15" x2="12" y2="3" />
|
||||
</svg>
|
||||
Run Import
|
||||
@@ -191,7 +191,7 @@ export default function WPImportPage() {
|
||||
value={maxPages}
|
||||
onChange={(e) => setMaxPages(Number(e.target.value))}
|
||||
disabled={isImporting}
|
||||
className="bg-[#231d18] border border-[#333] text-[#cccccc] text-sm rounded px-3 py-2 focus:outline-none focus:border-[#F0A623] disabled:opacity-50">
|
||||
className="bg-[#FFFFFF] border border-[#333] text-[#cccccc] text-sm rounded px-3 py-2 focus:outline-none focus:border-[#1D4ED8] disabled:opacity-50">
|
||||
<option value={1}>1 page (~20 posts)</option>
|
||||
<option value={3}>3 pages (~60 posts)</option>
|
||||
<option value={5}>5 pages (~100 posts)</option>
|
||||
@@ -204,7 +204,7 @@ export default function WPImportPage() {
|
||||
<button
|
||||
onClick={handleImport}
|
||||
disabled={isImporting}
|
||||
className="flex items-center gap-2 bg-[#F0A623] hover:bg-[#BA7517] disabled:bg-[#412402] disabled:cursor-not-allowed text-white text-sm font-bold px-5 py-2 rounded transition-colors">
|
||||
className="flex items-center gap-2 bg-[#1D4ED8] hover:bg-[#1E3A8A] disabled:bg-[#DCE6F2] disabled:cursor-not-allowed text-white text-sm font-bold px-5 py-2 rounded transition-colors">
|
||||
{isImporting ? (
|
||||
<>
|
||||
<div className="w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin" />
|
||||
@@ -223,16 +223,16 @@ export default function WPImportPage() {
|
||||
|
||||
{/* Import Progress / Result */}
|
||||
{isImporting && (
|
||||
<div className="mt-4 bg-[#0d1a2e] border border-[#412402] rounded p-4">
|
||||
<div className="mt-4 bg-[#0d1a2e] border border-[#DCE6F2] rounded p-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-5 h-5 border-2 border-[#F0A623] border-t-transparent rounded-full animate-spin flex-shrink-0" />
|
||||
<div className="w-5 h-5 border-2 border-[#1D4ED8] border-t-transparent rounded-full animate-spin flex-shrink-0" />
|
||||
<div>
|
||||
<p className="text-[#F0A623] text-sm font-bold">Import in progress</p>
|
||||
<p className="text-[#1D4ED8] text-sm font-bold">Import in progress</p>
|
||||
<p className="text-[#666] text-xs mt-0.5">Fetching posts from avbeat.com and saving to database...</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mt-3 h-1.5 bg-[#231d18] rounded-full overflow-hidden">
|
||||
<div className="h-full bg-[#F0A623] rounded-full animate-pulse w-2/3" />
|
||||
<div className="mt-3 h-1.5 bg-[#FFFFFF] rounded-full overflow-hidden">
|
||||
<div className="h-full bg-[#1D4ED8] rounded-full animate-pulse w-2/3" />
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -261,7 +261,7 @@ export default function WPImportPage() {
|
||||
{[
|
||||
{ label: 'Fetched', value: importResult.totalFetched, color: 'text-[#cccccc]' },
|
||||
{ label: 'Imported', value: importResult.totalImported, color: 'text-green-400' },
|
||||
{ label: 'Pages', value: importResult.pagesProcessed, color: 'text-[#F0A623]' },
|
||||
{ label: 'Pages', value: importResult.pagesProcessed, color: 'text-[#1D4ED8]' },
|
||||
{ label: 'Errors', value: importResult.totalErrors, color: importResult.totalErrors ? 'text-red-400' : 'text-[#555]' },
|
||||
].map((stat) => (
|
||||
<div key={stat.label} className="bg-[#111] rounded p-2.5 text-center">
|
||||
@@ -277,14 +277,14 @@ export default function WPImportPage() {
|
||||
</div>
|
||||
|
||||
{/* Tabs */}
|
||||
<div className="flex gap-0 border-b border-[#3a322b]">
|
||||
<div className="flex gap-0 border-b border-[#DCE6F2]">
|
||||
{(['posts', 'logs'] as const).map((tab) => (
|
||||
<button
|
||||
key={tab}
|
||||
onClick={() => setActiveTab(tab)}
|
||||
className={`px-5 py-2.5 text-sm font-bold uppercase tracking-wider border-b-2 transition-colors ${
|
||||
activeTab === tab
|
||||
? 'border-[#F0A623] text-[#F0A623]'
|
||||
? 'border-[#1D4ED8] text-[#1D4ED8]'
|
||||
: 'border-transparent text-[#666] hover:text-[#999]'
|
||||
}`}>
|
||||
{tab === 'posts' ? `Imported Posts (${posts.length})` : `Import History (${logs.length})`}
|
||||
@@ -306,17 +306,17 @@ export default function WPImportPage() {
|
||||
placeholder="Search posts..."
|
||||
value={searchQuery}
|
||||
onChange={(e) => setSearchQuery(e.target.value)}
|
||||
className="w-full bg-[#111] border border-[#3a322b] text-[#cccccc] text-sm rounded pl-9 pr-4 py-2 focus:outline-none focus:border-[#F0A623] placeholder-[#444]"
|
||||
className="w-full bg-[#111] border border-[#DCE6F2] text-[#cccccc] text-sm rounded pl-9 pr-4 py-2 focus:outline-none focus:border-[#1D4ED8] placeholder-[#444]"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{loadingData ? (
|
||||
<div className="flex items-center justify-center py-16">
|
||||
<div className="w-6 h-6 border-2 border-[#F0A623] border-t-transparent rounded-full animate-spin" />
|
||||
<div className="w-6 h-6 border-2 border-[#1D4ED8] border-t-transparent rounded-full animate-spin" />
|
||||
</div>
|
||||
) : filteredPosts.length === 0 ? (
|
||||
<div className="text-center py-16 bg-[#111] border border-[#3a322b] rounded-lg">
|
||||
<div className="text-center py-16 bg-[#111] border border-[#DCE6F2] rounded-lg">
|
||||
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" className="text-[#333] mx-auto mb-3">
|
||||
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" /><polyline points="14 2 14 8 20 8" /><line x1="16" y1="13" x2="8" y2="13" /><line x1="16" y1="17" x2="8" y2="17" /><polyline points="10 9 9 9 8 9" />
|
||||
</svg>
|
||||
@@ -327,10 +327,10 @@ export default function WPImportPage() {
|
||||
) : (
|
||||
<div className="space-y-2">
|
||||
{filteredPosts.map((post) => (
|
||||
<div key={post.id} className="bg-[#111] border border-[#3a322b] rounded-lg p-4 flex items-start gap-4 hover:border-[#333] transition-colors">
|
||||
<div key={post.id} className="bg-[#111] border border-[#DCE6F2] rounded-lg p-4 flex items-start gap-4 hover:border-[#333] transition-colors">
|
||||
{/* Thumbnail */}
|
||||
{post.featured_image ? (
|
||||
<div className="flex-shrink-0 w-16 h-12 rounded overflow-hidden bg-[#231d18]">
|
||||
<div className="flex-shrink-0 w-16 h-12 rounded overflow-hidden bg-[#FFFFFF]">
|
||||
<AppImage
|
||||
src={post.featured_image}
|
||||
alt={post.featured_image_alt || post.title}
|
||||
@@ -340,7 +340,7 @@ export default function WPImportPage() {
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<div className="flex-shrink-0 w-16 h-12 rounded bg-[#231d18] flex items-center justify-center">
|
||||
<div className="flex-shrink-0 w-16 h-12 rounded bg-[#FFFFFF] flex items-center justify-center">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" className="text-[#333]">
|
||||
<rect x="3" y="3" width="18" height="18" rx="2" /><circle cx="8.5" cy="8.5" r="1.5" /><polyline points="21 15 16 10 5 21" />
|
||||
</svg>
|
||||
@@ -354,7 +354,7 @@ export default function WPImportPage() {
|
||||
<h3 className="text-sm font-bold text-[#cccccc] leading-snug line-clamp-1">{post.title}</h3>
|
||||
<div className="flex flex-wrap items-center gap-x-3 gap-y-1 mt-1">
|
||||
{post.category && (
|
||||
<span className="text-[10px] font-bold uppercase tracking-wider text-[#F0A623] bg-[#0d1a2e] px-1.5 py-0.5 rounded">
|
||||
<span className="text-[10px] font-bold uppercase tracking-wider text-[#1D4ED8] bg-[#0d1a2e] px-1.5 py-0.5 rounded">
|
||||
{post.category}
|
||||
</span>
|
||||
)}
|
||||
@@ -368,7 +368,7 @@ export default function WPImportPage() {
|
||||
href={`https://www.avbeat.com/${post.wp_slug}`}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-[#555] hover:text-[#F0A623] transition-colors p-1"
|
||||
className="text-[#555] hover:text-[#1D4ED8] transition-colors p-1"
|
||||
title="View on avbeat.com">
|
||||
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
|
||||
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" /><polyline points="15 3 21 3 21 9" /><line x1="10" y1="14" x2="21" y2="3" />
|
||||
@@ -402,16 +402,16 @@ export default function WPImportPage() {
|
||||
<div>
|
||||
{loadingData ? (
|
||||
<div className="flex items-center justify-center py-16">
|
||||
<div className="w-6 h-6 border-2 border-[#F0A623] border-t-transparent rounded-full animate-spin" />
|
||||
<div className="w-6 h-6 border-2 border-[#1D4ED8] border-t-transparent rounded-full animate-spin" />
|
||||
</div>
|
||||
) : logs.length === 0 ? (
|
||||
<div className="text-center py-16 bg-[#111] border border-[#3a322b] rounded-lg">
|
||||
<div className="text-center py-16 bg-[#111] border border-[#DCE6F2] rounded-lg">
|
||||
<p className="text-[#555] text-sm">No import history yet.</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="space-y-2">
|
||||
{logs.map((log) => (
|
||||
<div key={log.id} className="bg-[#111] border border-[#3a322b] rounded-lg p-4">
|
||||
<div key={log.id} className="bg-[#111] border border-[#DCE6F2] rounded-lg p-4">
|
||||
<div className="flex items-start justify-between gap-4">
|
||||
<div className="flex items-center gap-2">
|
||||
{log.status === 'completed' ? (
|
||||
@@ -439,7 +439,7 @@ export default function WPImportPage() {
|
||||
{ label: 'Skipped', value: log.total_skipped },
|
||||
{ label: 'Errors', value: log.total_errors },
|
||||
].map((stat) => (
|
||||
<div key={stat.label} className="bg-[#1c1815] rounded p-2 text-center">
|
||||
<div key={stat.label} className="bg-[#F8FAFC] rounded p-2 text-center">
|
||||
<p className="text-base font-bold text-[#cccccc]">{stat.value}</p>
|
||||
<p className="text-[10px] text-[#444] uppercase tracking-wider">{stat.label}</p>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user