/* Sam's article — Security Camera Placement: The 5 Spots That Matter
 * Format variation vs the garage piece: NO WhatYouNeed, NO HotTakes.
 * Crumbs, Hero, Lede, Spots (5), Redo (the mistakes essay), Affiliate, Signoff.
 * Affiliate: /go/sam-security-camera, rel=sponsored nofollow, disclosure directly below.
 * Exactly one affiliate anchor on the page, in the Affiliate card only.
 */

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

const heroImage = "cover.jpg";
const imgApproach = "sam-fig-approach.jpg";
const imgHeight = "sam-fig-height.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>Install</span>
      <span>/</span>
      <span style={{ color: "#EFE5CF" }}>Security camera placement</span>
    </div>
    <div className="r">
      <span>Issue 08 | Summer '26</span>
      <span className="by">written by Sam</span>
    </div>
  </nav>
);

const STATS = [
  { stat: "5", note: "jobs to cover — which is not the same as five cameras" },
  { stat: "8–9 ft", note: "mounting height that records faces instead of scalps" },
  { stat: "3", note: "well-aimed cameras that beat six aimed at scenery" }
];

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>Sam</span>
          <span className="dot">*</span>
          <span>Security + Install</span>
          <span className="dot">*</span>
          <span className="sig">written by Sam</span>
        </div>
        <h1>
          Four of your five cameras are <em>watching a fence.</em>
        </h1>
        <p className="standfirst">
          the number of cameras is not the thing. what each one is pointed at is the entire thing.
        </p>
      </div>
      <div className="sa-hero-side">
        {STATS.map((s) => (
          <div className="row" key={s.stat} style={{ gap: 18, alignItems: "baseline" }}>
            <span style={{ textTransform: "none", letterSpacing: "0.03em", lineHeight: 1.45, maxWidth: "26ch" }}>{s.note}</span>
            <span className="v" style={{ flexShrink: 0, whiteSpace: "nowrap" }}>{s.stat}</span>
          </div>
        ))}
        <div className="row">
          <span>Updated</span>
          <span className="v">Aug '26</span>
        </div>
      </div>
    </div>
    <div className="sa-hero-scribble" style={{ top: "17%", bottom: "auto", right: "5%" }}>
      cover the walk. <u>not the mat.</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">The five spots</div>
        <ul>
          <li>The approach</li>
          <li>The driveway</li>
          <li>The door nobody sees</li>
          <li>The interior choke point</li>
          <li>Whatever's dark</li>
        </ul>
      </aside>

      <div className="sa-lede-body">
        <p className="dropcap">
          a neighbour of mine had a package taken and four cameras running. we sat and watched all four clips. camera one: a very good recording of a hedge. camera two: the top of a baseball cap, for a second and a half. camera three: a driveway at such a steep angle that a human being read as a moving shadow. camera four: the side of the house nobody has ever walked past, filmed beautifully, in high definition, for two years.
        </p>
        <div className="sa-pullquote">
          <p>
            cameras got cheap and good very fast. aiming them did not.
          </p>
        </div>
        <p>
          so: five spots. not five cameras — you can do most of this with three. five <em>jobs</em>, in the order i'd cover them.
        </p>
      </div>

      <aside className="sa-margin">
        <span className="lab">The whole audit</span>
        <h4>Walk up to your own door</h4>
        <p>
          approach the way a stranger would, then watch the clip. if you can't identify yourself — and you know it's you — nobody else will manage it.
        </p>
      </aside>
    </div>
  </section>
);

