/* Sam's article — The 90-Minute Backyard (Editor's Pick / featured)
 * Format: Sam editorial — Crumbs, Hero, Lede, WhatYouNeed, Steps, HotTakes, Signoff.
 * Copy is Sam's, lifted from the draft and arranged into her standard template.
 */

const SamSays = ({ children }) => (
  <div className="sa-step-says">
    <span className="who">- Sam</span>
    <p>{children}</p>
  </div>
);

const heroImage = "backyard-cover.jpg";
const imgGrill = "grill.jpg";
const imgSeating = "seating.jpg";
const imgScreen = "screen.jpg";
const imgDusk = "dusk.jpg";

const Crumbs = () => (
  <nav className="sa-crumbs" aria-label="Breadcrumb">
    <div className="l">
      <a href="/">Home</a>
      <span>/</span>
      <a href="/en/contributors/sam/">Sam</a>
      <span>/</span>
      <span>Editor's Pick</span>
      <span>/</span>
      <span style={{ color: "#EFE5CF" }}>The 90-minute backyard</span>
    </div>
    <div className="r">
      <span>Issue 05 | Summer '26</span>
      <span className="by">written by Sam</span>
    </div>
  </nav>
);

const Hero = () => (
  <section className="sa-hero">
    <div className="img" style={{ backgroundImage: `url('${heroImage}')` }} />
    <div className="sa-hero-wrap">
      <div>
        <div className="sa-hero-kicker">
          <span>Editor's Pick</span>
          <span className="dot">*</span>
          <span>Outdoor + Entertaining</span>
          <span className="dot">*</span>
          <span className="sig">written by Sam</span>
        </div>
        <h1>
          The 90-minute <em>backyard.</em>
        </h1>
        <p className="standfirst">
          How to set up an outdoor space that's actually ready when the whistle blows — and still standing when everyone decides to stay. The match is 90 minutes. The setup is what makes it good.
        </p>
      </div>
      <div className="sa-hero-side">
        <div className="row">
          <span>Setup</span>
          <span className="v">~2 hours</span>
        </div>
        <div className="row">
          <span>Budget</span>
          <span className="v">Works on any</span>
        </div>
        <div className="row">
          <span>Skill</span>
          <span className="v">Host-level</span>
        </div>
        <div className="row">
          <span>Crowd</span>
          <span className="v warn">12 planned, 15 actual</span>
        </div>
        <div className="row">
          <span>Updated</span>
          <span className="v">Summer '26</span>
        </div>
      </div>
    </div>
    <div className="sa-hero-scribble">
      ready before the gate. <u>not at kickoff.</u>
      <svg viewBox="0 0 60 30" fill="none">
        <path d="M2 22 C 12 8, 28 4, 56 12" stroke="currentColor" strokeWidth="2" strokeLinecap="round" />
        <path d="M48 6 L 56 12 L 50 20" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" fill="none" />
      </svg>
    </div>
  </section>
);

const Lede = () => (
  <section className="sa-lede">
    <div className="sa-lede-wrap">
      <aside className="sa-lede-side">
        <div className="marker">In this one</div>
        <ul>
          <li>Anchor on the grill</li>
          <li>Seating in three zones</li>
          <li>Aim the screen right</li>
          <li>The 30-minute window</li>
          <li>The halftime reset</li>
          <li>When everyone stays</li>
        </ul>
      </aside>

      <div className="sa-lede-body">
        <p className="dropcap">
          Here's the thing nobody tells you about hosting an outdoor watch party: the match is 90 minutes, but the setup takes two hours and the cleanup takes one.
        </p>
        <p>
          And somewhere in the middle of all of that, fifteen people show up who you definitely didn't plan for. I've thrown enough of these to know that the difference between a good one and a stressful one has almost nothing to do with what you own. It's about what's ready before the first person walks through the gate.
        </p>
        <div className="sa-pullquote">
          <p>
            The grill is fired up. The cooler is stocked. The seats are out. The screen is aimed where it needs to be. Not when the game starts. Before.
          </p>
        </div>
        <p>
          This is the article I wish I'd had the first time I tried to host a World Cup match in my backyard with a borrowed projector, a bag of charcoal I couldn't light, and eleven people asking me where the bathroom was. I've learned a few things since then.
        </p>
      </div>

      <aside className="sa-margin">
        <span className="lab">Sam's note</span>
        <h4>Ready beats big</h4>
        <p>
          I've hosted matches in a 400-square-foot apartment and in a proper backyard. The size of the space never decided how good the party was. Whether I was ready before the gate did.
        </p>
      </aside>
    </div>
  </section>
);

