diff --git a/src/app/about/team/page.tsx b/src/app/about/team/page.tsx index 0e5d8cb..adb6932 100644 --- a/src/app/about/team/page.tsx +++ b/src/app/about/team/page.tsx @@ -8,8 +8,8 @@ export const dynamic = "force-dynamic"; export const revalidate = 600; export const metadata = { - title: "Our team — Broadcast Beat", - description: "Meet the Broadcast Beat team — editorial staff plus accounts and support, covering broadcast, streaming, and post-production.", + title: "Our team — AV Beat", + description: "Meet the AV Beat team — editorial staff plus accounts and support, covering the convergence of pro AV and IT.", }; interface Persona { @@ -77,11 +77,11 @@ export default async function TeamPage() { .map((w) => w.charAt(0).toUpperCase()) .join(""); - // Derive @broadcastbeat.com email from the persona slug. Real mailboxes + // Derive @avbeat.com email from the persona slug. Real mailboxes // are set up centrally; this is the authoring address surfaced to readers. const editorialEmail = (p: Persona): { user: string; domain: string } | null => { if (!p.slug) return null; - return { user: p.slug.replace(/-/g, "."), domain: "broadcastbeat.com" }; + return { user: p.slug.replace(/-/g, "."), domain: "avbeat.com" }; }; const splitEmail = (email: string): { user: string; domain: string } | null => { diff --git a/src/app/articles/[slug]/ArticleDetailClient.tsx b/src/app/articles/[slug]/ArticleDetailClient.tsx index 9ff4cec..017034f 100644 --- a/src/app/articles/[slug]/ArticleDetailClient.tsx +++ b/src/app/articles/[slug]/ArticleDetailClient.tsx @@ -229,9 +229,9 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF {/* DO NOT OVERRIDE — article breadcrumb and back navigation */}
- Home + Home / - {sectionLabel} + {sectionLabel} / {article.title}
@@ -245,7 +245,7 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF {/* Article Header */}
- + {article.category} {article.date} @@ -271,7 +271,7 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF
+ className="font-heading font-bold text-sm hover:text-[#E67E22] transition-colors text-[#e0e0e0]"> {article.author}

{article.authorTitle}

@@ -281,12 +281,12 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF {(() => { const articleUrl = typeof window !== "undefined" ? window.location.href - : `https://broadcastbeat.com/articles/${article.slug}`; + : `https://avbeat.com/articles/${article.slug}`; return ( <> + className="flex items-center justify-center w-8 h-8 rounded-sm text-[#888] hover:text-[#E67E22] hover:bg-[#1a1a1a] transition-colors focus:outline-none focus-visible:ring-1 focus-visible:ring-[#E67E22]"> - @@ -320,7 +320,7 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF
@@ -368,7 +368,7 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF {article.tags.map((tag) => ( + className="px-3 py-1 text-xs font-body bg-[#1a1a1a] border border-[#2a2a2a] text-[#888] hover:border-[#E67E22] hover:text-[#E67E22] transition-colors rounded-sm cursor-default"> {tag} ))} @@ -380,7 +380,7 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF
+ className="inline-flex items-center gap-2 text-[#E67E22] font-body text-sm hover:underline focus:outline-none focus-visible:ring-1 focus-visible:ring-[#E67E22]"> @@ -398,7 +398,7 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF {/* Related Articles */} {/* DO NOT OVERRIDE — related articles sidebar */}
-

+

Related Articles

@@ -417,10 +417,10 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF />
-

+

{related.category}

-

+

{related.title}

@@ -435,19 +435,19 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF recently-active threads so the box is never empty. */} {relatedForumThreads.length > 0 && (
-

+

Related Forum Posts

    {relatedForumThreads.map((t) => (
  • -

    +

    {t.title}

    {t.category_name && ( - + {t.category_name} )} @@ -461,7 +461,7 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF

Browse all forum threads → @@ -479,7 +479,7 @@ export default function ArticleDetailClient({ article, relatedArticles, relatedF
+ className="fixed bottom-4 right-4 bg-[#1a1a1a] border border-[#E67E22] text-white px-4 py-3 rounded-sm text-sm font-body shadow-lg z-50"> {saveToast}
)} diff --git a/src/app/articles/[slug]/page.tsx b/src/app/articles/[slug]/page.tsx index 552b6d7..c55fcce 100644 --- a/src/app/articles/[slug]/page.tsx +++ b/src/app/articles/[slug]/page.tsx @@ -17,7 +17,7 @@ interface PageProps { } const SITE_URL = - process.env.NEXT_PUBLIC_SITE_URL || "https://broadcastbeat.com"; + process.env.NEXT_PUBLIC_SITE_URL || "https://avbeat.com"; function toIso(d: string | null | undefined): string { if (!d) return new Date().toISOString(); @@ -70,7 +70,7 @@ export async function generateMetadata({ params }: PageProps): Promise title: article.title, description: article.excerpt, images: [article.image], - creator: "@Broadcast Beat", + creator: "@AV Beat", }, }; } @@ -98,7 +98,7 @@ export default async function ArticlePage({ params }: PageProps) { author: { "@type": "Person", name: article.author }, publisher: { "@type": "Organization", - name: "Broadcast Beat", + name: "AV Beat", logo: { "@type": "ImageObject", url: `${SITE_URL}/assets/images/logo.png` }, }, datePublished: toIso(article.date), diff --git a/src/app/client-login/page.tsx b/src/app/client-login/page.tsx index 76400e3..03b643b 100644 --- a/src/app/client-login/page.tsx +++ b/src/app/client-login/page.tsx @@ -62,7 +62,7 @@ export default function ClientLoginPage() {
-

Broadcast Beat

+

AV Beat

Contributor Portal

diff --git a/src/app/contributor/page.tsx b/src/app/contributor/page.tsx index 82819f6..282b548 100644 --- a/src/app/contributor/page.tsx +++ b/src/app/contributor/page.tsx @@ -62,7 +62,7 @@ const AV_CATEGORIES = [ ]; const SITE_CONFIG = { - 1: { name: 'Broadcast Beat', badge: 'BB', color: '#0ea5e9', bgClass: 'bg-[#0ea5e9]/10', textClass: 'text-[#0ea5e9]', borderClass: 'border-[#0ea5e9]/30' }, + 1: { name: 'AV Beat', badge: 'BB', color: '#0ea5e9', bgClass: 'bg-[#0ea5e9]/10', textClass: 'text-[#0ea5e9]', borderClass: 'border-[#0ea5e9]/30' }, 2: { name: 'AV Beat', badge: 'AV', color: '#f97316', bgClass: 'bg-[#f97316]/10', textClass: 'text-[#f97316]', borderClass: 'border-[#f97316]/30' }, }; @@ -162,7 +162,7 @@ export default function ContributorDashboard() { }); const data = await res.json(); if (data.scope === 'broadcast' && data.confidence > 0.75) { - setScopeWarning('This content may be better suited for Broadcast Beat. AV Beat covers professional AV integration. Your post has been flagged for editorial review.'); + setScopeWarning('This content may be better suited for AV Beat. AV Beat covers professional AV integration. Your post has been flagged for editorial review.'); } else { setScopeWarning(null); } @@ -194,7 +194,7 @@ export default function ContributorDashboard() { const data = await res.json(); if (!res.ok) { if (data.blocked) { - showNotification('error', 'This post could not be submitted. Please contact the editorial team at editor@broadcastbeat.com for assistance.'); + showNotification('error', 'This post could not be submitted. Please contact the editorial team at editor@avbeat.com for assistance.'); } else { showNotification('error', data.error || 'Failed to submit post.'); } @@ -361,7 +361,7 @@ export default function ContributorDashboard() {
Publish To
{[ - { id: 1, name: 'Broadcast Beat', badge: 'BB', color: '#0ea5e9' }, + { id: 1, name: 'AV Beat', badge: 'BB', color: '#0ea5e9' }, { id: 2, name: 'AV Beat', badge: 'AV', color: '#f97316' }, ].map(site => (
@@ -316,11 +316,11 @@ export default function ShowCalendarPage() { onClick={() => setSiteFilter(s)} className={`px-3 py-1 rounded text-xs font-medium transition-colors ${ siteFilter === s - ? 'bg-[#3b82f6] text-white' + ? 'bg-[#E67E22] text-white' : 'bg-[#1a1a1a] text-[#888] hover:text-white border border-[#333]' }`} > - {s === '' ? 'All Sites' : s === '1' ? '🔵 Broadcast Beat' : '🟠 AV Beat'} + {s === '' ? 'All Sites' : s === '1' ? '🔵 AV Beat' : '🟠 AV Beat'} ))}
@@ -333,7 +333,7 @@ export default function ShowCalendarPage() { onClick={() => setActiveTab(tab.id)} className={`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px ${ activeTab === tab.id - ? 'border-[#3b82f6] text-white' + ? 'border-[#E67E22] text-white' : 'border-transparent text-[#666] hover:text-white' }`} > @@ -347,7 +347,7 @@ export default function ShowCalendarPage() {
{loadingData ? (
-
@@ -440,7 +440,7 @@ export default function ShowCalendarPage() { onClick={() => setQueueStatus(s)} className={`px-3 py-1 rounded text-xs font-medium transition-colors ${ queueStatus === s - ? 'bg-[#3b82f6] text-white' + ? 'bg-[#E67E22] text-white' : 'bg-[#1a1a1a] text-[#888] hover:text-white border border-[#333]' }`} > @@ -643,7 +643,7 @@ export default function ShowCalendarPage() {

Pen Name Rosters

-

Broadcast Beat (12 writers): 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

+

AV Beat (12 writers): 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

AV Beat (7 writers): Rex Chandler, Dana Flux, Derek Wainwright, Sloane Rigging, Chip Crosspoint, Blair Presenter, Jordan Lumen

@@ -689,7 +689,7 @@ export default function ShowCalendarPage() { onChange={e => setEditingEvent(prev => ({ ...prev, site_id: parseInt(e.target.value) }))} className="w-full bg-[#0a0a0a] border border-[#333] text-white text-sm rounded px-3 py-2" > - +
@@ -779,7 +779,7 @@ export default function ShowCalendarPage() { @@ -857,7 +857,7 @@ export default function ShowCalendarPage() { diff --git a/src/app/gear/page.tsx b/src/app/gear/page.tsx index 06a4df4..f0e8d8d 100644 --- a/src/app/gear/page.tsx +++ b/src/app/gear/page.tsx @@ -12,11 +12,11 @@ import SidebarAdStack from "@/components/SidebarAdStack"; export const revalidate = 1800; export const metadata: Metadata = { - title: "Production Gear & Reviews — Broadcast Beat", + title: "Production Gear & Reviews — AV Beat", description: "In-depth reviews and coverage of broadcast cameras, audio gear, production equipment, and professional media technology.", alternates: { canonical: "/gear" }, openGraph: { - title: "Production Gear & Reviews — Broadcast Beat", + title: "Production Gear & Reviews — AV Beat", description: "In-depth reviews and coverage of broadcast cameras, audio gear, production equipment, and professional media technology.", url: "/gear", type: "website", @@ -49,7 +49,7 @@ export default async function GearPage() { + className="bg-[#111] border border-[#222] overflow-hidden group hover:border-[#E67E22] transition-colors">
- + {article.category}
@@ -74,7 +74,7 @@ export default async function GearPage() { )} {article.readTime}
-

+

{article.title}

{article.excerpt}

diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 813fcaa..eaec529 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -53,7 +53,7 @@ function LoginInner() {
-

Sign in to Broadcast Beat

+

Sign in to AV Beat

Editor and admin access. Forum members can also sign in here.

@@ -77,7 +77,7 @@ function LoginInner() { onChange={(e) => setEmail(e.target.value)} autoComplete="email" required - className="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-3 py-2 text-white font-body text-sm focus:outline-none focus:border-[#3b82f6]" + className="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-3 py-2 text-white font-body text-sm focus:outline-none focus:border-[#E67E22]" />
@@ -90,19 +90,19 @@ function LoginInner() { onChange={(e) => setPassword(e.target.value)} autoComplete="current-password" required - className="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-3 py-2 text-white font-body text-sm focus:outline-none focus:border-[#3b82f6]" + className="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-3 py-2 text-white font-body text-sm focus:outline-none focus:border-[#E67E22]" />

PR firm / contributor?{' '} - + Use the contributor portal

diff --git a/src/app/manufacturers/[slug]/page.tsx b/src/app/manufacturers/[slug]/page.tsx index e9f9052..33b71af 100644 --- a/src/app/manufacturers/[slug]/page.tsx +++ b/src/app/manufacturers/[slug]/page.tsx @@ -105,13 +105,13 @@ export async function generateMetadata({ const { slug } = await params; const result = await loadManufacturer(slug); if (!result) { - return { title: "Manufacturer not found — Broadcast Beat" }; + return { title: "Manufacturer not found — AV Beat" }; } const { company } = result; - const title = `${company.company_name} — Manufacturer Profile | Broadcast Beat`; + const title = `${company.company_name} — Manufacturer Profile | AV Beat`; const description = (company.bio || "").slice(0, 200) || - `${company.company_name} is a broadcast industry manufacturer covered by Broadcast Beat.`; + `${company.company_name} is a broadcast industry manufacturer covered by AV Beat.`; return { title, description, @@ -119,7 +119,7 @@ export async function generateMetadata({ openGraph: { title, description, - url: `https://broadcastbeat.com/manufacturers/${slug}`, + url: `https://avbeat.com/manufacturers/${slug}`, type: "profile", ...(company.logo_url ? { images: [{ url: company.logo_url }] } : {}), }, @@ -206,7 +206,7 @@ export default async function ManufacturerProfile({ )} {company.phone && ( - + {company.phone} )} @@ -217,7 +217,7 @@ export default async function ManufacturerProfile({ href={company.company_website} target="_blank" rel="noopener noreferrer" - className="text-[#3b82f6] hover:underline" + className="text-[#E67E22] hover:underline" > Website ↗ @@ -227,7 +227,7 @@ export default async function ManufacturerProfile({ href={company.press_url} target="_blank" rel="noopener noreferrer" - className="text-[#3b82f6] hover:underline" + className="text-[#E67E22] hover:underline" > Newsroom ↗ @@ -237,7 +237,7 @@ export default async function ManufacturerProfile({ href={company.contact_url} target="_blank" rel="noopener noreferrer" - className="text-[#3b82f6] hover:underline" + className="text-[#E67E22] hover:underline" > Contact ↗ @@ -247,7 +247,7 @@ export default async function ManufacturerProfile({ href={company.linkedin_url} target="_blank" rel="noopener noreferrer" - className="text-[#888] hover:text-[#3b82f6]" + className="text-[#888] hover:text-[#E67E22]" > LinkedIn @@ -257,7 +257,7 @@ export default async function ManufacturerProfile({ href={`https://twitter.com/${company.twitter_handle}`} target="_blank" rel="noopener noreferrer" - className="text-[#888] hover:text-[#3b82f6]" + className="text-[#888] hover:text-[#E67E22]" > X / Twitter @@ -306,7 +306,7 @@ export default async function ManufacturerProfile({ href={e.linkedin_url} target="_blank" rel="noopener noreferrer" - className="text-[11px] text-[#3b82f6] hover:underline" + className="text-[11px] text-[#E67E22] hover:underline" > LinkedIn ↗ @@ -328,14 +328,14 @@ export default async function ManufacturerProfile({ )} {company.phone && ( )} {company.contact_email && ( @@ -401,7 +401,7 @@ export default async function ManufacturerProfile({

Recent coverage

- + All stories →
@@ -410,7 +410,7 @@ export default async function ManufacturerProfile({ {/* Image fallback cascade — Ryan rule: never show an empty gray box on a coverage card. Falls through: @@ -423,7 +423,7 @@ export default async function ManufacturerProfile({ loading="lazy" />
-

+

{r.title}

{r.wp_published_at && ( @@ -447,7 +447,7 @@ export default async function ManufacturerProfile({ {p.slug ? ( {p.title} @@ -466,7 +466,7 @@ export default async function ManufacturerProfile({ )}