const SPOTS = [
  {
    n: "01",
    phase: "Spot one | the approach",
    title: "The approach, not the doorstep.",
    flip: false,
    body: (
      <>
        <p>
          the most common mistake in the whole category: a camera mounted directly above the door, aimed straight down at the mat. what that records is the crown of a hat and a pair of shoulders, for about a second and a half, at an angle no human face survives.
        </p>
        <p>
          aim along the walk instead. you want somebody in frame while they're still coming toward you — from the sidewalk, the gate, the end of the drive. that gives you a whole person, moving: build, clothing, gait, and a face turned roughly toward the lens rather than roughly toward the floor.
        </p>
      </>
    ),
    tip: { lab: "the embarrassing test", text: "walk up to your own door the way a stranger would, then watch it back. if you can't identify yourself, nobody else is going to." },
    fig: { img: imgApproach, tag: "Fig 01 | The approach", cap: "the whole walk, from the gate in. that's the frame you want, not the two feet of mat." },
    says: "a camera over the door films hats."
  },
  {
    n: "02",
    phase: "Spot two | the drive",
    title: "The driveway, along its length.",
    wide: true,
    body: (
      <>
        <p>
          cars, deliveries, and the thing that happens between the car and the front door. the mistake here is mounting high on the house and looking down, which flattens the whole scene into a top-down view where people become hats again.
        </p>
        <p>
          mount so the camera looks <em>along</em> the drive — from the house toward the street, or from a corner across its length. you want the whole run in one frame: the vehicle, the walk from the vehicle, and the bit of pavement where boxes get left.
        </p>
      </>
    )
  },
  {
    n: "03",
    phase: "Spot three | the quiet door",
    title: "The door nobody can see.",
    wide: true,
    body: (
      <>
        <p>
          this is the one people skip, and it's the one i'd install second.
        </p>
        <p>
          every house has a door or a window that can't be seen from the street, from a neighbour's kitchen, or from anywhere a person might casually be. a side gate behind a fence. a back slider screened by a hedge. a basement door down three steps in the dark. that's the entry that gets used, precisely because it's the one where somebody can stand and take their time.
        </p>
        <p>
          and it's almost always the last spot to get a camera, because when you're standing at the front of the house with a box in your hand, you point the camera at the part of the house you look at every day.
        </p>
      </>
    ),
    tip: { lab: "install order", text: "front approach first. the door nobody can see second. everything else after that." }
  },
  {
    n: "04",
    phase: "Spot four | inside",
    title: "One camera inside, at the choke point.",
    flip: true,
    body: (
      <>
        <p>
          i know. indoors is a hard no for a lot of people, and if it's a hard no for you, skip it — i'm not going to argue about it.
        </p>
        <p>
          but if you're open to one: an interior camera at the choke point does more than any two exterior ones. every house has a spot everything funnels through — the hallway, the landing, the bottom of the stairs. close range, even light, no weather, no glare, no distance. that's where footage stops being a grey shape and starts being a description.
        </p>
        <p>
          one camera. pointed at a corridor. <em>not</em> the living room, not a bedroom — a corridor.
        </p>
      </>
    ),
    fig: { img: imgHeight, tag: "Fig 02 | Height", cap: "eight to nine feet. out of easy reach, still low enough to photograph a face." },
    says: "one camera. pointed at a corridor."
  },
  {
    n: "05",
    phase: "Spot five | the dark",
    title: "Whatever's dark. Light it before you film it.",
    wide: true,
    body: (
      <>
        <p>
          this one isn't a compass direction. walk the property at nine at night and find the piece of it you cannot see from any window. that's spot five.
        </p>
        <p>
          and here's the order that matters: light it before you film it. a motion light does more of this job than a camera does, because it changes what happens instead of recording it. a camera in the dark gives you infrared, and infrared gives you a person-shaped thing in monochrome. useful for knowing something happened. not useful for saying who.
        </p>
      </>
    ),
    warn: { lab: "Infrared is not identification", text: "a camera without light produces a grey shape. that tells you an event occurred. it does not describe anybody." }
  }
];

