// v5 — Featured showcase (single hero case study)
// Replaces multi-card "Recent Work" with one carefully composed showcase:
//   · inline video player as primary action (watch the film)
//   · strategy laid out on the right (unstable idea · audience · system)
//   · orthogonal artifact tiles below (brand · DS · dashboard · mobile · research)
//   · "See the full case study" as the secondary action

const FEATURED = {
  slug: "outdoorsy",
  client: "Outdoorsy",
  year: "2022–24",
  role: "Host platform · brand · cross-platform design system",
  title: "A category-defining platform rebuilt around the people who make it possible.",
  film: {
    duration: "3:42",
    chapters: [
    { t: "00:00", label: "Cold open · the host" },
    { t: "00:42", label: "The unstable idea" },
    { t: "01:18", label: "Audience problem" },
    { t: "02:05", label: "The system" },
    { t: "03:08", label: "Artifacts" }]

  },
  href: "showcase.html",
  strategy: [
  {
    id: "unstable",
    label: "The unstable idea",
    body: "A marketplace whose supply side — the hosts — wasn't centered anywhere in the brand or the product. Growth depended on them, but the experience didn't feel built for them."
  },
  {
    id: "audience",
    label: "The audience problem",
    body: "Hosts running real businesses on the platform, plus the internal product, design, and engineering teams who had been shipping out of separate playbooks across Android, iOS, and web."
  },
  {
    id: "system",
    label: "The system I shaped",
    body: "A warmer host-centered brand refresh, a cross-platform design system with shared tokens and patterns, and prototyped host tooling — delivered as DRI inside the team, not next to it."
  }],

  artifacts: [
  { id: "brand", label: "Brand refresh", note: "Photography · Art Direction · Voice", kind: "brand", img: "src/assets/od-art-1-brand.jpg" },
  { id: "system", label: "Design system", note: "Tokens · components · docs", kind: "system", img: "src/assets/od-art-2-system.jpg" },
  { id: "dashboard", label: "Host dashboard", note: "Earnings · reservations", kind: "dashboard", img: "src/assets/od-art-3-dashboard.jpg" },
  { id: "mobile", label: "Mobile experience", note: "iOS · Android · parity", kind: "mobile", img: "src/assets/od-art-4-mobile.jpg" },
  { id: "research", label: "Host research", note: "Field · diary · interviews", kind: "research", img: "src/assets/od-art-5-research.jpg" }]

};

