AV: precise recolor to spec — warm dark backgrounds (#1c1815/#231d18/#26201a/#15110e) + gold #F0A623 / orange #D85A30 accents + warm text (#FBEFE0/#C9BBA8/#8a7e6e). 138 component files + 36 token swaps.

This commit is contained in:
2026-06-02 23:46:00 +00:00
parent 01c1abf99d
commit 2876ac6ecd
141 changed files with 2020 additions and 2020 deletions

View File

@@ -256,7 +256,7 @@ export default function ShowCalendarPage() {
if (loading) {
return (
<div className="min-h-screen bg-[#0a0a0a] flex items-center justify-center">
<div className="w-8 h-8 border-2 border-[#ffb800] border-t-transparent rounded-full animate-spin" />
<div className="w-8 h-8 border-2 border-[#F0A623] border-t-transparent rounded-full animate-spin" />
</div>
);
}
@@ -281,7 +281,7 @@ export default function ShowCalendarPage() {
)}
{/* Header */}
<div className="border-b border-[#1a1a1a] bg-[#0f0f0f]">
<div className="border-b border-[#231d18] bg-[#0f0f0f]">
<div className="max-w-7xl mx-auto px-4 py-4">
<div className="flex items-center justify-between">
<div>
@@ -294,13 +294,13 @@ export default function ShowCalendarPage() {
<div className="flex items-center gap-3">
<button
onClick={() => { setEditingEvent({ site_id: 1, year: new Date().getFullYear(), seo_tier: 3, event_type: 'trade_show' }); setShowEventModal(true); }}
className="px-3 py-1.5 bg-[#ffb800] hover:bg-blue-500 text-white text-sm rounded-lg transition-colors"
className="px-3 py-1.5 bg-[#F0A623] hover:bg-blue-500 text-white text-sm rounded-lg transition-colors"
>
+ Add Event
</button>
<button
onClick={() => setShowGenerateModal(true)}
className="px-3 py-1.5 bg-[#1a1a1a] hover:bg-[#252525] border border-[#333] text-white text-sm rounded-lg transition-colors"
className="px-3 py-1.5 bg-[#231d18] hover:bg-[#3a322b] border border-[#333] text-white text-sm rounded-lg transition-colors"
>
Generate Story
</button>
@@ -316,8 +316,8 @@ export default function ShowCalendarPage() {
onClick={() => setSiteFilter(s)}
className={`px-3 py-1 rounded text-xs font-medium transition-colors ${
siteFilter === s
? 'bg-[#ffb800] text-white'
: 'bg-[#1a1a1a] text-[#888] hover:text-white border border-[#333]'
? 'bg-[#F0A623] text-white'
: 'bg-[#231d18] text-[#888] hover:text-white border border-[#333]'
}`}
>
{s === '' ? 'All Sites' : s === '1' ? '🔵 AV Beat' : '🟠 AV Beat'}
@@ -326,14 +326,14 @@ export default function ShowCalendarPage() {
</div>
{/* Tabs */}
<div className="flex gap-1 mt-4 border-b border-[#1a1a1a]">
<div className="flex gap-1 mt-4 border-b border-[#231d18]">
{tabs.map(tab => (
<button
key={tab.id}
onClick={() => setActiveTab(tab.id)}
className={`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px ${
activeTab === tab.id
? 'border-[#ffb800] text-white'
? 'border-[#F0A623] text-white'
: 'border-transparent text-[#666] hover:text-white'
}`}
>
@@ -347,7 +347,7 @@ export default function ShowCalendarPage() {
<div className="max-w-7xl mx-auto px-4 py-6">
{loadingData ? (
<div className="flex items-center justify-center py-20">
<div className="w-8 h-8 border-2 border-[#ffb800] border-t-transparent rounded-full animate-spin" />
<div className="w-8 h-8 border-2 border-[#F0A623] border-t-transparent rounded-full animate-spin" />
</div>
) : (
<>
@@ -383,7 +383,7 @@ export default function ShowCalendarPage() {
<span>Engine: {formatDate(event.story_engine_start_date)} {formatDate(event.story_engine_end_date)}</span>
{event.official_site && (
<a href={`https://${event.official_site}`} target="_blank" rel="noopener noreferrer"
className="text-[#ffb800] hover:underline">{event.official_site}</a>
className="text-[#F0A623] hover:underline">{event.official_site}</a>
)}
</div>
<div className="flex items-center gap-3 mt-2 text-xs text-[#555]">
@@ -400,13 +400,13 @@ export default function ShowCalendarPage() {
<button
onClick={() => handleExtractStyle(event.event_name)}
disabled={actionLoading === 'style-' + event.event_name}
className="px-2 py-1 bg-[#1a1a1a] hover:bg-[#252525] border border-[#333] text-[#888] hover:text-white text-xs rounded transition-colors disabled:opacity-50"
className="px-2 py-1 bg-[#231d18] hover:bg-[#3a322b] border border-[#333] text-[#888] hover:text-white text-xs rounded transition-colors disabled:opacity-50"
>
{actionLoading === 'style-' + event.event_name ? 'Extracting...' : 'Extract Style'}
</button>
<button
onClick={() => { setEditingEvent(event); setShowEventModal(true); }}
className="px-2 py-1 bg-[#1a1a1a] hover:bg-[#252525] border border-[#333] text-[#888] hover:text-white text-xs rounded transition-colors"
className="px-2 py-1 bg-[#231d18] hover:bg-[#3a322b] border border-[#333] text-[#888] hover:text-white text-xs rounded transition-colors"
>
Edit Dates
</button>
@@ -440,8 +440,8 @@ export default function ShowCalendarPage() {
onClick={() => setQueueStatus(s)}
className={`px-3 py-1 rounded text-xs font-medium transition-colors ${
queueStatus === s
? 'bg-[#ffb800] text-white'
: 'bg-[#1a1a1a] text-[#888] hover:text-white border border-[#333]'
? 'bg-[#F0A623] text-white'
: 'bg-[#231d18] text-[#888] hover:text-white border border-[#333]'
}`}
>
{s.replace('_', ' ')}
@@ -460,7 +460,7 @@ export default function ShowCalendarPage() {
<div className="flex items-center gap-2 mb-1 flex-wrap">
<SiteBadge siteId={item.site_id} />
{item.source_show && (
<span className="text-xs text-[#555] bg-[#1a1a1a] px-1.5 py-0.5 rounded">{item.source_show}</span>
<span className="text-xs text-[#555] bg-[#231d18] px-1.5 py-0.5 rounded">{item.source_show}</span>
)}
{item.show_phase && (
<span className={`text-xs ${PHASE_LABELS[item.show_phase]?.color || 'text-gray-500'}`}>
@@ -470,7 +470,7 @@ export default function ShowCalendarPage() {
<span className={`text-xs px-1.5 py-0.5 rounded ${
item.status === 'published' ? 'bg-green-900/20 text-green-400' :
item.status === 'rejected' ? 'bg-red-900/20 text-red-400' :
item.status === 'generated'? 'bg-blue-900/20 text-blue-400' : 'bg-[#1a1a1a] text-[#888]'
item.status === 'generated'? 'bg-blue-900/20 text-blue-400' : 'bg-[#231d18] text-[#888]'
}`}>{item.status}</span>
{item.quality_confidence !== null && (
<span className={`text-xs ${item.quality_confidence >= 0.85 ? 'text-green-400' : item.quality_confidence >= 0.7 ? 'text-yellow-400' : 'text-red-400'}`}>
@@ -490,7 +490,7 @@ export default function ShowCalendarPage() {
{/* Expanded content */}
{expandedItem === item.id && item.generated_content && (
<div className="mt-3 p-3 bg-[#0a0a0a] rounded-lg border border-[#1a1a1a]">
<div className="mt-3 p-3 bg-[#0a0a0a] rounded-lg border border-[#231d18]">
<div
className="text-[#aaa] text-xs prose prose-invert max-w-none"
dangerouslySetInnerHTML={{ __html: item.generated_content.slice(0, 1500) + (item.generated_content.length > 1500 ? '...' : '') }}
@@ -501,7 +501,7 @@ export default function ShowCalendarPage() {
<div className="flex items-center gap-2 flex-shrink-0">
<button
onClick={() => setExpandedItem(expandedItem === item.id ? null : item.id)}
className="px-2 py-1 bg-[#1a1a1a] hover:bg-[#252525] border border-[#333] text-[#888] hover:text-white text-xs rounded transition-colors"
className="px-2 py-1 bg-[#231d18] hover:bg-[#3a322b] border border-[#333] text-[#888] hover:text-white text-xs rounded transition-colors"
>
{expandedItem === item.id ? 'Hide' : 'Preview'}
</button>
@@ -541,7 +541,7 @@ export default function ShowCalendarPage() {
<select
value={showFilter}
onChange={e => setShowFilter(e.target.value)}
className="bg-[#1a1a1a] border border-[#333] text-white text-xs rounded px-2 py-1"
className="bg-[#231d18] border border-[#333] text-white text-xs rounded px-2 py-1"
>
<option value="">All Shows</option>
{events.map(e => <option key={e.id} value={e.id}>{e.event_name}</option>)}
@@ -564,13 +564,13 @@ export default function ShowCalendarPage() {
<tr><td colSpan={5} className="text-center py-8 text-[#555]">No exhibitors found.</td></tr>
)}
{exhibitors.map(ex => (
<tr key={ex.id} className="border-b border-[#1a1a1a] hover:bg-[#0f0f0f]">
<tr key={ex.id} className="border-b border-[#231d18] hover:bg-[#0f0f0f]">
<td className="px-4 py-3 text-white font-medium">{ex.company_name}</td>
<td className="px-4 py-3 text-[#888]">{ex.booth_number || '—'}</td>
<td className="px-4 py-3">
<span className={`text-xs px-1.5 py-0.5 rounded ${
ex.preview_story_status === 'published' ? 'bg-green-900/20 text-green-400' :
ex.preview_story_status === 'generated'? 'bg-blue-900/20 text-blue-400' : 'bg-[#1a1a1a] text-[#888]'
ex.preview_story_status === 'generated'? 'bg-blue-900/20 text-blue-400' : 'bg-[#231d18] text-[#888]'
}`}>{ex.preview_story_status}</span>
</td>
<td className="px-4 py-3">
@@ -613,14 +613,14 @@ export default function ShowCalendarPage() {
Updated: {formatDate(profile.last_updated)}
</p>
{expandedItem === profile.id && profile.style_guide_text && (
<div className="mt-3 p-3 bg-[#0a0a0a] rounded-lg border border-[#1a1a1a]">
<div className="mt-3 p-3 bg-[#0a0a0a] rounded-lg border border-[#231d18]">
<p className="text-[#aaa] text-xs whitespace-pre-wrap">{profile.style_guide_text}</p>
</div>
)}
</div>
<button
onClick={() => setExpandedItem(expandedItem === profile.id ? null : profile.id)}
className="px-2 py-1 bg-[#1a1a1a] hover:bg-[#252525] border border-[#333] text-[#888] hover:text-white text-xs rounded transition-colors flex-shrink-0"
className="px-2 py-1 bg-[#231d18] hover:bg-[#3a322b] border border-[#333] text-[#888] hover:text-white text-xs rounded transition-colors flex-shrink-0"
>
{expandedItem === profile.id ? 'Hide' : 'View Guide'}
</button>
@@ -637,24 +637,24 @@ export default function ShowCalendarPage() {
<div className="bg-[#111] border border-[#1e1e1e] rounded-xl p-6">
<h2 className="text-white font-semibold mb-4">Show Engine Settings</h2>
<div className="space-y-4 text-sm text-[#888]">
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#1a1a1a]">
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#231d18]">
<p className="text-white font-medium mb-1">Annual Date Discovery</p>
<p>Runs automatically on January 1 each year. Searches official show websites and Google for confirmed dates. Sends admin notification when dates are set or when manual review is needed.</p>
</div>
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#1a1a1a]">
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#231d18]">
<p className="text-white font-medium mb-1">Pen Name Rosters</p>
<p className="mb-2"><strong className="text-[#aaa]">AV Beat (12 writers):</strong> Michael Strand, David Harlow, Karen Fielding, James Mercer (primary NAB), Peter Calloway, Sandra Voss, Brian Kowalski, Laura Pennington, Thomas Reeves, Christine Vale, Marcus Webb, Ellen Forsythe</p>
<p><strong className="text-[#aaa]">AV Beat (7 writers):</strong> Rex Chandler, Dana Flux, Derek Wainwright, Sloane Rigging, Chip Crosspoint, Blair Presenter, Jordan Lumen</p>
</div>
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#1a1a1a]">
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#231d18]">
<p className="text-white font-medium mb-1">SEO Tier Priority</p>
<p>Tier 1 (Max): NAB Las Vegas, IBC, InfoComm, ISE · Tier 2 (High): NAB NY, BroadcastAsia, CABSAT, AES, InfoComm EDGE/China/LatAm · Tier 3 (Standard): MPTS, SET Expo, NATPE, InfoComm India, FORTÉ LIVE · Tier 4 (Light): NewsTECHForum, TAB, SVVS, Hamburg Open, AVIXA Regional</p>
</div>
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#1a1a1a]">
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#231d18]">
<p className="text-white font-medium mb-1">NAB Cross-Post to AV Beat</p>
<p>NAB exhibitors with AV-eligible products (projectors, displays, conferencing, control systems, digital signage, installed audio, AV-over-IP) automatically generate stories on AV Beat using AV Beat pen names.</p>
</div>
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#1a1a1a]">
<div className="p-3 bg-[#0a0a0a] rounded-lg border border-[#231d18]">
<p className="text-white font-medium mb-1">Blocked Competitor Sources</p>
<p>BB: tvtechnology.com, broadcastingcable.com, sportsvideo.org, digitaltveurope.com, nexttv.com · AV: ravepubs.com, avnetwork.com, commercialintegrator.com, systemscontractor.com, avinteractive.com · Note: infocommshow.org, iseurope.org, nabshow.com, avixa.org are PRIMARY sources not blocked.</p>
</div>
@@ -779,14 +779,14 @@ export default function ShowCalendarPage() {
<button
type="submit"
disabled={actionLoading === 'save-event'}
className="flex-1 py-2 bg-[#ffb800] hover:bg-blue-500 text-white text-sm rounded-lg transition-colors disabled:opacity-50"
className="flex-1 py-2 bg-[#F0A623] hover:bg-blue-500 text-white text-sm rounded-lg transition-colors disabled:opacity-50"
>
{actionLoading === 'save-event' ? 'Saving...' : 'Save Event'}
</button>
<button
type="button"
onClick={() => { setShowEventModal(false); setEditingEvent(null); }}
className="px-4 py-2 bg-[#1a1a1a] hover:bg-[#252525] border border-[#333] text-white text-sm rounded-lg transition-colors"
className="px-4 py-2 bg-[#231d18] hover:bg-[#3a322b] border border-[#333] text-white text-sm rounded-lg transition-colors"
>
Cancel
</button>
@@ -857,14 +857,14 @@ export default function ShowCalendarPage() {
<button
type="submit"
disabled={actionLoading === 'generate'}
className="flex-1 py-2 bg-[#ffb800] hover:bg-blue-500 text-white text-sm rounded-lg transition-colors disabled:opacity-50"
className="flex-1 py-2 bg-[#F0A623] hover:bg-blue-500 text-white text-sm rounded-lg transition-colors disabled:opacity-50"
>
{actionLoading === 'generate' ? 'Generating...' : 'Generate Story'}
</button>
<button
type="button"
onClick={() => setShowGenerateModal(false)}
className="px-4 py-2 bg-[#1a1a1a] hover:bg-[#252525] border border-[#333] text-white text-sm rounded-lg transition-colors"
className="px-4 py-2 bg-[#231d18] hover:bg-[#3a322b] border border-[#333] text-white text-sm rounded-lg transition-colors"
>
Cancel
</button>