AV deep sweep: account / news / marketplace placeholders + newsletter default tag + admin overview text + content-status & dashboard adops slug mappings (broadcast-beat → avbeat)
This commit is contained in:
@@ -774,7 +774,7 @@ export default function AccountPage() {
|
|||||||
<div className="flex items-center justify-between py-3 border-b border-[#222]">
|
<div className="flex items-center justify-between py-3 border-b border-[#222]">
|
||||||
<div>
|
<div>
|
||||||
<p className="font-body text-sm font-bold text-[#e0e0e0]">Email Newsletter</p>
|
<p className="font-body text-sm font-bold text-[#e0e0e0]">Email Newsletter</p>
|
||||||
<p className="font-body text-xs text-[#666] mt-0.5">Receive weekly broadcast industry news</p>
|
<p className="font-body text-xs text-[#666] mt-0.5">Receive weekly pro AV industry news</p>
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link
|
||||||
href="/home-page"
|
href="/home-page"
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ export default function AdOpsIOsPage() {
|
|||||||
</select>
|
</select>
|
||||||
<select value={filterSite} onChange={e => setFilterSite(e.target.value)} className="px-2 py-1 bg-[#111] border border-[#3a322b] rounded text-xs text-[#888] focus:outline-none">
|
<select value={filterSite} onChange={e => setFilterSite(e.target.value)} className="px-2 py-1 bg-[#111] border border-[#3a322b] rounded text-xs text-[#888] focus:outline-none">
|
||||||
<option value="">All Sites</option>
|
<option value="">All Sites</option>
|
||||||
{['avbeat','avbeat','backlotbeat','broadcastengineering'].map(s => <option key={s} value={s}>{s}</option>)}
|
{['avbeat','broadcastbeat','backlotbeat','broadcastengineering'].map(s => <option key={s} value={s}>{s}</option>)}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ export default function AdOpsDashboardPage() {
|
|||||||
<div className="flex gap-2 flex-wrap">
|
<div className="flex gap-2 flex-wrap">
|
||||||
<select value={filterSite} onChange={e => setFilterSite(e.target.value)} className="px-2 py-1 bg-[#111] border border-[#3a322b] rounded text-xs text-[#888] focus:outline-none">
|
<select value={filterSite} onChange={e => setFilterSite(e.target.value)} className="px-2 py-1 bg-[#111] border border-[#3a322b] rounded text-xs text-[#888] focus:outline-none">
|
||||||
<option value="">All Sites</option>
|
<option value="">All Sites</option>
|
||||||
{['avbeat','avbeat','backlotbeat','broadcastengineering'].map(s => <option key={s} value={s}>{s}</option>)}
|
{['avbeat','broadcastbeat','backlotbeat','broadcastengineering'].map(s => <option key={s} value={s}>{s}</option>)}
|
||||||
</select>
|
</select>
|
||||||
<select value={filterStatus} onChange={e => setFilterStatus(e.target.value)} className="px-2 py-1 bg-[#111] border border-[#3a322b] rounded text-xs text-[#888] focus:outline-none">
|
<select value={filterStatus} onChange={e => setFilterStatus(e.target.value)} className="px-2 py-1 bg-[#111] border border-[#3a322b] rounded text-xs text-[#888] focus:outline-none">
|
||||||
<option value="">All Statuses</option>
|
<option value="">All Statuses</option>
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ interface LaunchChecklist {
|
|||||||
// ─── Site labels ──────────────────────────────────────────────────────────────
|
// ─── Site labels ──────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
const SITE_LABELS: Record<string, { label: string; color: string; target: string }> = {
|
const SITE_LABELS: Record<string, { label: string; color: string; target: string }> = {
|
||||||
'broadcast-beat': { label: 'AV Beat', color: 'text-blue-400', target: '15–25/day' },
|
'avbeat': { label: 'AV Beat', color: 'text-blue-400', target: '15–25/day' },
|
||||||
'av-beat': { label: 'AV Beat', color: 'text-purple-400', target: '10–15/day' },
|
'av-beat': { label: 'AV Beat', color: 'text-purple-400', target: '10–15/day' },
|
||||||
'backlot-beat': { label: 'Backlot Beat', color: 'text-amber-400', target: '10–15/day' },
|
'backlot-beat': { label: 'Backlot Beat', color: 'text-amber-400', target: '10–15/day' },
|
||||||
'broadcast-engineering': { label: 'BroadcastEngineering.com', color: 'text-green-400', target: '10–15/day' },
|
'broadcast-engineering': { label: 'BroadcastEngineering.com', color: 'text-green-400', target: '10–15/day' },
|
||||||
@@ -124,7 +124,7 @@ function ChecklistItem({ label, done }: { label: string; done: boolean }) {
|
|||||||
type RMPSite = 'broadcast-beat' | 'av-beat' | 'backlot-beat' | 'broadcast-engineering';
|
type RMPSite = 'broadcast-beat' | 'av-beat' | 'backlot-beat' | 'broadcast-engineering';
|
||||||
|
|
||||||
function GeneratePanel({ onGenerated }: { onGenerated: () => void }) {
|
function GeneratePanel({ onGenerated }: { onGenerated: () => void }) {
|
||||||
const [site, setSite] = useState<RMPSite>('broadcast-beat');
|
const [site, setSite] = useState<RMPSite>('avbeat');
|
||||||
const [topic, setTopic] = useState('');
|
const [topic, setTopic] = useState('');
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [result, setResult] = useState<string | null>(null);
|
const [result, setResult] = useState<string | null>(null);
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ export default function AdminDashboardPage() {
|
|||||||
<div className="mb-8 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4">
|
<div className="mb-8 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4">
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-2xl font-display font-bold text-white">Admin Dashboard</h1>
|
<h1 className="text-2xl font-display font-bold text-white">Admin Dashboard</h1>
|
||||||
<p className="text-[#555] text-sm font-body mt-1">Overview of your broadcast platform</p>
|
<p className="text-[#555] text-sm font-body mt-1">Overview of your pro AV platform</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2 text-xs text-[#555] font-body">
|
<div className="flex items-center gap-2 text-xs text-[#555] font-body">
|
||||||
<svg className="w-3.5 h-3.5" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
|
<svg className="w-3.5 h-3.5" fill="none" stroke="currentColor" strokeWidth="2" viewBox="0 0 24 24">
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ interface Stats {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const PUBLICATIONS = [
|
const PUBLICATIONS = [
|
||||||
{ id: 'broadcast-beat', name: 'AV Beat', short: 'BB' },
|
{ id: 'avbeat', name: 'AV Beat', short: 'AVB' },
|
||||||
{ id: 'av-beat', name: 'AV Beat', short: 'AV' },
|
{ id: 'av-beat', name: 'AV Beat', short: 'AV' },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -316,7 +316,7 @@ export default function AccountPage() {
|
|||||||
onChange={(e) => setJobTitle(e.target.value)}
|
onChange={(e) => setJobTitle(e.target.value)}
|
||||||
required
|
required
|
||||||
className="w-full bg-[#1c1815] border border-white/20 rounded-lg px-3 py-2.5 text-white text-sm focus:outline-none focus:border-[#CC0000]"
|
className="w-full bg-[#1c1815] border border-white/20 rounded-lg px-3 py-2.5 text-white text-sm focus:outline-none focus:border-[#CC0000]"
|
||||||
placeholder="e.g. Senior Broadcast Engineer"
|
placeholder="e.g. Senior AV Integrator"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -347,7 +347,7 @@ export default function NewsPage({
|
|||||||
</div>
|
</div>
|
||||||
<div className="bg-[#0d1520] border border-[#412402] p-4">
|
<div className="bg-[#0d1520] border border-[#412402] p-4">
|
||||||
<h3 className="font-body font-bold text-xs text-[#F0A623] uppercase tracking-widest mb-2">Newsletter</h3>
|
<h3 className="font-body font-bold text-xs text-[#F0A623] uppercase tracking-widest mb-2">Newsletter</h3>
|
||||||
<p className="text-[#777] text-xs font-body mb-3">Get broadcast news delivered to your inbox every week.</p>
|
<p className="text-[#777] text-xs font-body mb-3">Get pro AV news delivered to your inbox every week.</p>
|
||||||
<Link href="/home-page#newsletter" className="btn-subscribe text-xs py-2 px-4 inline-block">Subscribe Free</Link>
|
<Link href="/home-page#newsletter" className="btn-subscribe text-xs py-2 px-4 inline-block">Subscribe Free</Link>
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ function NewsletterCard({ newsletter }: { newsletter: Newsletter }) {
|
|||||||
// ─── Signup CTA ────────────────────────────────────────────────────────────────
|
// ─── Signup CTA ────────────────────────────────────────────────────────────────
|
||||||
function SignupCTA() {
|
function SignupCTA() {
|
||||||
const [email, setEmail] = useState("");
|
const [email, setEmail] = useState("");
|
||||||
const [selected, setSelected] = useState<string[]>(["Broadcast"]);
|
const [selected, setSelected] = useState<string[]>(["Pro AV"]);
|
||||||
const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
|
const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
|
||||||
const [message, setMessage] = useState("");
|
const [message, setMessage] = useState("");
|
||||||
const formId = useId();
|
const formId = useId();
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ export default function PrivacyPage() {
|
|||||||
|
|
||||||
<section aria-labelledby="section-intro">
|
<section aria-labelledby="section-intro">
|
||||||
<p id="section-intro">
|
<p id="section-intro">
|
||||||
This Privacy Policy describes how <strong className="text-[#e0e0e0]">Relevant Media Properties, LLC</strong> ("we," "us," or "our"), publisher of AV Beat, AV Beat, Backlot Beat, and BroadcastEngineering.com, collects, uses, and shares information about you when you use our websites and services. We are committed to protecting your privacy and complying with applicable data protection laws including GDPR and CCPA.
|
This Privacy Policy describes how <strong className="text-[#e0e0e0]">Relevant Media Properties, LLC</strong> ("we," "us," or "our"), publisher of AV Beat, Broadcast Beat, and BroadcastEngineering.com, collects, uses, and shares information about you when you use our websites and services. We are committed to protecting your privacy and complying with applicable data protection laws including GDPR and CCPA.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user