// =====================================================================
// FILM POSTER — bespoke SVG for the inline video player
// Outdoorsy mood: mountain road, RV, copper sun, dusty grain
// =====================================================================
const V5FilmPoster = () =>
<svg viewBox="0 0 1280 800" preserveAspectRatio="xMidYMid slice" aria-hidden="true" className="v5-ft-poster-svg">
    <defs>
      <linearGradient id="v5ft-sky" x1="0" y1="0" x2="0" y2="1">
        <stop offset="0%" stopColor="#cdb38a" />
        <stop offset="55%" stopColor="#b69772" />
        <stop offset="100%" stopColor="#8a7459" />
      </linearGradient>
      <linearGradient id="v5ft-mtn" x1="0" y1="0" x2="0" y2="1">
        <stop offset="0%" stopColor="#3a3a36" />
        <stop offset="100%" stopColor="#1a1f1c" />
      </linearGradient>
      <linearGradient id="v5ft-mid" x1="0" y1="0" x2="0" y2="1">
        <stop offset="0%" stopColor="#3f4b3c" />
        <stop offset="100%" stopColor="#243027" />
      </linearGradient>
      <linearGradient id="v5ft-near" x1="0" y1="0" x2="0" y2="1">
        <stop offset="0%" stopColor="#1f2820" />
        <stop offset="100%" stopColor="#0d120e" />
      </linearGradient>
      <radialGradient id="v5ft-sun" cx="50%" cy="50%" r="50%">
        <stop offset="0%" stopColor="#f0c98a" stopOpacity="0.9" />
        <stop offset="55%" stopColor="#d09360" stopOpacity="0.4" />
        <stop offset="100%" stopColor="#d09360" stopOpacity="0" />
      </radialGradient>
      <filter id="v5ft-grain" x="0" y="0" width="100%" height="100%">
        <feTurbulence type="fractalNoise" baseFrequency="0.9" numOctaves="2" />
        <feColorMatrix values="0 0 0 0 0.18  0 0 0 0 0.16  0 0 0 0 0.13  0 0 0 0.25 0" />
        <feComposite in2="SourceGraphic" operator="in" />
      </filter>
    </defs>

    {/* Sky */}
    <rect width="1280" height="800" fill="url(#v5ft-sky)" />

    {/* Sun haze */}
    <circle cx="960" cy="260" r="320" fill="url(#v5ft-sun)" />

    {/* Far mountain range */}
    <path d="M 0 360 L 120 250 L 220 320 L 340 180 L 460 280 L 560 220 L 720 300 L 820 180 L 940 290 L 1080 230 L 1280 320 L 1280 500 L 0 500 Z" fill="url(#v5ft-mtn)" opacity="0.95" />
    {/* Snow caps */}
    <path d="M 340 180 L 360 200 L 380 195 L 400 215 L 380 220 L 360 215 Z" fill="#e6dccb" opacity="0.7" />
    <path d="M 820 180 L 840 200 L 860 195 L 870 220 L 840 215 Z" fill="#e6dccb" opacity="0.65" />

    {/* Mid ridge with pines */}
    <path d="M 0 460 L 180 380 L 320 440 L 480 360 L 640 430 L 820 370 L 980 440 L 1160 380 L 1280 420 L 1280 600 L 0 600 Z" fill="url(#v5ft-mid)" />

    {/* Pine silhouettes — left foreground */}
    {[
  [60, 420, 110], [120, 440, 90], [180, 405, 130], [240, 430, 100],
  [40, 480, 95], [150, 500, 105]].
  map(([x, y, h], i) =>
  <path key={`pl-${i}`} d={`M ${x} ${y} L ${x - 22} ${y + h} L ${x + 22} ${y + h} Z M ${x - 15} ${y + h * 0.55} L ${x - 30} ${y + h * 0.85} L ${x + 30} ${y + h * 0.85} L ${x + 15} ${y + h * 0.55} Z`} fill="#0d150e" opacity="0.92" />
  )}

    {/* Lake reflection — water surface */}
    <rect x="0" y="490" width="1280" height="60" fill="#3b4a3e" opacity="0.55" />
    <rect x="0" y="500" width="1280" height="3" fill="#cdb38a" opacity="0.18" />
    <rect x="0" y="520" width="1280" height="2" fill="#cdb38a" opacity="0.12" />

    {/* Near foreground hillside */}
    <path d="M 0 540 L 200 510 L 420 560 L 640 525 L 880 580 L 1100 540 L 1280 600 L 1280 800 L 0 800 Z" fill="url(#v5ft-near)" />

    {/* Road — single asphalt ribbon curving toward horizon */}
    <path d="M 460 800 Q 560 700 600 600 Q 640 540 660 510 L 700 510 Q 700 540 760 600 Q 860 700 1000 800 Z" fill="#2a2e2a" />
    {/* Road dashed center line */}
    {[680, 720, 760, 800].map((y, i) =>
  <rect key={`r-${i}`} x={678 - i * 4} y={y} width={6 + i * 1.5} height={i < 2 ? 18 : 22} fill="#d8b66a" opacity="0.85" />
  )}

    {/* RV silhouette on the road, slightly off-center */}
    <g transform="translate(630, 555)">
      <rect x="0" y="0" width="78" height="36" rx="3" fill="#e8dfcf" />
      <rect x="58" y="-12" width="22" height="14" fill="#e8dfcf" />
      <rect x="6" y="6" width="14" height="10" fill="#7a8378" />
      <rect x="26" y="6" width="14" height="10" fill="#7a8378" />
      <rect x="46" y="6" width="14" height="10" fill="#7a8378" />
      <circle cx="16" cy="38" r="5" fill="#0d100c" />
      <circle cx="60" cy="38" r="5" fill="#0d100c" />
    </g>

    {/* Atmosphere grain overlay */}
    <rect width="1280" height="800" fill="#000" opacity="0.08" />
    <rect width="1280" height="800" filter="url(#v5ft-grain)" opacity="0.25" />

    {/* Editorial wordmark — top-left */}
    <text x="80" y="160" fontFamily="Newsreader, Georgia, serif" fontStyle="italic" fontWeight="500" fontSize="92" fill="#f4ead4" letterSpacing="-2">Outdoorsy</text>
    <text x="84" y="200" fontFamily="JetBrains Mono, monospace" fontSize="11" letterSpacing="4" fill="rgba(244,234,212,0.85)">THE ROAD IS CALLING. YOU'RE THE REASON.</text>

    {/* Slate corner — film metadata */}
    <g transform="translate(80, 700)">
      <rect width="160" height="60" fill="rgba(13,16,12,0.55)" />
      <text x="14" y="22" fontFamily="JetBrains Mono, monospace" fontSize="9" letterSpacing="2.5" fill="rgba(244,234,212,0.85)">CASE FILM · A-ROLL</text>
      <text x="14" y="42" fontFamily="JetBrains Mono, monospace" fontSize="9" letterSpacing="2.5" fill="rgba(244,234,212,0.6)">DIR · CHRIS ZNEROLD</text>
      <text x="14" y="55" fontFamily="JetBrains Mono, monospace" fontSize="9" letterSpacing="2.5" fill="rgba(244,234,212,0.6)">RUN · 3:42</text>
    </g>

    {/* Built by hosts circular stamp — bottom-right */}
    <g transform="translate(1090, 660)">
      <circle r="74" fill="none" stroke="#c0563b" strokeWidth="1.2" opacity="0.95" />
      <circle r="62" fill="none" stroke="#c0563b" strokeWidth="0.5" opacity="0.7" />
      <defs>
        <path id="v5ft-stamp" d="M 0,0 m -56,0 a 56,56 0 1,1 112,0 a 56,56 0 1,1 -112,0" />
      </defs>
      <text fill="#c0563b" fontFamily="JetBrains Mono, monospace" fontSize="9" letterSpacing="4">
        <textPath href="#v5ft-stamp" startOffset="0">BUILT BY HOSTS · POWERED BY COMMUNITY · BUILT BY HOSTS · </textPath>
      </text>
      <path d="M -16 6 L 0 -18 L 16 6 Z M -8 6 L 0 -8 L 8 6 Z" fill="#c0563b" />
    </g>
  </svg>;