const WhatYouNeed = () => (
  <section className="sa-need">
    <div className="sa-need-wrap">
      <div>
        <div className="sa-need-head">01 / The kit</div>
        <h2>
          What you <em>actually</em> need
        </h2>
        <p className="body">
          Everything in an outdoor setup radiates out from one spot — the grill. Figure out where it goes first, and everything else arranges itself around it. You don't need to own much. You need the right few things, ready early.
        </p>

        <div className="sa-need-dont">
          <span className="lab">Don't bother with</span>
          <ul>
            <li>
              Babysitting a charcoal fire
              <span className="why">You cannot tend coals and watch a match. You'll miss something important. Gas gives control without attention.</span>
            </li>
            <li>
              A ring of chairs facing each other
              <span className="why">It's a party, not a campfire. Seats face the screen, not the group.</span>
            </li>
            <li>
              A screen pointed into the sun
              <span className="why">Half your crowd ends up squinting by halftime. Check where the sun will be in two hours, not where it is now.</span>
            </li>
          </ul>
        </div>
      </div>

      <ul className="sa-need-list">
        <li>
          <span className="item">
            A gas grill
            <span className="why">Control without attention — exactly what you need with a cooler, twelve guests, and a scoreline to track.</span>
          </span>
          <span className="qty">1</span>
        </li>
        <li>
          <span className="item">
            A side table or grill cart
            <span className="why">The single upgrade that makes outdoor grilling feel intentional instead of improvised.</span>
          </span>
          <span className="qty">1</span>
        </li>
        <li>
          <span className="item">
            Cooler + plenty of ice
            <span className="why">Room-temperature drinks need a solid 30 minutes on ice before they're actually cold.</span>
          </span>
          <span className="qty">1</span>
        </li>
        <li>
          <span className="item">
            A screen you can read
            <span className="why">TV, projector, even a laptop — if Zone 1 can read jersey numbers, it's big enough.</span>
          </span>
          <span className="qty">1</span>
        </li>
        <li>
          <span className="item">
            Bluetooth speaker
            <span className="why">Outdoor sound dissipates fast. Whatever's loud enough inside is half that outside.</span>
          </span>
          <span className="qty">1</span>
        </li>
        <li>
          <span className="item">
            Extension cord + gaffer tape
            <span className="why">Run it before guests arrive and tape it down. A loose cord is how someone trips right when the game gets good.</span>
          </span>
          <span className="qty">Set</span>
        </li>
        <li>
          <span className="item">
            String lights, and a bottle opener
            <span className="why">The lights keep people from leaving at dark. The bottle opener is the thing you'll forget. It's always the bottle opener.</span>
          </span>
          <span className="qty">Both</span>
        </li>
      </ul>
    </div>
  </section>
);

