footer: surface RMP lockup next to RMP mention (light/dark-aware RmpMark)

This commit is contained in:
2026-06-16 00:46:48 +00:00
parent f1e582610b
commit b9621ede1a
2 changed files with 136 additions and 3 deletions

View File

@@ -2,6 +2,7 @@ import React from "react";
import Link from "next/link";
import AppImage from "@/components/ui/AppImage";
import AnimatedLogo from "@/components/AnimatedLogo";
import RmpMark from "@/components/RmpMark";
import {
LinkedInIcon,
InstagramIcon,
@@ -137,14 +138,17 @@ export default function Footer() {
<div className="flex items-center gap-4 text-xs font-body text-[#475569]">
<Link href="/privacy" className="hover:text-[#1D4ED8] transition-colors">Privacy Policy</Link>
<Link href="/terms" className="hover:text-[#1D4ED8] transition-colors">Terms of Service</Link>
<span>
© 2026 <a
<span className="inline-flex items-center gap-2 flex-wrap">
© 2026{' '}
<a
href="https://www.relevantmediaproperties.com/"
target="_blank"
rel="noopener noreferrer"
className="hover:text-[#1D4ED8] transition-colors underline-offset-2 hover:underline">
Relevant Media Properties
</a>. All rights reserved.
</a>
<RmpMark mode="dark" height={20} />
. All rights reserved.
</span>
</div>
</div>

129
src/components/RmpMark.tsx Normal file
View File

@@ -0,0 +1,129 @@
import React from 'react';
/**
* RmpMark — compact static "Relevant Media Properties" lockup placed
* inline next to any RMP text mention on a property site.
*
* Variants:
* mode="light" → for placement on dark backgrounds (BB, BE, SMB, TCG footers)
* mode="dark" → for placement on light backgrounds (AV footer, white pages)
*
* Mirrors the geometry of the canonical RelevantMediaPropertiesLogo on the
* RMP site but ships a fully static inline SVG (no JS, no animation) so it
* works inside React Server Components and email-template renders.
*
* Link target is always the public RMP homepage.
*/
export type RmpMarkMode = 'light' | 'dark';
interface RmpMarkProps {
/** 'light' = light wordmark on dark bg; 'dark' = dark wordmark on light bg. */
mode?: RmpMarkMode;
/** Vertical size in px. Width is auto via SVG aspect ratio. Default 22. */
height?: number;
/** Extra wrapper classes. Wrapper is inline-flex by default. */
className?: string;
/** Override the link href — defaults to the RMP homepage. */
href?: string;
/** Hide the link wrapper (renders just the SVG). */
asImage?: boolean;
}
export default function RmpMark({
mode = 'light',
height = 22,
className = '',
href = 'https://relevantmediaproperties.com',
asImage = false,
}: RmpMarkProps) {
const inkColor = mode === 'light' ? '#F4F6FF' : '#0A0A0A';
const accent = '#D60701';
const VB_W = 220;
const VB_H = 44;
const CELL = 9.5;
const GAP = 1.5;
const TOTAL_GRID = 3 * CELL + 2 * GAP;
const GRID_Y = (VB_H - TOTAL_GRID) / 2;
const WM_X = TOTAL_GRID + 10;
const ACCENT_SET = new Set<string>(['0-2', '2-0']);
const cells: { id: string; x: number; y: number; isAccent: boolean }[] = [];
for (let r = 0; r < 3; r++) {
for (let c = 0; c < 3; c++) {
const id = `${r}-${c}`;
cells.push({
id,
x: c * (CELL + GAP),
y: r * (CELL + GAP),
isAccent: ACCENT_SET.has(id),
});
}
}
const svg = (
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox={`0 0 ${VB_W} ${VB_H}`}
height={height}
width="auto"
preserveAspectRatio="xMinYMid meet"
role="img"
aria-label="Relevant Media Properties"
style={{ display: 'inline-block', verticalAlign: 'middle' }}
>
<g transform={`translate(0, ${GRID_Y})`}>
{cells.map((c) => (
<rect
key={c.id}
x={c.x}
y={c.y}
width={CELL}
height={CELL}
rx="0.5"
ry="0.5"
fill={c.isAccent ? accent : inkColor}
/>
))}
</g>
<g transform={`translate(${WM_X}, 0)`}>
<text
x="0"
y="22"
fill={inkColor}
fontFamily="'Inter','SF Pro Display',system-ui,-apple-system,sans-serif"
fontWeight="800"
fontSize="17"
letterSpacing="-0.4"
>
RELEVANT
</text>
<text
x="0"
y="34"
fill={accent}
fontFamily="'Inter','SF Pro Display',system-ui,-apple-system,sans-serif"
fontWeight="700"
fontSize="7"
letterSpacing="3.4"
>
MEDIA PROPERTIES
</text>
</g>
</svg>
);
if (asImage) return svg;
return (
<a
href={href}
target={href.startsWith('http') ? '_blank' : undefined}
rel={href.startsWith('http') ? 'noopener noreferrer' : undefined}
aria-label="Visit Relevant Media Properties"
className={`inline-flex items-center align-middle opacity-90 hover:opacity-100 transition-opacity ${className}`}
style={{ lineHeight: 0 }}
>
{svg}
</a>
);
}