/* global React */ /* HeroPuzzleLabels — overlays four labels with leader lines on top of the puzzle hero image. Each label fades in sequentially after page load. Coordinates are expressed as percentages of the puzzle image (1856×2304), so they scale with the image regardless of its rendered width. */ const { useEffect: hpl_useEffect, useState: hpl_useState } = React; function HeroPuzzleLabels() { const [shown, setShown] = hpl_useState(false); hpl_useEffect(() => { const t = setTimeout(() => setShown(true), 350); return () => clearTimeout(t); }, []); // Label positions: // anchor: dot on the puzzle tile (% of image) // text: label position (% of image) // The leader line runs from anchor to text. // Coordinates tuned to screens/hero-puzzle.png (1299×1613). // Variant A: labels sit close to their anchor points — short leader lines, // tight composition. const labels = [ { key: 'seo', anchorX: 38, anchorY: 18, textX: 26, textY: 11, title: 'SEO', sub: 'AI search', align: 'right', delay: 0, }, { key: 'plan', anchorX: 76, anchorY: 32, textX: 88, textY: 26, title: 'Patient intent', sub: '90-day plan', align: 'left', delay: 220, }, { key: 'review', anchorX: 28, anchorY: 52, textX: 16, textY: 46, title: 'Doctor-reviewed', sub: 'FTC-aware claims', align: 'right', delay: 440, }, { key: 'wins', anchorX: 72, anchorY: 76, textX: 84, textY: 70, title: 'Quick wins', sub: 'Patient-ready article', align: 'left', delay: 660, }, ]; const ACCENT = 'var(--accent-500, #14a098)'; const INK = 'var(--neutral-fg, #0f2832)'; const INK_SOFT = 'var(--neutral-fg-soft, #5a6b73)'; return (