import type { LinkPreview } from "../../types/post"; const LINK_ACCENT = "#eeb726"; const DOMAIN_ACCENT_OVERRIDES: Array<[string, string]> = [ // Tencent Meeting returns themeColor="#000000", which disappears on the // dark bubble surface. Keep it consistent with inline link color instead. ["meeting.tencent.com", LINK_ACCENT], ]; function linkPreviewAccent(preview: LinkPreview): string { const url = preview.canonicalUrl || preview.url; try { const host = new URL(url).hostname.replace(/^www\./, ""); const match = DOMAIN_ACCENT_OVERRIDES.find( ([domain]) => host === domain || host.endsWith(`.${domain}`), ); if (match) return match[1]; } catch { // Ignore malformed preview URLs and fall back below. } return preview.themeColor || LINK_ACCENT; } /** * Telegram-style rich preview card for a single URL embedded in a post. * * Renders an accent bar on the left, then site name → title → description, * with an optional thumbnail at the bottom. The whole card is one anchor * that opens `canonicalUrl` in a new tab. */ export function LinkPreviewCard({ preview }: { preview: LinkPreview }) { const accent = linkPreviewAccent(preview); const hasUsefulText = preview.title.length > 0 || preview.description.length > 0; if (!hasUsefulText && !preview.imageUrl) return null; return (
{preview.siteName ? (
{preview.siteName}
) : null} {preview.title ? (
{preview.title}
) : null} {preview.description ? (
{preview.description}
) : null} {preview.imageUrl ? (
) : null}
); }