diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index 8a5ca09..804147a 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -57,7 +57,7 @@ export default function AboutPage() { For editorial pitches: editor@avbeat.com. - {" "}For advertising: see the media kit. + {" "}For advertising: see the media kit. {" "}For our team: meet the editorial team. diff --git a/src/app/about/team/page.tsx b/src/app/about/team/page.tsx index 0969e7d..267633c 100644 --- a/src/app/about/team/page.tsx +++ b/src/app/about/team/page.tsx @@ -77,6 +77,15 @@ export default async function TeamPage() { .map((w) => w.charAt(0).toUpperCase()) .join(""); + // Format an E.164 US number as (XXX) XXX-XXXX. Falls back to the raw + // string for international or non-standard inputs. + const formatPhone = (raw: string): string => { + const digits = raw.replace(/[^0-9]/g, ""); + const local = digits.startsWith("1") && digits.length === 11 ? digits.slice(1) : digits; + if (local.length !== 10) return raw; + return `(${local.slice(0, 3)}) ${local.slice(3, 6)}-${local.slice(6)}`; + }; + // 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 => { @@ -242,8 +251,8 @@ export default async function TeamPage() { })()} {p.phone && (
- - {p.phone}{p.extension ? ` ext. ${p.extension}` : ''} + + {formatPhone(p.phone)}{p.extension ? `, Ext. ${p.extension}` : ''}
)} diff --git a/src/app/manufacturers/DirectoryClient.tsx b/src/app/manufacturers/DirectoryClient.tsx index c9f8ec4..16be752 100644 --- a/src/app/manufacturers/DirectoryClient.tsx +++ b/src/app/manufacturers/DirectoryClient.tsx @@ -102,15 +102,6 @@ export default function ManufacturerDirectoryClient({ > All shows ({manufacturers.length.toLocaleString()}) - {shows.map((s) => { const count = showCounts[s.slug] || 0; const active = showFilter === s.slug; @@ -184,18 +175,17 @@ export default function ManufacturerDirectoryClient({ {m.company_name}
- {m.exhibits_nab && ( - - 2026 NAB Show - - )} - {m.exhibits_ibc && ( - - IBC 2026 - - )} + {(m.shows_attending || []).slice(0, 3).map((slug) => { + const ev = shows.find((s) => s.slug === slug); + if (!ev) return null; + return ( + + {ev.short_name || ev.name} + + ); + })} {m.featured && ( - + Featured )} diff --git a/src/app/manufacturers/page.tsx b/src/app/manufacturers/page.tsx index ec698ef..f4dafb0 100644 --- a/src/app/manufacturers/page.tsx +++ b/src/app/manufacturers/page.tsx @@ -10,12 +10,12 @@ export const revalidate = 1800; export const metadata: Metadata = { title: "AV Integration Manufacturers — AV Beat", description: - "Browse 1,000+ broadcast, post-production, and live-production manufacturers exhibiting at NAB Show and IBC. Find vendor profiles, booth numbers, product categories, and the latest news from each company.", + "Browse the AV industry — pro AV, display, signage, live-production, and integration manufacturers exhibiting at InfoComm, CEDIA Expo, ISE, DSE, and more. Vendor profiles, booth numbers, product categories, and the latest news from each company.", alternates: { canonical: "/manufacturers" }, openGraph: { title: "AV Integration Manufacturers — AV Beat", description: - "Comprehensive directory of broadcast industry manufacturers, exhibitors, and vendors.", + "Comprehensive directory of pro AV, display, and integration manufacturers, exhibitors, and vendors.", type: "website", url: "https://avbeat.com/manufacturers", }, @@ -68,8 +68,19 @@ export default async function ManufacturersIndex() { const list = (data || []) as ManufacturerRow[]; const events = (eventsData || []) as ShowOption[]; - const nabCount = list.filter((m) => m.exhibits_nab).length; - const ibcCount = list.filter((m) => m.exhibits_ibc).length; + // Per-show exhibitor counts pulled from the same shows_attending array + // the DirectoryClient uses for its filter chips. Lets the intro line + // surface the BIGGEST show counts dynamically rather than hardcoding + // any particular event. + const showCounts = list.reduce>((m, row) => { + for (const s of row.shows_attending || []) m[s] = (m[s] || 0) + 1; + return m; + }, {}); + const topShows = events + .map((e) => ({ event: e, count: showCounts[e.slug] || 0 })) + .filter((x) => x.count > 0) + .sort((a, b) => b.count - a.count) + .slice(0, 3); return (
@@ -80,10 +91,10 @@ export default async function ManufacturersIndex() { AV Integration Manufacturers

- {list.length.toLocaleString()} broadcast, post-production, and live-production - manufacturers - {nabCount > 0 && <> · {nabCount.toLocaleString()} exhibiting at NAB Show 2026} - {ibcCount > 0 && <> · {ibcCount.toLocaleString()} at IBC}. + {list.length.toLocaleString()} pro AV, display, signage, and integration manufacturers + {topShows.map(({ event, count }) => ( + · {count.toLocaleString()} at {event.short_name || event.name} + ))}.

{error && (