const STEPS = [
  {
    n: "01",
    phase: "Anchor | the grill",
    title: "Start with the anchor — the grill.",
    flip: false,
    body: (
      <>
        <p>
          It's not just where the food comes from. It's where people gather when they don't know what else to do with themselves. Someone's going to stand next to it with a drink for the full 90 minutes — and that person is usually the most relaxed one at the party, because they have a job and a location and something warm nearby.
        </p>
        <p>
          Gas wins for this. I know that's not popular in the Pacific Northwest, where we treat charcoal like a religion, but you cannot babysit a fire and watch a match. If charcoal is non-negotiable, light it 45 minutes before kickoff — not 20 — so the coals are ready when you need them and not still coming up to temperature when Mbappé scores.
        </p>
      </>
    ),
    tip: { lab: "Prep the menu, not the moment", text: "5-minute items (dogs, brats, burgers, skewers) are your starting lineup — run them during a stoppage. 20-minute items (bone-in thighs, corn) go on at halftime. Never grill a steak during a match." },
    warn: { lab: "The day before", text: "Check the propane the day before — not the morning of — so you have time to swap it. Clean and oil the grates. A dirty grate sticks; an oiled one doesn't." },
    fig: { img: imgGrill, tag: "Fig 01 | The anchor", cap: "everything radiates out from here. tools within arm's reach, trash bag on the cart." },
    says: "Figure out where the grill goes first. Everything else arranges itself around it."
  },
  {
    n: "02",
    phase: "Seat | three zones",
    title: "Seating in three zones — and check the sun.",
    flip: true,
    body: (
      <>
        <p>
          Before you put a single chair out, stand where the screen will be and look at the sun. Where is it going to be in 90 minutes? Two hours? A late-afternoon June kickoff will drag the sun right to where you don't want it. Adjust before you set anything down.
        </p>
        <p>
          Then think in three zones. <strong>Zone 1, the close seats</strong> — your best chairs, angled at the screen, for the people who actually want to watch. <strong>Zone 2, the grill zone</strong> — more casual, near the food, for the talkers. <strong>Zone 3, the overflow</strong> — a blanket on the grass and a few folded chairs against the fence, for the people you didn't plan for. And you didn't plan for them.
        </p>
      </>
    ),
    tip: { lab: "Mismatched is fine", text: "You don't need matching furniture. Two camp chairs and a blanket beat an expensive set that's still in boxes at kickoff. Just leave enough room to get up without climbing over anyone." },
    fig: { img: imgSeating, tag: "Fig 02 | Three zones", cap: "best seats face the screen. casual by the food. overflow against the fence." }
  },
  {
    n: "03",
    phase: "Aim | the screen",
    title: "Aim the screen — the part that causes the most problems.",
    flip: false,
    body: (
      <>
        <p>
          I've watched matches on a laptop propped on a cooler, a 55-inch TV on a patio table, and a projector aimed at a bedsheet hung between two fence posts. All three worked. The test is simple: can Zone 1 read jersey numbers, and can Zone 2 tell which way the ball is going? If yes, it's big enough.
        </p>
        <p>
          Screens wash out in direct sun, so put a TV in shade or wait for the sun to move. Projectors need darkness — they're better for evening kickoffs. And sound dissipates fast outside: put the speaker near Zone 1, not the grill, and decide how your neighbors feel about the volume before the match, not during it.
        </p>
      </>
    ),
    warn: { lab: "The cable situation", text: "Run the extension cord before people arrive and tape it down with gaffer tape, or weight it. A cord across a high-traffic path is how someone trips and ruins the moment." },
    fig: { img: imgScreen, tag: "Fig 03 | Sight lines", cap: "shade beats brightness. speaker by the close seats, not the grill." },
    says: "If Zone 1 can read jersey numbers and Zone 2 can follow the ball, your screen is doing its job."
  },
  {
    n: "04",
    phase: "Prime | 30 min out",
    title: "The 30-minute window before kickoff.",
    flip: true,
    body: (
      <>
        <p>
          This is the window most people waste. You get 30 minutes between guests arriving and the whistle, and it's the best chance you'll get to make sure everything is actually ready. Fire up the grill 20 minutes before kickoff — not at kickoff — so it's hot and you can cook during stoppages without missing anything.
        </p>
        <p>
          Restock the cooler and check the ice. Set the food table — chips, dips, anything that doesn't need the grill — out before the whistle, so people graze instead of asking you for things in the third minute. Then do one lap. Walk the whole setup with your eyes. Trash bag in place? Napkins out? Bottle opener visible? The thing you forgot is almost always the bottle opener.
        </p>
      </>
    ),
    tip: { lab: "Do the lap", text: "One slow walk through every zone before kickoff catches the one thing you forgot while there's still time to fix it. Always." },
    fig: { img: heroImage, tag: "Fig 04 | Before the gate", cap: "fired up, stocked, seats out, screen aimed. before the first person arrives." }
  },
  {
    n: "05",
    phase: "Reset + stay | the second half",
    title: "Halftime, the second half — and the part where everyone stays.",
    flip: false,
    body: (
      <>
        <p>
          Halftime is 15 minutes and it goes fast. The good hosts use it to reset, not to finally have that conversation. Empty the trash and re-bag it. Check the cooler again — the second half always drinks more than the first. Start any food that needs 20+ minutes now, so it's ready at the final whistle. Do a quick sweep for abandoned cups. The reset takes eight minutes and changes how the second half feels.
        </p>
        <p>
          And then here's what happens at a good one: the match ends and nobody moves. Two things make that easy. <strong>Lights</strong> — run the string lights before kickoff so when the sun goes down they're already on and nobody thinks about leaving. <strong>A second snack wave</strong> — the table's gone by halftime, so a bag of chips you hadn't opened, some cookies, the rest of the watermelon. Nothing elaborate. Just something that says the night isn't over unless you want it to be.
        </p>
      </>
    ),
    tip: { lab: "Let the space transition", text: "Lights already on when it gets dark = the spell holds. Someone hunting for a switch at dusk = the spell breaks. Put them on a timer or just flip them on at setup." },
    fig: { img: imgDusk, tag: "Fig 05 | Then they stay", cap: "lights already on, one more thing opened, nobody noticed the sun go down." },
    says: "People staying is the best possible outcome — and the one most hosts are least ready for."
  }
];

