/* Sam's article — Vertical Garage Storage That Holds Real Weight
 * Own shape vs the paint piece and the garage-gym piece:
 * a WALL LEDGER (sa-need) runs before the checks, the checks are five
 * questions the wall answers rather than a clock or a buildout order,
 * and the failure-mode essay (sa-redo) lands AFTER the checks as a postmortem.
 * Crumbs, Hero, Lede, Ledger, Checks (5), Postmortem, Verdicts, Affiliate, Signoff.
 * Affiliate: /go/sam-garage-rails, 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 imgStuds = "sam-fig-studs.jpg";
const imgRail = "sam-fig-rail.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>Build</span>
      <span>/</span>
      <span style={{ color: "#EFE5CF" }}>Vertical garage storage</span>
    </div>
    <div className="r">
      <span>Issue 09 | Fall '26</span>
      <span className="by">written by Sam</span>
    </div>
  </nav>
);

const STATS = [
  { stat: "16 / 24", note: "inches on center — the only two spacings your studs are likely to use" },
  { stat: "2", note: "studs minimum under anything you'd be upset to hear fall" },
  { stat: "0", note: "things in a garage belong on a plastic drywall anchor" }
];

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>Build + Garage</span>
          <span className="dot">*</span>
          <span className="sig">written by Sam</span>
        </div>
        <h1>
          Drywall never held your bike. <em>It just hadn't let go yet.</em>
        </h1>
        <p className="standfirst">
          vertical storage isn't about the hook. it's about what's behind the hook, and whether the weight has anywhere to go.
        </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">Sep '26</span>
        </div>
      </div>
    </div>
    <div className="sa-hero-scribble" style={{ top: "17%", bottom: "auto", right: "5%" }}>
      the hook is <u>the easy part.</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 questions</div>
        <ul>
          <li>Where are the studs</li>
          <li>What are they made of</li>
          <li>Rail or single hook</li>
          <li>How far does it stick out</li>
          <li>Does it survive a season</li>
        </ul>
      </aside>

      <div className="sa-lede-body">
        <p className="dropcap">
          i cleared a corner of the garage for a squat rack and felt very clever about it, and then i did the obvious next thing, which was to put everything the corner had been holding onto the wall. bikes, ladder, the folding table, two rakes. it looked incredible for about four months. then one morning the road bike was on the concrete, and the hook was still screwed into the wall exactly where i'd put it, with a shallow crater of crumbled gypsum around it about the size of a saucer.
        </p>
        <div className="sa-pullquote">
          <p>
            the anchor didn't fail. the wall it was sitting in did.
          </p>
        </div>
        <p>
          that's the whole thing. a hook is a lever with a bike on the end of it, and drywall is compressed chalk in a paper jacket. the fix isn't a stronger hook — it's finding something structural and giving the load a path into it. five questions, in order, and the wall answers all of them before you buy anything.
        </p>
      </div>

      <aside className="sa-margin">
        <span className="lab">The number on the packet</span>
        <h4>That rating was pulled straight down</h4>
        <p>
          anchor and hook ratings come from a controlled test — a known board, a fresh hole, a static load hanging dead vertical. your bike is none of those things.
        </p>
      </aside>
    </div>
  </section>
);

const Ledger = () => (
  <section className="sa-need">
    <div className="sa-need-wrap">
      <div>
        <div className="sa-need-head">Before you buy a single hook</div>
        <h2>
          Find out what your wall <em>actually is.</em>
        </h2>
        <p className="body">
          garages get built four or five different ways and the fastener that's right for one of them will do nothing in another. <strong>this is a ten-minute job and it decides everything downstream</strong> — the rail you buy, the screws that come with it, whether you need a hammer drill, and how much weight the wall will take at all.
        </p>
        <p className="body">
          knock along it with a knuckle, look at what's above the drywall line, and check the wall your garage shares with the house separately from the rest.
        </p>
        <div className="sa-need-dont">
          <span className="lab">Don't hang anything on these</span>
          <ul>
            <li>the garage door track, or the opener rail — it's hardware, not structure</li>
            <li>a single plastic expansion anchor, whatever the packet says</li>
            <li>pegboard hardboard on its own, without hitting the studs behind it</li>
            <li>the shared wall to the house, until you know what it is</li>
          </ul>
        </div>
      </div>

      <div>
        <ul className="sa-need-list">
          <li>
            <span className="item">
              Drywall over wood studs
              <span className="why">the common one. lag or structural screws into stud centers, and the drywall is just skin.</span>
            </span>
            <span className="qty">Screw the stud</span>
          </li>
          <li>
            <span className="item">
              Drywall over steel studs
              <span className="why">hollow C-channel. a lag screw has nothing to bite. toggles rated for steel stud, or spread the load on a rail.</span>
            </span>
            <span className="qty">Toggles only</span>
          </li>
          <li>
            <span className="item">
              Bare wood studs, no drywall
              <span className="why">the easy version — you can see exactly what you're hitting and how thick it is.</span>
            </span>
            <span className="qty">Easiest</span>
          </li>
          <li>
            <span className="item">
              Concrete block or poured concrete
              <span className="why">masonry anchors and a hammer drill. wood screws and plastic plugs are not the same thing.</span>
            </span>
            <span className="qty">Hammer drill</span>
          </li>
          <li>
            <span className="item">
              The wall shared with the house
              <span className="why">in an attached garage this is usually a fire-separation assembly. treat it as off-limits until you've checked what your local code requires of it.</span>
            </span>
            <span className="qty">Check first</span>
          </li>
        </ul>
      </div>
    </div>
  </section>
);

const CHECKS = [
  {
    n: "01",
    phase: "Question one | where",
    title: "Find the studs. Then prove them.",
    flip: false,
    body: (
      <>
        <p>
          wood studs sit at 16 inches on center in most houses and 24 in some, and once you've found two real ones the rest of the wall is arithmetic. mark centers, not edges — an electronic finder gives you both edges of the stud and the middle is where the screw wants to be.
        </p>
        <p>
          then prove it, because finders lie near plumbing, wiring and the seams where two sheets meet. the cheap confirmation is a small pilot hole in a spot the rail is going to cover anyway. solid resistance the whole way in means wood. a moment of grit and then nothing means you found the space between two studs and you've just learned something for a hole nobody will ever see.
        </p>
      </>
    ),
    fig: { img: imgStuds, tag: "Fig 01 | The layout", cap: "centers marked, not edges. two confirmed studs give you the whole wall." },
    says: "if you hit something that feels wrong while drilling, stop. that's a pipe or a wire and neither of those is your friend today."
  },
  {
    n: "02",
    phase: "Question two | what",
    title: "A steel stud will take the screw and give you nothing.",
    wide: true,
    body: (
      <>
        <p>
          this is the one that catches people, because a lag screw driven into a steel stud goes in, tightens up, and feels exactly as convincing as one in wood. it isn't. it's holding in a bent sheet about as thick as a coin, and it'll hold right up until the day it doesn't.
        </p>
        <p>
          a magnet is the fastest tell. drag one along the wall: in a wood-framed wall it sticks intermittently, at the drywall screws. on a steel stud it grabs and slides along the whole length of the stud. if that's what you've got, you're on toggles rated for hollow steel framing, and you want the load spread over more of them rather than concentrated on two.
        </p>
      </>
    ),
    warn: {
      lab: "Before you drill anything",
      text: "outlets, switches and hose bibs mean there is something running inside that wall. work well away from them, and if a garage has been finished by somebody else at some point, assume the wiring didn't take the route you'd have chosen."
    }
  },
  {
    n: "03",
    phase: "Question three | how",
    title: "A hook is a lever. A rail is a bridge.",
    flip: true,
    body: (
      <>
        <p>
          a single hook screwed into one stud puts everything it's holding into two fasteners in one piece of wood. a horizontal rail run across three or four studs takes the same load and hands a share of it to each — and the bracket can then slide to wherever the bike actually wants to hang rather than wherever the stud happened to be.
        </p>
        <p>
          that's the real argument for a rail system, and it isn't tidiness. it's that the load stops being a point. it also means you stop drilling new holes every time you change your mind, which in a garage is roughly monthly.
        </p>
        <p>
          whatever you buy, use the fastener it specifies, at the length it specifies. the rating on the box was measured with that screw at that depth into solid framing. a shorter screw because it's what was in the jar is you deciding to re-run the test yourself.
        </p>
      </>
    ),
    fig: { img: imgRail, tag: "Fig 02 | The fixing", cap: "the screw the rail came with, at the length it came in, into the middle of the stud." },
    says: "spread it across three studs and stop thinking about it."
  },
  {
    n: "04",
    phase: "Question four | how far out",
    title: "The further it sticks out, the harder it pulls.",
    wide: true,
    body: (
      <>
        <p>
          hang something on a hook that projects a foot from the wall and the weight doesn't just hang — it tries to rotate the whole bracket off the wall, prying the top fasteners outward while pressing the bottom ones in. double the projection and you roughly double that prying force, with the same weight on the end of it.
        </p>
        <p>
          so: heavy things close to the wall and low down. long things — ladders, lumber, a canoe — on two supports spaced well apart rather than one heroic one in the middle. and be honest about what you're hanging. an e-bike can weigh two or three times what a road bike weighs, and it arrives at the hook with a lift and a small drop at the end, which is a bigger load for a moment than the number on the scale.
        </p>
      </>
    ),
    tip: { lab: "the drop counts", text: "you don't lower a bike onto a hook, you swing it up and let it settle. that landing is a bigger load than the bike, and it happens every single time." }
  },
  {
    n: "05",
    phase: "Question five | later",
    title: "Load it, then go back in October.",
    wide: true,
    body: (
      <>
        <p>
          hang the heaviest thing first and put your weight on it briefly, hands on the bracket, before you trust it with anything you care about. a fixing that's going to fail early usually tells you in the first minute.
        </p>
        <p>
          then diarize it. garages swing further in temperature and humidity than the rest of the house, and wood moves with them. one pass every few months — a hand on each bracket, a quarter turn on anything that's gone loose, a look at the drywall around each fixing for hairline cracks radiating out. a crack is the wall telling you the load is going into the board and not the stud, and that's the only warning you get.
        </p>
      </>
    ),
    tip: { lab: "the tell", text: "hairline cracks fanning out from a fixing mean the gypsum is carrying weight it was never meant to carry. move the bracket to a stud before it moves itself." }
  }
];

const Check = ({ 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 Checks = () => (
  <section className="sa-steps">
    <div className="sa-steps-wrap">
      <header className="sa-steps-head">
        <h2>
          Five questions. <em>The wall answers all of them.</em>
        </h2>
        <span className="count">05 CHECKS | WHERE, WHAT, HOW, HOW FAR OUT, LATER</span>
      </header>
      {CHECKS.map((c) => (
        <Check key={c.n} data={c} />
      ))}
    </div>
  </section>
);

const Postmortem = () => (
  <section className="sa-redo">
    <div className="sa-redo-wrap">
      <div className="sa-redo-side">
        it holds for months, then it doesn't
        <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>
          Nothing snaps. <em>The wall just gives up slowly.</em>
        </h2>
        <p>
          the reason bad garage storage fools everyone is that it doesn't fail on day one, which would be useful. it fails on a schedule you can't see. every time you lift the bike off and put it back, the anchor works the hole a fraction bigger. the gypsum around it powders. the fixing goes from tight to nearly tight to slightly proud of the wall, and none of those stages look like anything from six feet away.
        </p>
        <p>
          <strong>Then it's on the floor.</strong> and what comes down with it is a cone of crumbled board — which is the giveaway, because the hardware is usually fine. the screw is intact, the anchor is intact. what failed is the half-inch of chalk they were living in.
        </p>
        <p>
          <strong>The repair costs more than doing it right.</strong> patching a torn-out anchor hole is filler, tape, sanding, spot priming and paint that won't match, and you still have to hang the thing somewhere afterwards. finding the stud in the first place is ten minutes with a magnet.
        </p>
        <p>
          <strong>And the second failure is the expensive one.</strong> whatever came off the wall lands on whatever is under the wall. mine was concrete and a wheel, which i got away with. the version where it's a car roof is the same physics with a much worse invoice.
        </p>
      </div>
    </div>
  </section>
);

const Verdicts = () => (
  <section className="sa-hottakes">
    <div className="sa-hottakes-wrap">
      <header className="sa-hottakes-head">
        <span className="lab">Sam's verdicts</span>
        <h2>
          Worth it, <em>and not.</em>
        </h2>
      </header>
      <div className="sa-hottakes-list">
        <div className="sa-take">
          <div className="num">i.</div>
          <h3>Worth it: a rail instead of loose hooks</h3>
          <p>
            it spreads the load across studs, it moves when you change your mind, and it stops the wall filling up with abandoned holes from the last three layouts.
          </p>
        </div>
        <div className="sa-take">
          <div className="num">ii.</div>
          <h3>Worth it: a stud finder you trust, plus a magnet</h3>
          <p>
            two methods that disagree is information. the magnet costs nothing, tells you wood from steel in about four seconds, and finds the drywall screws that mark the stud line for you.
          </p>
        </div>
        <div className="sa-take">
          <div className="num">iii.</div>
          <h3>Worth it: the fasteners the system specifies</h3>
          <p>
            they're a few dollars and they're the thing the published rating was measured with. everything else in the jar is a substitution nobody tested.
          </p>
        </div>
        <div className="sa-take">
          <div className="num">iv.</div>
          <h3>Not worth it: plastic expansion anchors in a garage</h3>
          <p>
            fine for a picture frame in a hallway. a garage load is heavier, it gets lifted on and off, and it lives on a wall that moves with the seasons.
          </p>
        </div>
        <div className="sa-take">
          <div className="num">v.</div>
          <h3>Not worth it: the accessory pack before the rail is up</h3>
          <p>
            you will buy the wrong hooks. put the rail on the wall, live with it for a fortnight, then buy the four brackets you actually reach for.
          </p>
        </div>
        <div className="sa-take">
          <div className="num">vi.</div>
          <h3>Not worth it: the high wall for heavy things</h3>
          <p>
            above shoulder height is for light and bulky — camping gear, empty coolers, the tote of holiday decorations. heavy goes low, where you can get it down without a lift you'll regret.
          </p>
        </div>
      </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 kit
      </span>
      <p
        style={{
          fontFamily: "'Playfair Display', serif",
          fontSize: 23,
          lineHeight: 1.35,
          color: "var(--sa-cream)",
          margin: "14px 0 18px"
        }}
      >
        spend on the rail and the fasteners, and be as cheap as you like about the hooks — they're the part you'll replace anyway. a rail long enough to cross at least three studs, the screws the maker specifies, a stud finder, a magnet, and a level. that's the list.
      </p>
      <a
        href="/go/sam-garage-rails"
        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
        }}
      >
        garage rail systems →
      </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>
          The floor was never the problem. <em>The wall was.</em>
        </h2>
        <p>
          a garage gets crowded from the ground up, and the instinct is to go vertical. that instinct is right. it just needs ten minutes of finding out what you're screwing into first, because the wall is the only part of this that gets a vote.
        </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/garage-corner-gym/">
          <span>A real home gym in a garage corner</span>
          <span className="m">SAM</span>
        </a>
        <a href="/en/contributors/sam/how-to-hang-something-heavy-without-asking-anyone-for-help/">
          <span>How to hang something heavy without asking for help</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/">
          <span>All of Sam's guides</span>
          <span className="m">PROFILE</span>
        </a>
      </div>
    </div>
  </section>
);

const Article = () => (
  <div className="sa">
    <Crumbs />
    <Hero />
    <Lede />
    <Ledger />
    <Checks />
    <Postmortem />
    <Verdicts />
    <Affiliate />
    <Signoff />
  </div>
);

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