// =====================================================================
// ARTIFACT TILE — small thumbnail used in the orthogonal row below
// =====================================================================
const V5ArtifactTile = ({ kind }) => {
  if (kind === "brand") return (
    <svg viewBox="0 0 200 140" aria-hidden="true">
      <rect width="200" height="140" fill="#243027" />
      <text x="100" y="84" textAnchor="middle" fontFamily="Newsreader, Georgia, serif" fontStyle="italic" fontWeight="500" fontSize="34" fill="#e8dfcf">Outdoorsy</text>
      <line x1="68" y1="96" x2="132" y2="96" stroke="#c0563b" strokeWidth="0.6" />
    </svg>);

  if (kind === "system") return (
    <svg viewBox="0 0 200 140" aria-hidden="true">
      <rect width="200" height="140" fill="#efe8d8" />
      <text x="100" y="64" textAnchor="middle" fontFamily="Newsreader, Georgia, serif" fontSize="36" fill="#243027">Aa</text>
      {["#243027", "#5a7458", "#c0563b", "#d9b16a", "#1a1f1c"].map((c, i) =>
      <circle key={i} cx={50 + i * 25} cy={100} r="8.5" fill={c} />
      )}
    </svg>);

  if (kind === "dashboard") return (
    <svg viewBox="0 0 200 140" aria-hidden="true">
      <rect width="200" height="140" fill="#f6f1e6" />
      <rect x="14" y="14" width="172" height="112" fill="#fff" stroke="#d8cdb4" strokeWidth="0.5" />
      <text x="22" y="32" fontFamily="Newsreader, Georgia, serif" fontStyle="italic" fontSize="11" fill="#243027">Outdoorsy</text>
      <line x1="22" y1="40" x2="178" y2="40" stroke="#e6dcc1" strokeWidth="0.5" />
      <rect x="22" y="50" width="44" height="14" fill="none" stroke="#c0563b" strokeWidth="0.6" />
      <text x="44" y="60" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="6" fill="#243027">$8,420</text>
      <rect x="74" y="50" width="44" height="14" fill="none" stroke="#d8cdb4" strokeWidth="0.5" />
      <rect x="126" y="50" width="44" height="14" fill="none" stroke="#d8cdb4" strokeWidth="0.5" />
      <polyline points="22,108 50,96 78,100 106,84 134,90 162,72 178,76" fill="none" stroke="#5a7458" strokeWidth="1.2" />
      <line x1="22" y1="118" x2="178" y2="118" stroke="#e6dcc1" strokeWidth="0.4" />
    </svg>);

  if (kind === "mobile") return (
    <svg viewBox="0 0 200 140" aria-hidden="true">
      <rect width="200" height="140" fill="#1a1f1c" />
      <g transform="translate(56, 16)">
        <rect x="0" y="0" width="40" height="108" rx="4" fill="#243027" stroke="#3a4a3c" strokeWidth="0.5" />
        <rect x="3" y="3" width="34" height="102" fill="#efe8d8" />
        <rect x="6" y="10" width="28" height="16" fill="#c0563b" />
        <text x="20" y="19" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="5" fill="#fff">SUMMIT</text>
        <line x1="6" y1="32" x2="34" y2="32" stroke="#d8cdb4" strokeWidth="0.3" />
        <rect x="6" y="36" width="14" height="3" fill="#243027" />
        <rect x="6" y="42" width="22" height="3" fill="#a8a094" />
        <rect x="6" y="48" width="18" height="3" fill="#a8a094" />
        <rect x="6" y="90" width="28" height="9" fill="#c0563b" />
      </g>
      <g transform="translate(104, 16)">
        <rect x="0" y="0" width="40" height="108" rx="4" fill="#243027" stroke="#3a4a3c" strokeWidth="0.5" />
        <rect x="3" y="3" width="34" height="102" fill="#efe8d8" />
        <rect x="6" y="10" width="28" height="3" fill="#243027" />
        {[18, 24, 30, 36, 42, 48].map((y, i) =>
        <rect key={i} x="6" y={y} width={20 - i * 2} height="2" fill="#a8a094" />
        )}
        <rect x="6" y="56" width="28" height="28" fill="#5a7458" />
        <rect x="6" y="90" width="28" height="9" fill="#243027" />
      </g>
    </svg>);

  if (kind === "research") return (
    <svg viewBox="0 0 200 140" aria-hidden="true">
      <rect width="200" height="140" fill="#0f1612" />
      {[0, 1, 2].map((col) =>
      <g key={col} transform={`translate(${10 + col * 64}, 18)`}>
          <rect x="0" y="0" width="56" height="48" fill="#243027" />
          {/* Stylized portrait — head + shoulders */}
          <circle cx="28" cy="22" r="9" fill="#3a4a3c" />
          <path d="M 12 48 Q 12 36 28 36 Q 44 36 44 48 Z" fill="#3a4a3c" />
          <rect x="0" y="56" width="56" height="38" fill="#5a7458" opacity="0.7" />
          <path d="M 0 90 L 18 78 L 30 84 L 56 70 L 56 94 L 0 94 Z" fill="#1a1f1c" />
        </g>
      )}
      <text x="14" y="124" fontFamily="JetBrains Mono, monospace" fontSize="7" letterSpacing="2" fill="rgba(244,234,212,0.55)">FIELD INTERVIEWS · 23 HOSTS</text>
    </svg>);

  return null;
};