const Step = ({ data }) => (
  <article className={`sa-step ${data.flip ? "flip" : ""}`}>
    <div className="sa-step-text">
      <div className="sa-step-meta">
        <span className="sa-step-num">{data.n}</span>
        <span className="sa-step-phase">{data.phase}</span>
      </div>
      <h3>{data.title}</h3>
      <div className="sa-step-body">{data.body}</div>
      {data.tip && (
        <div className="sa-step-tip">
          <span className="lab">{data.tip.lab}</span>
          <p>{data.tip.text}</p>
        </div>
      )}
      {data.warn && (
        <div className="sa-step-warn">
          <span className="lab">{data.warn.lab}</span>
          <p>{data.warn.text}</p>
        </div>
      )}
    </div>
    <figure className="sa-step-fig">
      <div className="frame">
        <span className="tag">{data.fig.tag}</span>
        <img src={data.fig.img} alt="" loading="lazy" />
      </div>
      <figcaption>{data.fig.cap}</figcaption>
      {data.says && <SamSays>{data.says}</SamSays>}
    </figure>
  </article>
);

const Steps = () => (
  <section className="sa-steps">
    <div className="sa-steps-wrap">
      <header className="sa-steps-head">
        <h2>
          The <em>five</em> moves
        </h2>
        <span className="count">05 MOVES | NINETY MINUTES LIVE</span>
      </header>
      {STEPS.map((s) => (
        <Step key={s.n} data={s} />
      ))}
    </div>
  </section>
);

const HotTakes = () => (
  <section className="sa-hottakes">
    <div className="sa-hottakes-wrap">
      <header className="sa-hottakes-head">
        <span className="lab">Sam's hot takes</span>
        <h2>
          Things I'm <em>tired</em> of seeing
        </h2>
      </header>
      <div className="sa-hottakes-list">
        <div className="sa-take">
          <div className="num">i.</div>
          <h3>A ring of chairs facing each other</h3>
          <p>
            It's a party, not a campfire. The seats face the screen. The talking happens in Zone 2, near the food, where it belongs.
          </p>
        </div>
        <div className="sa-take">
          <div className="num">ii.</div>
          <h3>Not enough seats</h3>
          <p>
            Guests standing awkwardly through the second half is a host problem, not a guest problem. Count heads, then add three. Someone always brings someone.
          </p>
        </div>
        <div className="sa-take">
          <div className="num">iii.</div>
          <h3>Everything pointed at the sun</h3>
          <p>
            Stand where the screen goes and look at where the sun will be in two hours — not where it is now. Half a squinting crowd by halftime is entirely avoidable.
          </p>
        </div>
        <div className="sa-take">
          <div className="num">iv.</div>
          <h3>Grilling steaks during the match</h3>
          <p>
            Anything that needs your full attention is the wrong call. Save the steak for a dinner where you're not also watching Haaland try to beat a back four.
          </p>
        </div>
      </div>
    </div>
  </section>
);

const Signoff = () => (
  <section className="sa-signoff">
    <div className="sa-signoff-wrap">
      <div>
        <h2>
          Get ready. <em>Then watch the match.</em>
        </h2>
        <p>
          I've hosted World Cup matches with a laptop propped on a stack of books, and with a real grill and a rented projector. The size of the space never decided how good the party was. What decided it was always the same thing: whether I was ready before the first person walked through the gate.
        </p>
        <div className="sig">- Sam</div>
        <div className="ctas" style={{ marginTop: 28 }}>
          <a href="/contact/" className="btn primary">
            Send a photo
          </a>
          <a href="/en/contributors/sam/" className="btn ghost">
            More from Sam
          </a>
        </div>
      </div>
      <div className="sa-readnext">
        <span className="lab">Read next</span>
        <a href="/en/contributors/sam/the-weekend-project-worth-doing-together/">
          <span>The weekend project worth doing together</span>
          <span className="m">SAM</span>
        </a>
        <a href="/en/contributors/sam/floating-shelves-look-hard-theyre-not/">
          <span>Floating shelves look hard. They're not.</span>
          <span className="m">SAM</span>
        </a>
        <a href="/en/contributors/sam/how-to-hang-something-heavy-without-asking-anyone-for-help/">
          <span>Hang something heavy without help</span>
          <span className="m">SAM</span>
        </a>
        <a href="/en/contributors/sam/">
          <span>All of Sam's guides</span>
          <span className="m">PROFILE</span>
        </a>
      </div>
    </div>
  </section>
);

const Article = () => (
  <div className="sa">
    <Crumbs />
    <Hero />
    <Lede />
    <WhatYouNeed />
    <Steps />
    <HotTakes />
    <Signoff />
  </div>
);

ReactDOM.createRoot(document.getElementById("root")).render(<Article />);
