Three pointed fixes:
/manufacturers (cloned from BB; still had broadcast vibe)
• Drop the hardcoded "NAB + IBC" filter chip.
• Per-card "2026 NAB Show" / "IBC 2026" badges replaced by dynamic
pills generated from shows_attending intersected with av.events
(so each card now shows the actual AV shows that exhibitor is
attending — InfoComm, CEDIA, ISE, DSE, etc.).
• Page intro counts: drop nabCount / ibcCount hardcoding, compute
"top 3 shows by exhibitor count" from the data and surface those
counts dynamically. With only InfoComm 2026 currently tagged the
line reads "851 at InfoComm 2026" — adds more rows once other
shows are scraped.
• Meta description + OG: pro-AV / display / signage instead of
"broadcast, post-production, and live-production."
/about/team phone formatting
• New formatPhone() helper: E.164 → "(213) 418-2600" pattern.
• Extension format: ", Ext. NNN" (capital E, comma-separated).
• tel: link still uses the raw digits + RFC-3966 ',ext' pause for
PBX auto-dial on supported clients.
/about page media-kit link
• Was href="/about/advertise" — a relative path that 404s (no such
route exists). Replaced with the absolute media-kit URL on
relevantmediaproperties.com that the /advertise + /about/contact
pages already use. Opens in a new tab.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two unrelated production bugs called out in the same review pass:
1) AI persona disclosure — strictly removed everywhere readers see it.
- /about/team hero subtitle no longer says "trained AI personas working
under house style"; copy now reads like every other newsroom team page.
- /about "How we work" block drops the line about AI assistants
rewriting press releases + the "Our AI personas are clearly labeled"
sentence. Reworded to just describe the editorial process.
- ArticleComments no longer renders the small "AI" chip beside
is_ai_seeded commenters. The flag stays in the DB for internal
accounting; it just doesn't surface in the UI.
- Stale code comments in articles/[slug] + news/[slug] that referenced
"AI personas participate (tagged)" cleaned up.
The is_ai_seeded / is_ai_response columns are now strictly internal-only.
2) Team page card visibility — the page wrapper got switched from
text-[#e5e7eb] to text-[#0F172A] in the recent restyle, which fixed
white-on-white outside the cards but left the dark-card H3 names
inheriting dark navy on a dark navy bg = invisible. Forced text-white
on both H3s (editorial + ops). Email rows now use min-w-0 + flex-1 +
block truncate so long addresses ellipsis inside the card instead of
pushing the layout past the right edge.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three coupled rollouts in one shot.
PART A — client highlight matcher (DB migration applied separately):
- promoted-articles.ts: AdvertiserName now carries brand_aliases; matcher
iterates legal name + every alias with word-boundary regex and picks the
longest match across all candidates so "Magewell Launches…" resolves to
"Magewell Electronics Co., Ltd." via its Magewell alias.
- New isStoryAboutClient gate: hard-accept at position 0, accept if any
editorial frame ("Product Spotlight:", "Review:", "First Look", …) appears
in the prefix, hard-reject if the prefix ends with a partner/usage phrase
("with", "using", "powered by", "dealer of", "integration with", "used",
"deploys", "runs on", "leverages", …), otherwise accept within a 32-char
subject window. Validated against 5,000 historical posts: 27 partner
false-positives blocked, 3 editorial-frame stories correctly saved, the
Magewell article now highlights.
PART B — restyling /about, /about/team, /about/contact:
- New .brand-gradient utility: #2563EB→#1E3A8A linear-gradient with a
16%-opacity diagonal sheen that sweeps in the first 30% of a 7s cycle
and rests offscreen-right for the rest. Respects prefers-reduced-motion
(band parked statically at 6% opacity).
- Team page: dark legacy hero (red radial, #ff5a55 eyebrows) replaced with
brand-gradient hero; outer text wrapper #e5e7eb → #0F172A so section
headings stop being white-on-white; all serif H1/H2/H3 → font-display;
red accents (#ff5a55 / #ff6b66 / rgba(214,7,1)) → blue (#93C5FD / #7DD3FC
/ rgba(29,78,216)).
- About page: H1 + Stat values → font-display; Stat cards get a brand-
gradient top stripe.
- Contact page: outer wrapper #e5e7eb → #0F172A (fixes the white-on-white
Contact H1); H1 gets explicit text-[#0F172A] + font-display; dark contact
cards keep dark bg but gain a brand-gradient top stripe + explicit
text-[#e5e7eb] body + brighter cyan eyebrow/link colors.
PART C — richer Industry News client highlight:
- ArticleFeed: client-promoted row swaps the static border-l-4 for an
absolute-positioned .brand-gradient strip on the left edge (sheen pulses
through). Row gets a slightly richer bg tint (from-#1D4ED8/12 via /4).
- HIGHLIGHT pill now uses .brand-gradient instead of the static blue chip.
Also shipping the earlier-staged work:
- AnimatedLogo onDark: white ring around tile + brighter (#E2E8F0) tagline
+ cyan accent rule for the blue header.
- Article-prose: em/strong/code dark colors (em fixes the trailing
copyright/trademark ghost text), hr line color, figcaption readable.
- ArticleComments: "Sign in to join the discussion" bar uses brand-gradient
+ white/outline buttons that read on blue.
- Forum: Discover/Following, Newest/Top Voted/Unanswered, Sign in to post,
Start a thread, Create account — slim pills, brand-gradient active.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 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.
Hit pages we didn't get the first pass: rss, gear, show-coverage,
articles/[slug], contributor, manufacturers, login, client-login, terms,
dashboard/show-calendar, and team-page derive helpers (domain + comment).
New ObfuscatedEmail client component splits user + domain into two data
attributes server-side, then assembles the mailto on mount. Pre-JS DOM
shows "[email protected]" placeholder; only after client-side hydration
does the real address render. Most simple email scrapers won't execute
JS or follow the data-u/data-d pattern, so addresses stay protected
while remaining one click away for humans.
Editorial persona emails derive from slug (firstname-lastname@broadcastbeat.com).
Ops persona emails (Chloe, Riley) come from pulsedesk.personas.email.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pulls from pulsedesk.personas (ops staff) and renders them as a second
section below the editorial team. Shows role, email, phone + ext.
Filtered to the company-wide RMP roles only (Chloe Delgado / Accounting,
Riley Park / Support) — not property-specific personas. Avatars fall
back to initials block until proper photos are added.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Featured-story card's right edge wasn't lining up with any of the
ad banners below or beside it on the homepage. Two root causes:
1. Pages I redesigned (/about, /about/contact, /about/team,
/about/advertise, /show-coverage/[slug]) used `max-w-6xl px-6`
(1152px / 24px-pad). Every other page uses `max-w-container
px-4` (1200px / 16px-pad). Pages didn't line up with the
header leaderboard or with each other.
2. ArticleFeed used a flexible 12-col grid where lg:col-span-4
ends up ~280px wide (depending on container) — so the 300x250
image inside the sidebar didn't extend to the column's right
edge, leaving a visual gap relative to the full-width Featured
card above.
Fix:
- All redesigned pages now use `max-w-container mx-auto px-4`.
- ArticleFeed switches to `lg:grid-cols-[1fr,300px]` so the sidebar
column is *exactly* 300px wide. The 300x250 ads fill that column
flush, so their right edge meets the container's right padding
edge — same x-position as the Featured card's right edge above.
Also linkified the "Relevant Media Properties" copyright string in
Footer.tsx → opens https://www.relevantmediaproperties.com/ in a new
tab.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Switch the bare single-column layouts on these pages to a two-column
grid that pulls in <SidebarAdStack /> on the right (pinned 300x600 +
every 300x250 rotated). Header keeps the leaderboard above. The
in-content 728x90 banners added earlier are removed since the sidebar
now carries the ad load (avoids stacking two of the same unit on the
page).
Pages updated:
- /show-coverage/[slug] event detail
- /about
- /about/contact
- /about/team
- /about/advertise (also gets a real-banner grid in "Available units":
the actual 728x90, 300x600, and 300x250 sample creatives are
rendered next to each unit's description, so advertisers see what
the inventory looks like in production rather than just a label).
The /about pages also got a small refresh: serif H1 + accent-blue
"Broadcast Beat" eyebrow line + bordered content blocks, bringing the
look closer to the cinematic homepage.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
/about/contact and /about/advertise were rendering bare <main> tags
with no site chrome at all — no header, no footer, no banners. Both
are now wrapped with the standard
<div className="min-h-screen bg-background"><Header />…<Footer /></div>
shell that the rest of the site uses, which auto-brings the site-wide
728x90 leaderboard with it.
/about/team already had Header+Footer but no in-content banner.
In addition to the header leaderboard, each of the three pages now
also renders one in-content 728x90 banner (gated on
ADS_728X90.length > 0, hidden on mobile to match the header banner's
display rules). This brings the about/* pages in line with the ad
inventory of /show-coverage and the other category landing pages.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the four accent-family hex codes site-wide with the teal palette
(keeps the dark theme; only swaps the accent family, not the dark base):
#3b82f6 (accent primary CTA) → #5B7C8D (teal) [839×]
#2563eb (accent-dark / hover) → #4A6473 (darker teal) [44×]
#60a5fa (info link, lighter) → #8FB0C3 (mid teal) [68×]
#1e3a5f (accent-muted bg) → #2F4F5F (navy) [44×]
tailwind.config.js tokens updated to match (accent/accent-dark/accent-muted).
Sweep also covers tailwind.css. 108 files touched. The dark base (#0d0d0d,
#111, #161616, #1a1a1a etc.) is intentionally untouched.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Header.tsx: bare linkedin/instagram/facebook URLs → /broadcastbeat handles; remove TwitterXIcon from social bar + import (Footer retains TwitterXIcon per "DO NOT OVERRIDE" marker)
- AboutDropdown.tsx: drop "Press kit" item (the page itself stays at /about/press-kit, just delisted from menu)
- SystemStatusBar.tsx: remove "Index online" pulse-dot and "N wire sources" span (keep articles count + events count + build version)
- /about, /about/team, /about/press-kit: wrap in Header+Footer (previously rendered bare <main>)
- /newsletter/page.tsx (new): redirect to /newsletter/archive — Header was 404'ing on /newsletter
- /rss/route.ts (new): dynamic RSS feed reading from legacy-source news section; replaces 404 at /rss
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>