// =====================================================================
// LAYER ICONS — matches the small visual marks from the reference
// =====================================================================
const V5StratIcon = ({ kind }) => {
  const C = { width: 28, height: 28, viewBox: "0 0 24 24", "aria-hidden": "true" };
  if (kind === "unstable") return (
    <svg {...C}>
      <circle cx="12" cy="12" r="10" fill="none" stroke="#c0563b" strokeWidth="0.7" opacity="0.6" />
      <path d="M 12 6 L 13.6 10.5 L 18 11 L 14.7 13.9 L 15.7 18 L 12 15.8 L 8.3 18 L 9.3 13.9 L 6 11 L 10.4 10.5 Z" fill="none" stroke="#c0563b" strokeWidth="1.1" />
      <circle cx="12" cy="12" r="1.2" fill="#c0563b" />
    </svg>);

  if (kind === "audience") return (
    <svg {...C}>
      <circle cx="12" cy="12" r="10" fill="none" stroke="#c0563b" strokeWidth="0.7" opacity="0.6" />
      <circle cx="8.5" cy="10" r="1.6" fill="none" stroke="#c0563b" strokeWidth="1" />
      <circle cx="15.5" cy="10" r="1.6" fill="none" stroke="#c0563b" strokeWidth="1" />
      <circle cx="12" cy="13.5" r="1.6" fill="#c0563b" />
      <path d="M 5.5 17 Q 8.5 14 12 16 Q 15.5 14 18.5 17" fill="none" stroke="#c0563b" strokeWidth="1" />
    </svg>);

  if (kind === "system") return (
    <svg {...C}>
      <circle cx="12" cy="12" r="10" fill="none" stroke="#c0563b" strokeWidth="0.7" opacity="0.6" />
      <circle cx="12" cy="12" r="6.5" fill="none" stroke="#c0563b" strokeWidth="0.9" />
      <circle cx="12" cy="12" r="3" fill="none" stroke="#c0563b" strokeWidth="0.9" />
      <circle cx="12" cy="12" r="1.2" fill="#c0563b" />
      <line x1="12" y1="3" x2="12" y2="6" stroke="#c0563b" strokeWidth="0.7" />
      <line x1="12" y1="18" x2="12" y2="21" stroke="#c0563b" strokeWidth="0.7" />
      <line x1="3" y1="12" x2="6" y2="12" stroke="#c0563b" strokeWidth="0.7" />
      <line x1="18" y1="12" x2="21" y2="12" stroke="#c0563b" strokeWidth="0.7" />
    </svg>);

  return null;
};

