"use client"; import { useEffect, useRef, useState, type CSSProperties } from "react"; import { AD_TIP_DELAY_MS, adHoverTip } from "@/lib/ads"; type AdTextProps = { title: string; textColor?: string; bgColor?: string; href?: string; /** 广告到期时间(ISO 字符串):有值时气泡首行展示,无值时仅显示免责声明 */ endsAt?: string | null; className?: string; }; /** * 文字广告:仅当文字宽度超出容器时才启用跑马灯滚动, * 能完整显示时居中静止。结构与样式复用侧栏 .j13-ad-text。 */ export function AdText({ title, textColor, bgColor, href, endsAt, className = "", }: AdTextProps) { const trackRef = useRef(null); const [overflow, setOverflow] = useState(false); useEffect(() => { const track = trackRef.current; if (!track) return; const measure = () => { const run = track.querySelector(".j13-ad-text-run"); const container = track.parentElement; if (!run || !container) return; setOverflow(run.scrollWidth > container.clientWidth); }; measure(); window.addEventListener("resize", measure); return () => window.removeEventListener("resize", measure); }, [title]); const cls = `j13-ad-text${overflow ? " is-overflow" : ""}${className ? ` ${className}` : ""}`; const style: CSSProperties = { color: textColor, background: bgColor }; // 气泡首行:到期时间;第二行:免责声明 const tip = adHoverTip(endsAt); const inner = ( {title} {overflow ? ( {title} ) : null} ); if (href) { return ( {inner} ); } return ( {inner} ); } export default AdText;