const Spot = ({ data }) => (
  <article
    className={`sa-step ${data.flip ? "flip" : ""}`}
    style={data.wide ? { gridTemplateColumns: "1fr", maxWidth: 880 } : undefined}
  >
    <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>
    {data.fig && (
      <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 Spots = () => (
  <section className="sa-steps">
    <div className="sa-steps-wrap">
      <header className="sa-steps-head">
        <h2>
          Five jobs. <em>Three cameras will do it.</em>
        </h2>
        <span className="count">05 SPOTS | APPROACH, DRIVE, QUIET DOOR, CORRIDOR, DARK</span>
      </header>
      {SPOTS.map((s) => (
        <Spot key={s.n} data={s} />
      ))}
    </div>
  </section>
);

const Mistakes = () => (
  <section className="sa-redo">
    <div className="sa-redo-wrap">
      <div className="sa-redo-side">
        the four that ruin the other five
        <svg viewBox="0 0 80 60" fill="none">
          <path d="M4 40 C 20 14, 46 8, 74 22" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" />
        </svg>
      </div>
      <div>
        <h2>
          Aim is most of it. <em>The rest is these.</em>
        </h2>
        <p>
          <strong>Height.</strong> roughly eight to nine feet. high enough that nobody casually swats it, low enough that it photographs faces instead of the tops of heads. fifteen feet up under the gable looks tidy and gives you aerial footage of strangers' scalps.
        </p>
        <p>
          <strong>The sun.</strong> a camera aimed east spends every morning blinded, and one aimed west spends every evening the same way. worth going outside twice in one day before you drill anything.
        </p>
        <p>
          <strong>What it's stuck to.</strong> exterior-rated fasteners, into something solid, cable routed so it isn't a handle. a camera on a bracket somebody can reach and twist is a camera aimed at the sky by tuesday.
        </p>
        <p>
          <strong>Your neighbours.</strong> don't point a camera into somebody else's window, garden or door. beyond being genuinely rude, the rules on this vary a lot by where you live — and the time to find that out is before the bracket goes up, not during a conversation over a fence.
        </p>
      </div>
    </div>
  </section>
);

const Affiliate = () => (
  <section
    style={{
      background: "var(--sa-bg-soft)",
      borderTop: "1px solid var(--sa-rule)",
      borderBottom: "1px solid var(--sa-rule)",
      padding: "56px 24px"
    }}
  >
    <div
      style={{
        maxWidth: 780,
        margin: "0 auto",
        background: "var(--sa-bg-card)",
        border: "1px solid var(--sa-rule)",
        borderLeft: "3px solid var(--sa-marker)",
        borderRadius: 4,
        padding: "32px 34px"
      }}
    >
      <span
        style={{
          fontFamily: "'JetBrains Mono', monospace",
          fontSize: 10,
          letterSpacing: "0.3em",
          textTransform: "uppercase",
          color: "var(--sa-marker)"
        }}
      >
        If you're buying the hardware
      </span>
      <p
        style={{
          fontFamily: "'Playfair Display', serif",
          fontSize: 23,
          lineHeight: 1.35,
          color: "var(--sa-cream)",
          margin: "14px 0 18px"
        }}
      >
        two things on the box before anything else: a weather rating that suits where it's going, and somewhere to store footage that isn't a monthly bill — a card in the camera or a drive in the house. decide storage before you decide resolution.
      </p>
      <a
        href="/go/sam-security-camera"
        rel="sponsored nofollow"
        style={{
          display: "inline-block",
          background: "var(--sa-marker)",
          color: "#100E0B",
          fontFamily: "'DM Sans', sans-serif",
          fontWeight: 700,
          fontSize: 14,
          letterSpacing: "0.02em",
          textDecoration: "none",
          padding: "12px 26px",
          borderRadius: 999
        }}
      >
        outdoor security cameras →
      </a>
      <p
        style={{
          fontFamily: "'DM Sans', sans-serif",
          fontSize: 12,
          lineHeight: 1.5,
          color: "var(--sa-mute)",
          margin: "18px 0 0"
        }}
      >
        some links on this page are affiliate links — if you buy through one, we earn a commission at no extra cost to you.
      </p>
    </div>
  </section>
);

const Signoff = () => (
  <section className="sa-signoff">
    <div className="sa-signoff-wrap">
      <div>
        <h2>
          Three, aimed properly. <em>Not six, aimed at scenery.</em>
        </h2>
        <p>
          go outside, walk to your own door like a stranger, and watch the clip back. that's the whole audit, and it costs nothing.
        </p>
        <div className="sig">— sam</div>
        <div className="ctas" style={{ marginTop: 28 }}>
          <a href="/en/contributors/sam/" className="btn primary">
            More from Sam
          </a>
          <a href="/contact/" className="btn ghost">
            Ask Sam a question
          </a>
        </div>
      </div>
      <div className="sa-readnext">
        <span className="lab">Read next</span>
        <a href="/en/contributors/sam/smart-home-without-subscriptions/">
          <span>How to build a smart home without subscription traps</span>
          <span className="m">SAM</span>
        </a>
        <a href="/en/contributors/sam/gallery-wall-laser-level/">
          <span>Hang a gallery wall straight the first time</span>
          <span className="m">SAM</span>
        </a>
        <a href="/en/contributors/sam/first-home-insurance/">
          <span>Insure your first home without overpaying</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 />
    <Spots />
    <Mistakes />
    <Affiliate />
    <Signoff />
  </div>
);

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