// =====================================================================
// MAIN — V5Featured
// =====================================================================
const V5Featured = () => {
  const [playing, setPlaying] = React.useState(false);
  const [seconds, setSeconds] = React.useState(0);
  const [duration, setDuration] = React.useState(222); // 3:42 fallback until metadata loads
  const total = duration;
  const ref = useRef(null);
  const videoRef = useRef(null);
  const [seen, setSeen] = useState(false);

  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const io = new IntersectionObserver(([e]) => {
      if (e.isIntersecting) {setSeen(true);io.disconnect();}
    }, { threshold: 0.15 });
    io.observe(el);
    return () => io.disconnect();
  }, []);

  const togglePlay = () => {
    const v = videoRef.current;
    if (!v) return;
    if (v.paused) {v.play().catch(() => {});} else {v.pause();}
  };

  const fmt = (s) => `${String(Math.floor(s / 60)).padStart(1, "0")}:${String(s % 60).padStart(2, "0")}`;
  const pct = seconds / total * 100;

  return (
    <section
      id="showcase"
      ref={ref}
      className={`v5-ft v5-ft-${FEATURED.slug} ${seen ? "is-in" : ""} ${playing ? "is-playing" : ""}`}
      data-screen-label="Showcase · Outdoorsy">
      
      <div className="v4-container v5-ft-container">
        {/* Vertical rail — DESIGN · RESEARCH · SYSTEMS · SIGNAL */}
        <div className="v5-ft-rail" aria-hidden="true">
          <span className="v5-ft-rail-tick"></span>
          <span className="v5-ft-rail-text">DESIGN&nbsp;&nbsp;·&nbsp;&nbsp;RESEARCH&nbsp;&nbsp;·&nbsp;&nbsp;SYSTEMS&nbsp;&nbsp;·&nbsp;&nbsp;SIGNAL</span>
        </div>

        {/* Section header — Featured eyebrow */}
        <header className="v5-ft-head">
          <div className="v5-ft-head-left">
            <div className="v5-ft-eyebrow">
              <span className="v5-ft-eyebrow-rule"></span>
              <span className="v5-ft-eyebrow-num">01</span>
              <span className="v5-ft-eyebrow-label" style={{ color: "rgb(132, 129, 122)", fontFamily: "\"JetBrains Mono\"" }}>Featured project · 2026 selection</span>
            </div>
            <h2 className="v5-ft-section-title" data-cursor="One signal project" style={{ width: "513px", fontSize: "82px" }}>
              <WordReveal text="In focus" stagger={60} />
              <span className="v5-ft-section-title-sep">—</span>
              <span className="emph"><WordReveal text="Outdoorsy." stagger={70} startDelay={260} /></span>
            </h2>
          </div>
          <div className="v5-ft-head-right">
            <p className="v5-ft-section-lede">
              <FadeIn delay={300}>
                One project carries the practice better than a chronology. A category-defining marketplace, rebuilt around the people whose work the rest of the platform depends on — brand, product, design system, and host tooling, shaped end to end.
              </FadeIn>
            </p>
          </div>
        </header>

        {/* Main showcase row — film / narrative */}
        <div className="v5-ft-main">
          {/* LEFT — inline video player */}
          <div className="v5-ft-film">
            <div className={`v5-ft-player ${playing ? "is-playing" : ""}`}>
              <div className="v5-ft-player-frame">
                <img
                  src="src/assets/outdoorsy-poster.jpg"
                  alt="Outdoorsy product designer view — Bonfire Design System"
                  className="v5-ft-poster-img" />
                

                {/* Actual video — sits above the poster image, uses the still as its poster frame */}
                <video
                  ref={videoRef}
                  className="v5-ft-video"
                  src="src/assets/outdoorsy-sizzle.mp4"
                  poster="src/assets/outdoorsy-poster.jpg"
                  playsInline
                  preload="metadata"
                  onPlay={() => setPlaying(true)}
                  onPause={() => setPlaying(false)}
                  onEnded={() => {setPlaying(false);setSeconds(0);}}
                  onTimeUpdate={(e) => setSeconds(e.currentTarget.currentTime)}
                  onLoadedMetadata={(e) => {
                    if (isFinite(e.currentTarget.duration) && e.currentTarget.duration > 0) {
                      setDuration(e.currentTarget.duration);
                    }
                  }}>
                </video>

                {/* Play overlay — primary action */}
                <button
                  type="button"
                  className="v5-ft-play"
                  onClick={togglePlay}
                  data-cursor={playing ? "Pause the film" : "Play the case study film · 3:42"}
                  data-cursor-style="cta"
                  aria-label={playing ? "Pause the case study film" : "Play the case study film"}>
                  
                  <span className="v5-ft-play-ring" aria-hidden="true"></span>
                  <span className="v5-ft-play-glyph" aria-hidden="true">
                    {playing ?
                    <svg viewBox="0 0 24 24" width="22" height="22"><rect x="6" y="5" width="4" height="14" fill="currentColor" /><rect x="14" y="5" width="4" height="14" fill="currentColor" /></svg> :

                    <svg viewBox="0 0 24 24" width="24" height="24"><path d="M 7 4 L 7 20 L 20 12 Z" fill="currentColor" /></svg>
                    }
                  </span>
                  <span className="v5-ft-play-label">
                    <span className="v5-ft-play-label-top">{playing ? "Pause" : "Watch the Sizzle Reel"}</span>
                  </span>
                </button>

                {/* Slate corner — top-left */}
                <div className="v5-ft-player-slate">
                  <span className="v5-ft-player-slate-rec">
                    <span className="v5-ft-player-slate-dot"></span>
                    {playing ? "PLAYING" : "READY"}
                  </span>
                  <span className="v5-ft-player-slate-meta">
                    <span>CASE FILM&nbsp;&nbsp;·&nbsp;&nbsp;{FEATURED.client.toUpperCase()}&nbsp;&nbsp;·&nbsp;&nbsp;{FEATURED.year}</span>
                  </span>
                </div>

                {/* Scrub bar — bottom */}
                <div className="v5-ft-player-scrub">
                  <div className="v5-ft-player-scrub-rail">
                    <div className="v5-ft-player-scrub-fill" style={{ width: `${pct}%` }}></div>
                    {FEATURED.film.chapters.map((c, i) => {
                      const cs = parseInt(c.t.split(":")[0]) * 60 + parseInt(c.t.split(":")[1]);
                      return (
                        <span
                          key={i}
                          className="v5-ft-player-scrub-mark"
                          style={{ left: `${cs / total * 100}%` }}
                          title={`${c.t} · ${c.label}`}>
                        </span>);

                    })}
                  </div>
                  <div className="v5-ft-player-scrub-time">
                    <span>{fmt(seconds)}</span>
                    <span>{FEATURED.film.duration}</span>
                  </div>
                </div>
              </div>
            </div>
          </div>

          {/* RIGHT — meta · title · strategy · cta */}
          <div className="v5-ft-content">
            {/* Meta tri-column (matches the reference's CLIENT / YEAR / ROLE row) */}
            <dl className="v5-ft-meta-grid">
              <div className="v5-ft-meta-cell">
                <dt>Client</dt>
                <dd>{FEATURED.client}</dd>
              </div>
              <div className="v5-ft-meta-cell">
                <dt>Year</dt>
                <dd>{FEATURED.year}</dd>
              </div>
              <div className="v5-ft-meta-cell v5-ft-meta-cell-wide">
                <dt>Role</dt>
                <dd>{FEATURED.role}</dd>
              </div>
            </dl>

            <span className="v5-ft-title-rule"></span>

            {/* Big editorial title */}
            <h3 className="v5-ft-title">
              <WordReveal text={FEATURED.title} stagger={40} />
            </h3>

            <span className="v5-ft-title-tick" aria-hidden="true"></span>

            {/* Strategy stack */}
            <div className="v5-ft-strategy">
              {FEATURED.strategy.map((s, i) =>
              <FadeIn as="div" key={s.id} delay={200 + i * 130} className="v5-ft-strat">
                  <div className="v5-ft-strat-icon">
                    <V5StratIcon kind={s.id} />
                  </div>
                  <div className="v5-ft-strat-body">
                    <h4 className="v5-ft-strat-label">{s.label}</h4>
                    <p className="v5-ft-strat-copy">{s.body}</p>
                  </div>
                </FadeIn>
              )}
            </div>

            {/* Secondary CTA — full case study */}
            <FadeIn as="div" delay={700} className="v5-ft-cta-row">
              <Magnetic strength={10}>
                <a href={FEATURED.href} className="v5-ft-cta" data-cursor="Open the full Outdoorsy case study" data-cursor-style="cta">
                  <span className="v5-ft-cta-label">See the full case study</span>
                  <span className="v5-ft-cta-arr" aria-hidden="true">→</span>
                </a>
              </Magnetic>
            </FadeIn>
          </div>
        </div>

        {/* Orthogonal artifacts — separate, linked pieces */}
        <div className="v5-ft-artifacts">
          <div className="v5-ft-artifacts-head">
            <span className="v5-ft-artifacts-eyebrow">— Artifacts</span>
            <span className="v5-ft-artifacts-rule"></span>
            <span className="v5-ft-artifacts-meta">Five orthogonal pieces · open any chapter</span>
          </div>
          <div className="v5-ft-artifacts-grid">
            {FEATURED.artifacts.map((a, i) =>
            <a
              key={a.id}
              href={`${FEATURED.href}#${a.id}`}
              className="v5-ft-art"
              data-cursor={`Open · ${a.label}`}
              data-cursor-style="cta">
              
                <span className="v5-ft-art-thumb">
                  <img src={a.img} alt={a.label} loading="lazy" />
                </span>
                <span className="v5-ft-art-text">
                  <span className="v5-ft-art-n">{String(i + 1).padStart(2, "0")}</span>
                  <span className="v5-ft-art-label">{a.label}</span>
                  <span className="v5-ft-art-note">{a.note}</span>
                </span>
              </a>
            )}
          </div>
        </div>

        {/* Decorative crosshair — bottom-right (echoes the reference) */}
        <svg className="v5-ft-crosshair" viewBox="0 0 80 80" aria-hidden="true">
          <circle cx="40" cy="40" r="32" fill="none" stroke="currentColor" strokeWidth="0.5" opacity="0.55" />
          <circle cx="40" cy="40" r="20" fill="none" stroke="currentColor" strokeWidth="0.4" opacity="0.4" />
          <circle cx="40" cy="40" r="2.5" fill="currentColor" opacity="0.7" />
          <line x1="40" y1="0" x2="40" y2="14" stroke="currentColor" strokeWidth="0.4" opacity="0.5" />
          <line x1="40" y1="66" x2="40" y2="80" stroke="currentColor" strokeWidth="0.4" opacity="0.5" />
          <line x1="0" y1="40" x2="14" y2="40" stroke="currentColor" strokeWidth="0.4" opacity="0.5" />
          <line x1="66" y1="40" x2="80" y2="40" stroke="currentColor" strokeWidth="0.4" opacity="0.5" />
        </svg>
      </div>
    </section>);

};

Object.assign(window, { V5Featured, V5FilmPoster, V5ArtifactTile, V5StratIcon, FEATURED_PROJECT: FEATURED });