/* NorthBurnGoods — the brand's own palette and type, carried over from the site it replaces.
   Eyedropped 18 Sep 2026: ground #0E0C0A, burnt amber #C8853A, warm paper #F5EFE0.
   Playfair Display for anything that wants to look engraved, Lora for everything you read. */
:root {
  --ink: #0E0C0A;          /* the ground the whole site sits on */
  --ink-2: #15120F;        /* raised surface */
  --ink-3: #1E1A15;        /* card */
  --amber: #C8853A;        /* the burn colour: CTAs, rules, accents */
  --amber-2: #E0A45C;      /* hover, and text on dark where amber is too dim */
  --paper: #F5EFE0;        /* warm off-white */
  --paper-2: #E8DDD0;      /* body copy on dark */
  --muted: #9C9186;
  --line: rgba(245, 239, 224, .14);
  --line-2: rgba(245, 239, 224, .08);
  --ok: #7FA45C;
  --warn: #C9553D;

  --f-display: "Playfair Display", "Iowan Old Style", Georgia, serif;
  --f-body: Lora, Georgia, serif;
  --f-ui: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;

  --t-xs: .78rem; --t-sm: .88rem; --t-base: 1rem; --t-lg: 1.14rem;
  --t-xl: clamp(1.4rem, 1.1rem + .9vw, 1.9rem);
  --t-2xl: clamp(1.9rem, 1.3rem + 2.2vw, 2.9rem);
  --t-3xl: clamp(2.5rem, 1.4rem + 4.4vw, 4.6rem);

  --wrap: 1200px;
  --r: 14px; --r-sm: 9px; --r-lg: 22px;
  --pad: clamp(1.1rem, 4vw, 2rem);
  --sec: clamp(3.4rem, 8vw, 6.5rem);
  --shadow: 0 18px 50px rgba(0, 0, 0, .45);
}

*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
/* The header is sticky, so anything an anchor or a focus jump scrolls to has to stop short of it,
   or the thing you navigated to lands underneath it. */
:target, h2[id], .field, .wood, [id] { scroll-margin-top: 110px; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; } }

html { overflow-x: clip; }
body {
  margin: 0; background: var(--ink); color: var(--paper-2);
  font-family: var(--f-body); font-size: var(--t-base); line-height: 1.65;
  -webkit-font-smoothing: antialiased; overflow-x: clip;
}
img { max-width: 100%; height: auto; display: block; }
a { color: var(--amber-2); text-decoration-thickness: 1px; text-underline-offset: .18em; }
a:hover { color: var(--paper); }
::selection { background: var(--amber); color: var(--ink); }
:focus-visible { outline: 2px solid var(--amber-2); outline-offset: 3px; border-radius: 3px; }

h1, h2, h3, h4 { font-family: var(--f-display); font-weight: 700; line-height: 1.1; color: var(--paper); margin: 0 0 .5em; letter-spacing: -.01em; }
h1 { font-size: var(--t-3xl); }
h2 { font-size: var(--t-2xl); }
h3 { font-size: var(--t-xl); }
p { margin: 0 0 1.1em; }

.wrap { width: min(var(--wrap), 100% - var(--pad) * 2); margin-inline: auto; }
.section { padding-block: var(--sec); }
.section--paper { background: var(--paper); color: #37302a; }
.section--paper h1, .section--paper h2, .section--paper h3 { color: var(--ink); }
.section--raised { background: var(--ink-2); }
.eyebrow { display: inline-block; font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .18em; text-transform: uppercase; color: var(--amber); margin-bottom: .9rem; font-weight: 600; }
.section--paper .eyebrow { color: #A9682A; }
.lede { font-size: var(--t-lg); color: var(--muted); max-width: 60ch; }
.section--paper .lede { color: #6B6057; }
.muted { color: var(--muted); }
.small { font-size: var(--t-sm); }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* ── buttons ─────────────────────────────────────────────────────────────── */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  font-family: var(--f-ui); font-size: var(--t-sm); font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
  padding: .95rem 1.7rem; border-radius: 999px; border: 1px solid transparent; cursor: pointer;
  /* An <a class="btn"> is transparent by default and a <button class="btn"> is not — without this
     every ghost button rendered as the browser's grey pill with invisible text. */
  background: transparent;
  text-decoration: none; transition: background .18s, color .18s, border-color .18s, transform .18s;
}
.btn:hover { transform: translateY(-1px); }
.btn:disabled { opacity: .5; cursor: not-allowed; transform: none; }
.btn-primary { background: var(--amber); color: #23170B; }
.btn-primary:hover { background: var(--amber-2); color: #23170B; }
.btn-ghost { border-color: var(--line); color: var(--paper); }
.btn-ghost:hover { border-color: var(--amber); color: var(--amber-2); }
.section--paper .btn-ghost { border-color: rgba(14, 12, 10, .2); color: var(--ink); }
.section--paper .btn-ghost:hover { border-color: var(--amber); color: #A9682A; }
.btn-sm { padding: .62rem 1.1rem; font-size: var(--t-xs); }
.btn-block { width: 100%; }

/* ── top bar + header ────────────────────────────────────────────────────── */
.ticker { background: var(--amber); color: #23170B; font-family: var(--f-ui); font-size: var(--t-xs); font-weight: 700; letter-spacing: .14em; text-transform: uppercase; overflow: hidden; }
.ticker_track { display: flex; gap: 3rem; padding: .55rem 0; width: max-content; animation: slide 46s linear infinite; }
.ticker span { white-space: nowrap; }
@keyframes slide { to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) { .ticker_track { animation: none; } }

.hdr { position: sticky; top: 0; z-index: 60; background: rgba(8, 8, 8, .92); backdrop-filter: blur(12px); border-bottom: 1px solid var(--line-2); }
.hdr_in { display: flex; align-items: center; gap: 1.6rem; padding-block: .85rem; }
.brandmark { font-family: var(--f-display); font-size: 1.22rem; font-weight: 700; color: var(--paper); text-decoration: none; letter-spacing: .01em; white-space: nowrap; }
.brandmark b { color: var(--amber); font-weight: 700; }
.nav { display: flex; gap: 1.35rem; margin-left: auto; font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .12em; text-transform: uppercase; }
.nav a { color: var(--paper-2); text-decoration: none; padding-block: .3rem; border-bottom: 1px solid transparent; }
.nav a:hover, .nav a[aria-current] { color: var(--amber-2); border-color: var(--amber); }
.hdr_act { display: flex; align-items: center; gap: .7rem; margin-left: 1rem; }
.cartbtn { position: relative; display: inline-flex; align-items: center; gap: .45rem; background: none; border: 1px solid var(--line); color: var(--paper); border-radius: 999px; padding: .55rem 1rem; font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .1em; text-transform: uppercase; cursor: pointer; }
.cartbtn:hover { border-color: var(--amber); color: var(--amber-2); }
.cartbtn i { font-style: normal; background: var(--amber); color: #23170B; border-radius: 999px; min-width: 1.35em; padding: 0 .3em; font-weight: 700; }
.navtoggle { display: none; background: none; border: 1px solid var(--line); color: var(--paper); border-radius: var(--r-sm); padding: .5rem .7rem; cursor: pointer; margin-left: auto; }

@media (max-width: 1040px) {
  .navtoggle { display: block; }
  .nav { position: fixed; inset: 0 0 0 auto; width: min(320px, 84vw); background: var(--ink-2); flex-direction: column; gap: 0; padding: 5rem 1.4rem 2rem; margin: 0; transform: translateX(100%); transition: transform .25s; border-left: 1px solid var(--line); overflow-y: auto; }
  .nav { visibility: hidden; }
  .nav[data-open] { transform: none; visibility: visible; }
  .nav a { padding: .95rem 0; border-bottom: 1px solid var(--line-2); font-size: var(--t-sm); }
  .hdr_act { margin-left: .4rem; order: 3; }
}

/* ── hero ────────────────────────────────────────────────────────────────── */
.hero { position: relative; padding-block: clamp(3rem, 7vw, 5.5rem) var(--sec); }
.hero_grid { display: grid; grid-template-columns: 1.02fr .98fr; gap: clamp(2rem, 5vw, 4.5rem); align-items: center; }
.hero h1 { margin-bottom: .45em; }
.hero h1 em { font-style: normal; color: var(--amber); display: block; }
.hero_pts { list-style: none; display: flex; flex-wrap: wrap; gap: 1.4rem; padding: 0; margin: 1.8rem 0 0; font-family: var(--f-ui); font-size: var(--t-sm); color: var(--muted); }
.hero_pts li::before { content: "•"; color: var(--amber); margin-right: .5rem; }
.hero_media { position: relative; }
.hero_media img { border-radius: var(--r-lg); box-shadow: var(--shadow); transform: rotate(1.6deg); }
.badge { position: absolute; left: 1.2rem; bottom: 1.2rem; background: rgba(8, 8, 8, .84); backdrop-filter: blur(8px); border: 1px solid var(--line); color: var(--paper); font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .12em; text-transform: uppercase; padding: .55rem 1rem; border-radius: 999px; }
@media (max-width: 900px) { .hero_grid { grid-template-columns: 1fr; } .hero_media { order: -1; } .hero_media img { transform: none; } }

/* ── grids and cards ─────────────────────────────────────────────────────── */
.grid { display: grid; gap: clamp(1.1rem, 2.4vw, 1.9rem); }
.grid--3 { grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); }
.grid--2 { grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); }
.sec_head { margin-bottom: clamp(1.8rem, 4vw, 3rem); max-width: 70ch; }

.card { background: var(--ink-3); border: 1px solid var(--line-2); border-radius: var(--r); overflow: hidden; display: flex; flex-direction: column; transition: border-color .2s, transform .2s; }
.card:hover { border-color: var(--amber); transform: translateY(-3px); }
.card_media { position: relative; aspect-ratio: 4 / 5; overflow: hidden; background: var(--ink-2); }
/* Guide cards carry a 3:2 editorial scene rather than a 4:5 product shot, so the grid does not
   crop the top and bottom out of a landscape photograph. */
.card--guide .card_media { aspect-ratio: 3 / 2; }
.card_media img { width: 100%; height: 100%; object-fit: cover; transition: transform .5s; }
.card:hover .card_media img { transform: scale(1.04); }
.card_tag { position: absolute; top: .8rem; left: .8rem; background: var(--amber); color: #23170B; font-family: var(--f-ui); font-size: .68rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; padding: .32rem .7rem; border-radius: 999px; }
.card_body { padding: 1.3rem; display: flex; flex-direction: column; gap: .55rem; flex: 1; }
.card_body h3 { margin: 0; font-size: 1.28rem; }
.card_body h3 a { color: inherit; text-decoration: none; }
.card_body h3 a:hover { color: var(--amber-2); }
.card_price { font-family: var(--f-ui); color: var(--amber); font-weight: 700; }
.card_price s { color: var(--muted); font-weight: 400; margin-right: .4rem; }
.card_foot { margin-top: auto; padding-top: .7rem; }

.section--paper .card { background: #fff; border-color: rgba(14, 12, 10, .1); }
.section--paper .card_body { color: #4A423B; }

/* ── product page ────────────────────────────────────────────────────────── */
.pdp { display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(1.8rem, 4vw, 3.6rem); align-items: start; }
@media (max-width: 940px) { .pdp { grid-template-columns: 1fr; } }
/* ── product gallery: scrolled, not clicked ──────────────────────────────────
   A scroll-snap track. Swipe on a phone, two-finger swipe or drag on a trackpad,
   arrows or arrow keys with a mouse. The dots report position and can drive it,
   but the scroll position is the single source of truth — so every input agrees. */
.gal { position: relative; }
.gal_track {
  display: flex; overflow-x: auto; overflow-y: hidden;
  scroll-snap-type: x mandatory; scroll-behavior: smooth;
  border-radius: var(--r); border: 1px solid var(--line-2); background: var(--ink-2);
  scrollbar-width: none; -ms-overflow-style: none;
  overscroll-behavior-x: contain;   /* stops a swipe at the end navigating the browser back */
}
.gal_track::-webkit-scrollbar { display: none; }
.gal_track:focus-visible { outline: 2px solid var(--amber-2); outline-offset: 3px; }
.gal_slide { flex: 0 0 100%; margin: 0; scroll-snap-align: center; aspect-ratio: 4 / 5; }
.gal_slide img { width: 100%; height: 100%; object-fit: cover; display: block; }

.gal_arrow {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 42px; height: 42px; border-radius: 50%; cursor: pointer;
  background: rgba(8, 8, 8, .72); border: 1px solid var(--line); color: var(--paper);
  font-size: 1.5rem; line-height: 1; display: grid; place-items: center;
  backdrop-filter: blur(6px); transition: background .18s, opacity .18s; opacity: 0;
}
.gal:hover .gal_arrow, .gal_arrow:focus-visible { opacity: 1; }
.gal_arrow:hover { background: var(--amber); color: #23170B; border-color: var(--amber); }
.gal_arrow--prev { left: .8rem; }
.gal_arrow--next { right: .8rem; }
@media (hover: none) { .gal_arrow { display: none; } }   /* a touch device already has swipe */

.gal_dots { display: flex; gap: .45rem; justify-content: center; margin-top: .85rem; }
.gal_dots button {
  width: 8px; height: 8px; padding: 0; border-radius: 50%; cursor: pointer;
  background: var(--line); border: 0; transition: background .18s, transform .18s;
}
.gal_dots button:hover { background: var(--muted); }
.gal_dots button[aria-current="true"] { background: var(--amber); transform: scale(1.35); }

@media (prefers-reduced-motion: reduce) { .gal_track { scroll-behavior: auto; } }

.buy { position: sticky; top: 92px; }
.price { font-family: var(--f-ui); font-size: 1.85rem; font-weight: 700; color: var(--paper); }
.price small { font-size: var(--t-sm); color: var(--muted); font-weight: 400; margin-left: .5rem; }
.woods { display: grid; grid-template-columns: 1fr 1fr; gap: .7rem; margin: 1.2rem 0; }
.wood { border: 1px solid var(--line); border-radius: var(--r-sm); padding: .85rem; cursor: pointer; display: block; transition: border-color .18s, background .18s; }
.wood:hover { border-color: var(--amber); }
.wood input { position: absolute; opacity: 0; pointer-events: none; }
.wood:has(input:checked) { border-color: var(--amber); background: rgba(200, 133, 58, .1); }
.wood b { display: block; font-family: var(--f-ui); font-size: var(--t-sm); color: var(--paper); }
.wood span { font-size: var(--t-xs); color: var(--muted); }
.wood span { display: block; }
.wood .feat { color: var(--amber); font-family: var(--f-ui); letter-spacing: .04em; margin-top: .15rem; }
.wood em { font-style: normal; display: block; color: var(--amber); font-family: var(--f-ui); font-weight: 700; margin-top: .25rem; }

.field { display: block; margin-bottom: 1rem; }
.field > span { display: block; font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); margin-bottom: .4rem; }
.field input, .field textarea, .field select {
  width: 100%; background: var(--ink-2); border: 1px solid var(--line); color: var(--paper);
  border-radius: var(--r-sm); padding: .78rem .9rem; font-family: var(--f-body); font-size: var(--t-base);
}
.field input:focus, .field textarea:focus, .field select:focus { border-color: var(--amber); outline: none; }
.field .help { display: block; font-size: var(--t-xs); color: var(--muted); margin-top: .35rem; text-transform: none; letter-spacing: 0; }
.field.is-bad input { border-color: var(--warn); }

/* ── engraving preview ───────────────────────────────────────────────────────
   Three layouts, three arrangements. They are not decoration — this is the only
   sight of the wording a buyer gets before it is burned in permanently, so each
   one has to sit the way it sits on the board.

   Split monogram: a large initial with the name struck through it, rules either
   side, the way the photograph shows it. Classic: first names above, surname
   large. Script: "The" above a flowing surname with its apostrophe-s. */
.preview { background: var(--paper); color: var(--ink); border-radius: var(--r); padding: 1.5rem 1.2rem 1.7rem; text-align: center; margin: 1.2rem 0; border: 1px solid var(--line-2); }
.preview > small { display: block; font-family: var(--f-ui); font-size: .66rem; letter-spacing: .18em; text-transform: uppercase; color: #9A8B77; margin-bottom: 1rem; }
.pv_art { position: relative; display: grid; justify-items: center; gap: .1rem; min-height: 4.6rem; }
.pv_line1 { font-family: var(--f-display); font-size: 1.05rem; color: #5C5147; line-height: 1.2; }
.pv_name { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.5rem, 4.4vw, 2.1rem); line-height: 1.1; color: var(--ink); letter-spacing: .01em; word-break: break-word; }
.pv_est { font-family: var(--f-ui); font-size: .7rem; letter-spacing: .28em; text-transform: uppercase; color: #7A6B5A; margin-top: .45rem; }

/* Split monogram: the initial large, the surname struck across its MIDDLE, and the year sitting
   just under the letter — measured off the product photograph rather than guessed. The band at
   half the glyph's height and the year a fifth of a glyph below it are what make the lockup read
   as the board does; sitting the band near the top and pinning the year to the bottom of the box
   left the letter floating in a gap it does not have in the wood. */
.pv--split-monogram .pv_art { min-height: 8.2rem; }
.pv--split-monogram .pv_initial {
  position: absolute; top: 0; left: 50%; transform: translateX(-50%);
  font-family: var(--f-display); font-weight: 700; font-size: 7.4rem; line-height: .92;
  color: var(--ink); pointer-events: none;
}
.pv--split-monogram .pv_name {
  position: absolute; top: 2.85rem; left: 50%; transform: translateX(-50%);
  z-index: 1; display: inline-flex; align-items: center; gap: .7em; white-space: nowrap;
  font-size: clamp(1rem, 2.5vw, 1.24rem); letter-spacing: .2em; text-indent: .2em;
  /* the surname needs the initial cleared behind it, or the strokes read through the letterform */
  text-shadow: 0 0 .5em var(--paper), 0 0 .5em var(--paper), 0 0 .3em var(--paper);
}
.pv--split-monogram .pv_name::before,
.pv--split-monogram .pv_name::after { content: ""; height: 1.5px; width: 3.6em; background: var(--ink); flex: none; }
.pv--split-monogram .pv_est { position: absolute; top: 6.95rem; left: 50%; transform: translateX(-50%); z-index: 1; margin: 0; }

/* script: softer, and set in italic so it is not passed off as the roman face */
.pv--script-lasts .pv_line1 { font-style: italic; font-size: 1.15rem; }
.pv--script-lasts .pv_name { font-style: italic; font-weight: 400; letter-spacing: 0; font-size: clamp(1.7rem, 5vw, 2.5rem); }

.spec { list-style: none; padding: 0; margin: 1.4rem 0 0; font-size: var(--t-sm); }
.spec li { display: flex; justify-content: space-between; gap: 1rem; padding: .62rem 0; border-bottom: 1px solid var(--line-2); }
.spec li b { color: var(--paper); font-family: var(--f-ui); font-weight: 600; }
.spec li span { color: var(--muted); text-align: right; }

/* ── cart drawer ─────────────────────────────────────────────────────────── */
.scrim { position: fixed; inset: 0; background: rgba(0, 0, 0, .66); z-index: 90; opacity: 0; pointer-events: none; transition: opacity .22s; }
.scrim[data-open] { opacity: 1; pointer-events: auto; }
.drawer { visibility: hidden; position: fixed; top: 0; right: 0; bottom: 0; width: min(430px, 92vw); background: var(--ink-2); border-left: 1px solid var(--line); z-index: 100; transform: translateX(100%); transition: transform .26s; display: flex; flex-direction: column; }
.drawer[data-open] { transform: none; visibility: visible; }
.drawer_hd { display: flex; align-items: center; justify-content: space-between; padding: 1.2rem var(--pad); border-bottom: 1px solid var(--line-2); }
.drawer_hd h2 { margin: 0; font-size: 1.25rem; }
.drawer_hd button { background: none; border: 0; color: var(--muted); font-size: 1.5rem; cursor: pointer; line-height: 1; }
.drawer_body { flex: 1; overflow-y: auto; padding: var(--pad); }
.drawer_ft { padding: var(--pad); border-top: 1px solid var(--line-2); }
.ci { display: grid; grid-template-columns: 68px 1fr auto; gap: .85rem; padding-block: 1rem; border-bottom: 1px solid var(--line-2); }
.ci img { width: 68px; aspect-ratio: 1; object-fit: cover; border-radius: var(--r-sm); }
.ci b { display: block; font-family: var(--f-ui); font-size: var(--t-sm); color: var(--paper); }
.ci .ci_pers { font-size: var(--t-xs); color: var(--muted); margin-top: .2rem; }
.ci .ci_rm { background: none; border: 0; color: var(--muted); font-size: var(--t-xs); cursor: pointer; text-decoration: underline; padding: 0; margin-top: .35rem; }
.ci .ci_rm:hover { color: var(--warn); }
.totals { font-family: var(--f-ui); font-size: var(--t-sm); }
.totals div { display: flex; justify-content: space-between; padding: .3rem 0; }
.totals .grand { font-size: 1.15rem; font-weight: 700; color: var(--paper); border-top: 1px solid var(--line-2); margin-top: .5rem; padding-top: .7rem; }

/* ── misc blocks ─────────────────────────────────────────────────────────── */
/* ── how it works: three steps the laser draws ───────────────────────────────
   Two things carry this section.

   The motion is scroll-LINKED, not scroll-triggered. The beam's progress is tied
   to where the section sits in the viewport, so the reader draws it by scrolling
   rather than watching a clip play at them. That is the difference between an
   animation and an interaction, and it is the one technique worth taking from the
   award-site playbook — it needs no library, just animation-timeline.
   A browser without it keeps the old timed version through the .is-lit class.

   The surface is a gradient hairline rather than a flat border, with the step
   numeral ghosted behind the text, so a flat card reads as an object with depth
   without resorting to a drop shadow. */
.steps {
  --step-pad: clamp(1.4rem, 2.8vw, 2rem); --disc: 52px; --gap: clamp(1rem, 2.2vw, 1.6rem);
  --beam: 1.6s; --beam-delay: .15s; --hop: .8s;
  display: grid; grid-template-columns: repeat(auto-fit, minmax(270px, 1fr));
  gap: var(--gap); position: relative;
}

.step {
  position: relative; z-index: 1; isolation: isolate; overflow: hidden;
  border-radius: var(--r); padding: var(--step-pad);
  display: flex; flex-direction: column; gap: .4rem;
  background:
    radial-gradient(120% 80% at 50% -20%, rgba(200,133,58,.10), transparent 62%),
    linear-gradient(180deg, #221D18, #191511);
  transition: transform .26s cubic-bezier(.22,1,.36,1), box-shadow .26s ease;
}
/* gradient hairline: a masked ring, so the border can fade rather than sit flat */
.step::before {
  content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1px; z-index: -1;
  background: linear-gradient(180deg, rgba(200,133,58,.55), rgba(245,239,224,.10) 38%, rgba(245,239,224,.05));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor; mask-composite: exclude;
  transition: background .26s ease;
}
/* the glow follows the cursor across the card */
.step::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit; z-index: -1; opacity: 0;
  background: radial-gradient(360px circle at var(--mx, 50%) var(--my, 0%), rgba(200,133,58,.16), transparent 60%);
  transition: opacity .26s ease;
}
.step:hover { transform: translateY(-4px); box-shadow: 0 20px 44px rgba(0,0,0,.45); }
.step:hover::before { background: linear-gradient(180deg, rgba(224,164,92,.95), rgba(200,133,58,.28) 46%, rgba(245,239,224,.07)); }
.step:hover::after { opacity: 1; }

/* the numeral, ghosted, sitting behind the content */
.step_ghost {
  position: absolute; top: -.22em; right: .06em; z-index: -1; pointer-events: none;
  font-family: var(--f-display); font-weight: 700; font-size: 8.5rem; line-height: 1;
  color: rgba(245, 239, 224, .035); letter-spacing: -.04em;
}
.step_n {
  position: relative; display: grid; place-items: center; width: var(--disc); height: var(--disc);
  border-radius: 50%; margin-bottom: .85rem; flex: none;
  background: linear-gradient(145deg, #E0A45C, #B9762D);
  color: #23170B; font-family: var(--f-ui); font-weight: 700; font-size: var(--t-sm);
  box-shadow: 0 6px 18px rgba(200,133,58,.28), inset 0 1px 0 rgba(255,238,214,.55);
  transition: transform .26s cubic-bezier(.34,1.56,.64,1), box-shadow .26s ease;
}
.step:hover .step_n { transform: translateY(-2px) scale(1.06); box-shadow: 0 10px 26px rgba(200,133,58,.45), inset 0 1px 0 rgba(255,238,214,.7); }
.step_n::after {
  content: ""; position: absolute; inset: -6px; border-radius: 50%; opacity: 0;
  box-shadow: 0 0 0 0 rgba(224,164,92,.75);
}
.step h3 { margin: 0; font-size: clamp(1.2rem, .7vw + 1.05rem, 1.42rem); }
.step p { margin: 0; color: var(--muted); font-size: var(--t-sm); line-height: 1.62; }

/* ── the beam ─────────────────────────────────────────────────────────────── */
.steps_track {
  position: absolute; z-index: 0; pointer-events: none;
  top: calc(var(--step-pad) + var(--disc) / 2);
  left: calc(var(--step-pad) + var(--disc) / 2);
  /* disc 3 is inset from CARD 3's left edge, not the container's right edge */
  right: calc((100% - 2 * var(--gap)) / 3 - var(--step-pad) - var(--disc) / 2);
  height: 2px;
}
.steps_beam {
  position: absolute; inset: 0; border-radius: 2px;
  background: linear-gradient(90deg, rgba(200,133,58,.72), rgba(200,133,58,.3));
  transform: scaleX(0); transform-origin: left center;
}
.steps_ember {
  position: absolute; top: 50%; left: 0; width: 30px; height: 30px; margin: -15px 0 0 -15px;
  border-radius: 50%; opacity: 0;
  background: radial-gradient(circle, #FFF6E6 0%, #FFC978 24%, rgba(200,133,58,.5) 52%, rgba(200,133,58,0) 72%);
}
@keyframes beamDraw { to { transform: scaleX(1); } }
@keyframes emberTravel {
  0%   { left: 0; opacity: 0; transform: scale(.5); }
  7%   { opacity: 1; transform: scale(1); }
  90%  { opacity: 1; transform: scale(1); }
  100% { left: 100%; opacity: 0; transform: scale(.45); }
}
@keyframes stepIn { from { opacity: 0; transform: translateY(26px); } to { opacity: 1; transform: none; } }
@keyframes discPop { from { transform: scale(.5); } to { transform: none; } }
@keyframes discFlare {
  0%   { opacity: 1; box-shadow: 0 0 0 0 rgba(224,164,92,.75); }
  100% { opacity: 0; box-shadow: 0 0 0 22px rgba(224,164,92,0); }
}

/* Scroll-linked: the reader draws the beam. Ranges are staggered per card so each
   one arrives as the ember reaches its disc, exactly as the timed version did. */
@supports (animation-timeline: view()) {
  /* Ranges are in `cover`, not `entry`. Entry spans only the moment the section is crossing the
     viewport edge, which on a short section is a few dozen pixels — the whole sequence finished
     almost at once and the stagger disappeared. Cover spans the entire time the section is on
     screen, so the beam takes real scrolling to draw. */
  .steps_beam, .steps_ember { animation-timeline: view(); animation-duration: auto; animation-range: cover 12% cover 62%; animation-fill-mode: both; animation-timing-function: linear; }
  .steps_beam { animation-name: beamDraw; }
  .steps_ember { animation-name: emberTravel; }
  /* Duration must stay `auto` on a scroll timeline — auto is what maps the animation onto the
     range. The `animation:` shorthand resets it to 0s, which silently produces an animation that
     has no extent: currentTime advances, progress reads null, and the element simply never
     animates. Set the longhands instead. */
  .step, .step_n, .step_n::after {
    animation-timeline: view(); animation-duration: auto;
    animation-timing-function: linear; animation-fill-mode: both;
  }
  .step {
    opacity: 0; animation-name: stepIn;
    animation-range: cover calc(10% + var(--i) * 17%) cover calc(30% + var(--i) * 17%);
  }
  .step_n { animation-name: discPop; animation-range: cover calc(16% + var(--i) * 17%) cover calc(32% + var(--i) * 17%); }
  .step_n::after { animation-name: discFlare; animation-range: cover calc(18% + var(--i) * 17%) cover calc(44% + var(--i) * 17%); }
}

/* Fallback: the timed sequence, fired once by the observer. */
@supports not (animation-timeline: view()) {
  .step { opacity: 0; }
  .steps.is-lit .steps_beam { animation: beamDraw var(--beam) linear var(--beam-delay) forwards; }
  .steps.is-lit .steps_ember { animation: emberTravel var(--beam) linear var(--beam-delay) forwards; }
  .steps.is-lit .step { animation: stepIn .6s cubic-bezier(.22,1,.36,1) calc(var(--beam-delay) + var(--i) * var(--hop) - .22s) forwards; }
  .steps.is-lit .step_n { animation: discPop .5s cubic-bezier(.34,1.56,.64,1) calc(var(--beam-delay) + var(--i) * var(--hop)) both; }
  .steps.is-lit .step_n::after { animation: discFlare .85s ease-out calc(var(--beam-delay) + var(--i) * var(--hop)) forwards; }
}

/* Stacked, the beam would connect cards it no longer sits between. */
@media (max-width: 900px) {
  .steps_track { display: none; }
  .step_ghost { font-size: 6.5rem; }
}

@media (prefers-reduced-motion: reduce) {
  .steps_beam { transform: scaleX(1); animation: none; }
  .steps_ember { display: none; }
  .step, .step_n, .step_n::after { animation: none !important; opacity: 1; transform: none; }
  .step_n::after { display: none; }
  .step:hover { transform: none; }
}

.rev { background: var(--ink-3); border: 1px solid var(--line-2); border-radius: var(--r); padding: 1.5rem; }
.rev .stars { color: var(--amber); letter-spacing: .12em; margin-bottom: .6rem; }
.rev blockquote { margin: 0 0 .9rem; font-size: var(--t-base); color: var(--paper-2); }
.rev cite { font-style: normal; font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }
.qa { border-bottom: 1px solid var(--line-2); }
.qa summary { cursor: pointer; padding: 1.1rem 0; font-family: var(--f-display); font-size: 1.12rem; color: var(--paper); list-style: none; display: flex; justify-content: space-between; gap: 1rem; }
.qa summary::-webkit-details-marker { display: none; }
.qa summary::after { content: "+"; color: var(--amber); font-family: var(--f-ui); }
.qa[open] summary::after { content: "–"; }
.qa p { margin: 0 0 1.2rem; color: var(--muted); max-width: 72ch; }

.prose { max-width: 70ch; }
.prose h2 { margin-top: 2.2em; }
.prose ul, .prose ol { padding-left: 1.2em; }
.prose li { margin-bottom: .45em; }
.prose table { width: 100%; border-collapse: collapse; margin: 1.6em 0; font-size: var(--t-sm); }
.prose th, .prose td { text-align: left; padding: .7rem .8rem; border-bottom: 1px solid var(--line-2); }
.prose th { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .1em; text-transform: uppercase; color: var(--amber); }

.crumbs { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin-bottom: 1.4rem; }
.crumbs a { color: var(--muted); text-decoration: none; }
.crumbs a:hover { color: var(--amber-2); }

.note { border-left: 2px solid var(--amber); padding: .2rem 0 .2rem 1rem; color: var(--muted); font-size: var(--t-sm); }
.notice { border: 1px solid var(--line); border-radius: var(--r-sm); padding: .8rem 1rem; font-size: var(--t-sm); margin: 1rem 0; }
.notice.ok { border-color: var(--ok); color: var(--ok); }
.notice.warn { border-color: var(--warn); color: #E9927E; }

/* ── email capture ───────────────────────────────────────────────────────── */
.signup { display: flex; gap: .6rem; flex-wrap: wrap; margin-top: 1.2rem; }
.signup input { flex: 1 1 15rem; background: rgba(245, 239, 224, .06); border: 1px solid var(--line); color: var(--paper); border-radius: 999px; padding: .9rem 1.3rem; font-family: var(--f-body); }
.signup input:focus { border-color: var(--amber); outline: none; }
.section--paper .signup input { background: #fff; border-color: rgba(14, 12, 10, .16); color: var(--ink); }

/* ── footer ──────────────────────────────────────────────────────────────── */
.ftr { background: #080706; border-top: 1px solid var(--line-2); padding-block: clamp(2.6rem, 6vw, 4rem) 2rem; }
.ftr_grid { display: grid; grid-template-columns: 1.6fr repeat(3, 1fr); gap: 2rem; }
@media (max-width: 800px) { .ftr_grid { grid-template-columns: 1fr 1fr; } }
.ftr h4 { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .16em; text-transform: uppercase; color: var(--amber); margin-bottom: .9rem; }
.ftr ul { list-style: none; padding: 0; margin: 0; font-size: var(--t-sm); }
.ftr li { margin-bottom: .5rem; }
.ftr a { color: var(--muted); text-decoration: none; }
.ftr a:hover { color: var(--paper); }
.ftr_btm { margin-top: 2.4rem; padding-top: 1.4rem; border-top: 1px solid var(--line-2); display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; font-size: var(--t-xs); color: var(--muted); }

/* ── hero motion ─────────────────────────────────────────────────────────────
   The brand burns names into wood, so the headline does the same thing: the
   word "personal" is engraved on load — raw wood underneath, a travelling ember
   at the burn point, and the finished amber left behind it.

   Everything here is transform, opacity and clip-path, so none of it touches
   layout and none of it delays the hero image. Both copies of the word are in
   the DOM at full size from the first paint, so there is no shift when it runs.
   The whole thing is switched off under prefers-reduced-motion — an animation
   that says "engraved" is not worth making someone ill. */

/* headline line: clips up from below */
.burnline { --burn: 1.35s; }
.burnline .ln { display: block; overflow: hidden; }
.burnline .ln > span { display: block; transform: translateY(105%); animation: lnUp .95s cubic-bezier(.22, 1, .36, 1) .1s forwards; }
@keyframes lnUp { to { transform: none; } }

/* the word being engraved */
/* fit-content matters: the ember travels 0 -> 100% of this box, so the box has to be the
   width of the word and not the width of the column, or the laser runs off past the end. */
.burn { position: relative; display: block; width: fit-content; max-width: 100%; font-style: normal; isolation: isolate; }
/* Raw wood: the word before the laser reaches it. A pseudo-element rather than a second span, so
   the word exists exactly once in the HTML — a crawler and a find-in-page both see one "personal",
   not two. It is also what gives .burn its width, with the burnt copy absolutely on top. */
.burn::before { content: attr(data-word); display: block; color: #4A3A28; }
.burn_hot { display: block; }
/* the burn, wiped in left to right over the raw layer */
.burn_hot {
  position: absolute; inset: 0; color: var(--amber);
  clip-path: inset(0 100% 0 0);
  animation: burnIn var(--burn) cubic-bezier(.65, .02, .35, 1) .55s forwards;
  text-shadow: 0 0 22px rgba(200, 133, 58, .38);
}
@keyframes burnIn { to { clip-path: inset(0 -2% 0 0); } }

/* the laser point, riding the edge of the wipe */
.burn_ember {
  position: absolute; top: 50%; left: 0; width: 20px; height: 20px; margin: -10px 0 0 -10px;
  border-radius: 50%; pointer-events: none; opacity: 0;
  background: radial-gradient(circle, #FFF3DF 0%, #FFC978 28%, rgba(200, 133, 58, .55) 55%, rgba(200, 133, 58, 0) 72%);
  animation: emberRun var(--burn) cubic-bezier(.65, .02, .35, 1) .55s forwards;
  filter: blur(.4px);
}
@keyframes emberRun {
  0%   { left: 0; opacity: 0; transform: scale(.5); }
  9%   { opacity: 1; transform: scale(1); }
  88%  { opacity: 1; transform: scale(1); }
  100% { left: 100%; opacity: 0; transform: scale(.4); }
}

/* everything else in the hero rises in behind it, on its own --d delay */
.rise { opacity: 0; transform: translateY(14px); animation: riseUp .8s cubic-bezier(.22, 1, .36, 1) var(--d, .2s) forwards; }
@keyframes riseUp { to { opacity: 1; transform: none; } }

/* the photograph settles rather than appearing */
.hero_media img { animation: settle 1.5s cubic-bezier(.22, 1, .36, 1) both; }
@keyframes settle { from { opacity: 0; transform: rotate(1.6deg) scale(1.06); } to { opacity: 1; transform: rotate(1.6deg) scale(1); } }
@media (max-width: 900px) { @keyframes settle { from { opacity: 0; transform: scale(1.06); } to { opacity: 1; transform: none; } } }
.hero_media .badge { opacity: 0; animation: riseUp .7s cubic-bezier(.22, 1, .36, 1) 1.5s forwards; }

/* No motion: show the finished state, immediately, with nothing moving. */
@media (prefers-reduced-motion: reduce) {
  .burnline .ln > span { transform: none; animation: none; }
  .burn_hot { clip-path: none; animation: none; text-shadow: none; }
  .burn_ember { display: none; }
  .rise, .hero_media .badge { opacity: 1; transform: none; animation: none; }
  .hero_media img { animation: none; opacity: 1; }
}

/* ── workshop status strip ───────────────────────────────────────────────────
   A real clock and a real open/closed state, computed from the hours in
   src/site.json. It sits above the footer on every page. Hidden until the
   script fills it, so nobody ever sees "--:--:--" or a stale state. */
.ws { background: var(--ink-2); border-top: 1px solid var(--line-2); border-bottom: 1px solid var(--line-2); font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }
.ws_in { display: flex; align-items: center; gap: clamp(1rem, 3vw, 2.6rem); padding-block: .85rem; flex-wrap: wrap; }
.ws_item { display: inline-flex; align-items: center; gap: .5rem; white-space: nowrap; }
.ws_item b { color: var(--paper); font-weight: 600; }
.ws_item a { color: var(--amber); text-decoration: none; }
.ws_item a:hover { color: var(--amber-2); }
.ws_clock { font-variant-numeric: tabular-nums; }        /* stops the strip twitching every second */
.ws_item:last-child { margin-left: auto; }
.ws_dot { width: 7px; height: 7px; border-radius: 50%; background: var(--muted); flex: none; }
.ws_dot[data-on="yes"] { background: var(--ok); box-shadow: 0 0 0 0 rgba(127, 164, 92, .6); animation: pulse 2.4s ease-out infinite; }
@keyframes pulse { 70% { box-shadow: 0 0 0 7px rgba(127, 164, 92, 0); } 100% { box-shadow: 0 0 0 0 rgba(127, 164, 92, 0); } }
@media (max-width: 720px) { .ws_hide { display: none; } .ws_item:last-child { margin-left: 0; } }

/* ── headings engrave as they arrive ─────────────────────────────────────────
   The same idea as the hero: raw wood, then the burn wipes across. Done with a
   gradient clipped to the text, so it works on any length of heading without
   duplicating the words anywhere.

   The colour is only made transparent inside @supports. Without that guard, a
   browser that cannot clip a background to text would paint an invisible
   heading — a decoration is never worth losing the words for. */
@supports ((-webkit-background-clip: text) or (background-clip: text)) {
  .engrave {
    background-image: linear-gradient(90deg, var(--paper) 0 50%, #4A3A28 50% 100%);
    background-size: 200% 100%; background-position: 100% 0;
    -webkit-background-clip: text; background-clip: text;
    color: transparent; -webkit-text-fill-color: transparent;
    transition: background-position 1.15s cubic-bezier(.65, .02, .35, 1);
  }
  .engrave--dark, .section--paper .engrave { background-image: linear-gradient(90deg, var(--ink) 0 50%, #C9BBA6 50% 100%); }
  .engrave.is-in { background-position: 0 0; }
}

@media (prefers-reduced-motion: reduce) {
  .engrave { transition: none; background-position: 0 0; }
  .ws_dot[data-on="yes"] { animation: none; }
}

/* The mark sits beside the wordmark, header and footer. The wordmark is wrapped in its own
   <span> deliberately: as bare text nodes in a flex container the three parts of NORTHBURNGOODS
   each became a flex item and the gap split them into "NORTH BURN GOODS". */
.brandmark { display: inline-flex; align-items: center; gap: .62rem; }
.brandmark img { flex: none; }
.brandmark > span { white-space: nowrap; }
@media (max-width: 520px) { .brandmark { font-size: 1.05rem; gap: .5rem; } .brandmark img { width: 28px; height: 28px; } }

/* ── the two woods, shown rather than described ──────────────────────────────
   Small footprint on purpose: this sits between the product grid and the how-it-
   works steps, so it has to inform without becoming a second product section.
   The photographs are cropped 16:10 rather than square — the boards are landscape
   objects, so the wide crop both suits them and costs a third of the height. */
.section--tight { padding-block: clamp(2.6rem, 5vw, 4rem); }
.sec_head--center { text-align: center; margin-inline: auto; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); }
.sec_head--center .lede { margin-inline: auto; }

.woodcards { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: clamp(1rem, 2.2vw, 1.6rem); }
.wc { display: flex; flex-direction: column; background: #fff; border: 1px solid rgba(14, 12, 10, .09); border-radius: var(--r); overflow: hidden; transition: border-color .2s, transform .2s, box-shadow .2s; }
.wc:hover { border-color: var(--amber); transform: translateY(-2px); box-shadow: 0 12px 30px rgba(14, 12, 10, .08); }
.wc_media { display: block; aspect-ratio: 16 / 10; overflow: hidden; background: #EFE8DC; }
.wc_media img { width: 100%; height: 100%; object-fit: cover; transition: transform .5s; }
.wc:hover .wc_media img { transform: scale(1.03); }
.wc_body { padding: 1rem 1.15rem 1.15rem; display: flex; flex-direction: column; gap: .3rem; flex: 1; color: #4A423B; }
.wc_body h3 { margin: 0; font-size: 1.22rem; display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; }
.wc_price { font-family: var(--f-ui); font-weight: 700; font-size: 1.05rem; color: #A9682A; white-space: nowrap; }
.wc_dims { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .09em; text-transform: uppercase; color: #8B8078; margin: 0; }
.wc_for { margin: .45rem 0 0; font-size: var(--t-sm); line-height: 1.5; }
.wc_more { margin-top: 1.4rem; text-align: center; }

/* ── header at phone widths ──────────────────────────────────────────────────
   The row overflowed: brandmark + hamburger + a text cart button did not fit in
   359px of usable width, and with overflow clipped at the root the cart was
   simply cut off the screen — the one control a customer needs to check out.
   The word "Cart" gives way to the glyph, the gaps tighten, and the hamburger
   moves to the far right where a thumb expects it. */
.cartbtn_ico { flex: none; }
@media (max-width: 560px) {
  .hdr_in { gap: .55rem; }
  .hdr_act { margin-left: auto; order: 2; }
  .navtoggle { order: 3; margin-left: 0; }
  .cartbtn { padding: .5rem .72rem; gap: .38rem; }
  .cartbtn_txt { display: none; }          /* the glyph carries it; the count still shows */
  .brandmark { font-size: .98rem; letter-spacing: 0; }
}
@media (max-width: 360px) {
  .brandmark > span { font-size: .88rem; }
  .brandmark img { width: 24px; height: 24px; }
}



/* ── arrives-by, and the gift options ────────────────────────────────────────
   The arrival strip is hidden in the HTML and revealed by script once the date
   is computed. These pages are static, so the alternative is a baked-in date
   that is wrong by the next morning — better to show nothing for a frame than a
   date a gift buyer will plan around and miss. */
.arrival {
  display: flex; align-items: center; gap: .55rem; flex-wrap: wrap;
  margin: .9rem 0 0; padding: .7rem .9rem; border-radius: var(--r-sm);
  background: rgba(127, 164, 92, .08); border: 1px solid rgba(127, 164, 92, .26);
  font-family: var(--f-ui); font-size: var(--t-sm); color: var(--paper-2);
}
.arrival b { color: var(--paper); font-weight: 600; }
.arrival_dot { width: 7px; height: 7px; border-radius: 50%; background: var(--ok); flex: none; }
.arrival_urg { color: var(--amber-2); font-size: var(--t-xs); letter-spacing: .04em; }
.arrival_urg::before { content: "·"; margin-right: .5rem; color: var(--muted); }
.arrival--tight { margin: 0 0 .9rem; padding: .55rem .75rem; font-size: var(--t-xs); }
.section--paper .arrival { color: #4A423B; }
.section--paper .arrival b { color: var(--ink); }

.gift { margin: 0 0 1rem; border: 1px solid var(--line); border-radius: var(--r-sm); overflow: hidden; }
.gift_toggle { display: flex; gap: .7rem; align-items: flex-start; padding: .85rem .9rem; cursor: pointer; }
.gift_toggle input { margin-top: .2rem; accent-color: var(--amber); flex: none; width: 17px; height: 17px; }
.gift_toggle b { display: block; font-family: var(--f-ui); font-size: var(--t-sm); color: var(--paper); }
.gift_toggle small { display: block; color: var(--muted); font-size: var(--t-xs); margin-top: .15rem; }
.gift_panel { padding: 0 .9rem .9rem; border-top: 1px solid var(--line-2); padding-top: .8rem; }
.gift_panel textarea { resize: vertical; min-height: 4.4rem; }
.gift_line { color: var(--amber-2); }
.section--paper .gift_toggle b { color: var(--ink); }
.section--paper .gift_toggle small, .section--paper .gift_panel .help { color: #6B6057; }

/* ── first-order offer ───────────────────────────────────────────────────────
   Desktop gets the split panel. Mobile gets a bottom sheet instead, and that is
   not a style choice: Google treats a full-screen interstitial on a phone as an
   intrusive one and it can cost you rankings. The sheet covers a strip, not the
   page, so the content behind it stays readable and reachable. */
/* A scrim, so the panel reads as a layer over the page rather than a card floating on it — and
   so clicking beside it closes it, which is where most people click first. */
.offer_scrim {
  position: fixed; inset: 0; z-index: 119; background: rgba(8, 7, 6, .62);
  backdrop-filter: blur(2px); opacity: 0; pointer-events: none; transition: opacity .3s ease;
}
.offer_scrim[data-open] { opacity: 1; pointer-events: auto; }

.offer {
  position: fixed; z-index: 120; overflow: hidden;
  background: var(--paper); color: #37302a;
  box-shadow: 0 30px 90px rgba(0, 0, 0, .55);
  opacity: 0; pointer-events: none;
  transition: opacity .3s ease, transform .35s cubic-bezier(.22, 1, .36, 1);
}
.offer[data-open] { opacity: 1; pointer-events: auto; }

@media (min-width: 761px) {
  .offer {
    top: 50%; left: 50%; width: min(880px, 92vw);
    display: grid; grid-template-columns: 1fr 1.15fr;
    border-radius: var(--r-lg);
    transform: translate(-50%, -46%) scale(.97);
  }
  .offer[data-open] { transform: translate(-50%, -50%) scale(1); }
  .offer_media { background: var(--ink); }
  .offer_media img { width: 100%; height: 100%; object-fit: cover; }
}
@media (max-width: 760px) {
  .offer {
    left: 0; right: 0; bottom: 0; border-radius: var(--r-lg) var(--r-lg) 0 0;
    transform: translateY(105%); max-height: 72vh; overflow-y: auto;
  }
  .offer[data-open] { transform: none; }
  .offer_media { display: none; }
}

.offer_body { padding: clamp(1.6rem, 3.4vw, 2.6rem); position: relative; }
.offer_body .eyebrow { color: #A9682A; }
.offer_body h2 { color: var(--ink); font-size: clamp(1.7rem, 2.4vw + 1rem, 2.5rem); margin-bottom: .5rem; }
.offer_body > p { color: #5C5147; margin-bottom: 1.2rem; }
.offer_x {
  position: absolute; top: .9rem; right: .9rem; width: 38px; height: 38px; border-radius: 50%;
  background: #fff; border: 1px solid rgba(14, 12, 10, .12); color: #5C5147;
  font-size: 1.35rem; line-height: 1; cursor: pointer; display: grid; place-items: center;
}
.offer_x:hover { border-color: var(--amber); color: var(--ink); }
.offer_form { display: flex; gap: .6rem; flex-wrap: wrap; }
.offer_form input {
  flex: 1 1 13rem; background: #fff; border: 1px solid rgba(14, 12, 10, .18);
  border-radius: 999px; padding: .95rem 1.3rem; font-family: var(--f-body); color: var(--ink);
}
.offer_form input:focus { border-color: var(--amber); outline: none; }
.offer_msg { margin: .9rem 0 0; font-size: var(--t-sm); }
.offer_msg.ok { color: #4F7A33; }
.offer_msg.bad { color: var(--warn); }
.offer_no {
  display: inline-block; margin-top: 1rem; background: none; border: 0; padding: 0;
  color: #6B6057; font-family: var(--f-body); font-size: var(--t-sm); text-decoration: underline;
  text-underline-offset: .2em; cursor: pointer;
}
.offer_no:hover { color: var(--ink); }
.offer_fine { margin: .9rem 0 0; font-size: var(--t-xs); color: #8B8078; }

@media (prefers-reduced-motion: reduce) { .offer { transition: opacity .2s ease; transform: none !important; } }

/* ── back to top ─────────────────────────────────────────────────────────────
   Bottom right, appearing once there is enough page behind you to be worth
   skipping. z-index sits below the cart drawer and the offer, so it dims behind
   their scrims rather than floating on top of them.
   The inset uses env(safe-area-inset-*) so it clears the home indicator on an
   iPhone instead of sitting under it. */
.totop {
  position: fixed; z-index: 55;
  right: calc(1.1rem + env(safe-area-inset-right, 0px));
  bottom: calc(1.1rem + env(safe-area-inset-bottom, 0px));
  width: 46px; height: 46px; border-radius: 50%;
  display: grid; place-items: center; cursor: pointer;
  background: rgba(21, 18, 15, .92); backdrop-filter: blur(8px);
  border: 1px solid var(--line); color: var(--paper-2);
  opacity: 0; pointer-events: none; transform: translateY(10px) scale(.94);
  transition: opacity .25s ease, transform .25s cubic-bezier(.22, 1, .36, 1), border-color .2s, color .2s, background .2s;
}
.totop[data-show] { opacity: 1; pointer-events: auto; transform: none; }
.totop:hover { border-color: var(--amber); color: var(--amber-2); background: rgba(30, 26, 21, .96); }
.totop:active { transform: translateY(1px); }
@media (max-width: 560px) { .totop { width: 42px; height: 42px; right: .85rem; bottom: calc(.85rem + env(safe-area-inset-bottom, 0px)); } }
@media (prefers-reduced-motion: reduce) { .totop { transition: opacity .2s ease; transform: none !important; } }

/* ── hero video ──────────────────────────────────────────────────────────────
   Same box as the photograph it replaces, so swapping one for the other costs no
   layout. The poster carries the first paint; the file itself is preload="none"
   and only fetched once the element is actually in view. */
.hero_vid {
  width: 100%; height: auto; display: block;
  border-radius: var(--r-lg); box-shadow: var(--shadow); transform: rotate(1.6deg);
  aspect-ratio: 896 / 1120; object-fit: cover; background: var(--ink-2);
}
@media (max-width: 900px) { .hero_vid { transform: none; } }
@media (prefers-reduced-motion: reduce) { .hero_vid { transform: none; } }

/* ── back office ─────────────────────────────────────────────────────────── */
.adm_filters { display: flex; gap: .5rem; flex-wrap: wrap; }
.adm_filters .chip { background: none; border: 1px solid var(--line); color: var(--paper-2); border-radius: 999px; padding: .5rem 1rem; font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .08em; text-transform: uppercase; cursor: pointer; display: inline-flex; gap: .45rem; align-items: center; }
.adm_filters .chip[aria-pressed="true"] { border-color: var(--amber); color: var(--amber-2); }
.adm_filters .chip i { font-style: normal; background: var(--amber); color: #23170B; border-radius: 999px; min-width: 1.5em; padding: 0 .35em; font-weight: 700; }

.ord { background: var(--ink-3); border: 1px solid var(--line-2); border-radius: var(--r); padding: 1.1rem 1.2rem; margin-bottom: .9rem; }
.ord_hd { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; margin-bottom: .9rem; font-family: var(--f-ui); font-size: var(--t-sm); }
.ord_hd b { color: var(--paper); letter-spacing: .06em; }
.ord_when { color: var(--muted); font-size: var(--t-xs); }
.ord_total { margin-left: auto; color: var(--amber); font-weight: 700; }
.ord_state { font-size: .62rem; letter-spacing: .14em; text-transform: uppercase; padding: .25rem .6rem; border-radius: 999px; border: 1px solid var(--line); color: var(--muted); }
.ord_state--new { border-color: var(--amber); color: var(--amber-2); }
.ord_state--engraved { border-color: #6E86B8; color: #9DB2DC; }
.ord_state--shipped { border-color: var(--ok); color: #A6C98A; }
.ord_grid { display: grid; grid-template-columns: 1.4fr 1fr; gap: 1.4rem; }
@media (max-width: 720px) { .ord_grid { grid-template-columns: 1fr; gap: .9rem; } }
.ord h4 { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .12em; text-transform: uppercase; color: var(--amber); margin: 0 0 .5rem; }
.ord_eng { margin: 0 0 .6rem; font-size: var(--t-sm); color: var(--paper-2); }
.ord_eng b { color: var(--paper); font-family: var(--f-ui); }
.ord_gift { margin: .6rem 0 0; padding-top: .6rem; border-top: 1px solid var(--line-2); font-size: var(--t-sm); color: var(--amber-2); }
.ord_act { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; margin-top: 1rem; padding-top: .9rem; border-top: 1px solid var(--line-2); }
.ord_track, .ord_carrier { background: var(--ink-2); border: 1px solid var(--line); color: var(--paper); border-radius: var(--r-sm); padding: .5rem .7rem; font-family: var(--f-ui); font-size: var(--t-sm); }
.ord_track { flex: 1 1 13rem; } .ord_carrier { width: 6.5rem; }

/* ── back office chrome ─────────────────────────────────────────────────────
   The admin does not wear the shopfront. No ticker, no shop nav, and above all no cart badge —
   a cart count on a fulfilment screen reads as "you have an order to place", which is the
   opposite of what the page is for. */
body.bare { background: var(--ink); }
body.bare #main { padding-top: 0; }
.adm_bar { display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: .85rem clamp(1rem, 4vw, 2.4rem); border-bottom: 1px solid var(--line-2); background: var(--ink-2); }
.adm_bar_brand { display: inline-flex; align-items: center; gap: .6rem; text-decoration: none;
  font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .16em; text-transform: uppercase; color: var(--paper-2); }
.adm_bar_brand img { display: block; }
.adm_bar_nav { display: flex; align-items: center; gap: 1rem; font-family: var(--f-ui); font-size: var(--t-xs);
  letter-spacing: .1em; text-transform: uppercase; }
.adm_bar_nav a { color: var(--muted); text-decoration: none; }
.adm_bar_nav a:hover { color: var(--amber-2); }
.adm_out { background: none; border: 1px solid var(--line); color: var(--muted); border-radius: 999px;
  padding: .4rem .9rem; font: inherit; letter-spacing: .1em; text-transform: uppercase; cursor: pointer; }
.adm_out:hover { border-color: var(--amber); color: var(--amber-2); }

/* toolbar: filters on the left, find + refresh on the right, stacking on a phone */
.adm_tools { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; }
.adm_find { display: flex; gap: .4rem; align-items: center; }
.adm_find input { background: var(--ink-3); border: 1px solid var(--line); color: var(--paper);
  border-radius: 999px; padding: .5rem 1rem; font-family: var(--f-ui); font-size: var(--t-sm); min-width: 15rem; }
.adm_find input::placeholder { color: var(--muted); }
.adm_find input:focus-visible { outline: 2px solid var(--amber); outline-offset: 1px; }
.adm_reload { background: none; border: 1px solid var(--line); color: var(--muted); border-radius: 999px;
  width: 2.2rem; height: 2.2rem; font-size: 1rem; line-height: 1; cursor: pointer; }
.adm_reload:hover { border-color: var(--amber); color: var(--amber-2); }
.adm_reload[disabled] { opacity: .5; cursor: wait; }
.adm_copy { margin-top: .5rem; background: none; border: 1px solid var(--line); color: var(--muted);
  border-radius: 999px; padding: .35rem .8rem; font-family: var(--f-ui); font-size: var(--t-xs);
  letter-spacing: .08em; text-transform: uppercase; cursor: pointer; }
.adm_copy:hover { border-color: var(--amber); color: var(--amber-2); }
@media (max-width: 560px) {
  .adm_find { width: 100%; }
  .adm_find input { min-width: 0; flex: 1; }
  .ord_act .btn { width: 100%; }
}

/* ── bulk and corporate ─────────────────────────────────────────────────── */
.vh { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
/* the honeypot: off-screen rather than display:none, because some bots skip hidden fields */
.hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

/* position:relative is load-bearing: it makes this the containing block for the visually-hidden
   header inside the table. Without it that absolutely-positioned span escapes the scroll
   container entirely and widens the whole document by 63px on a phone. */
.tier_wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; position: relative; }
.tier { width: 100%; border-collapse: collapse; font-family: var(--f-ui); min-width: 32rem; }
.tier th, .tier td { text-align: left; padding: .95rem 1rem; border-bottom: 1px solid var(--line-2); }
.tier thead th { font-size: var(--t-xs); letter-spacing: .12em; text-transform: uppercase; color: var(--amber);
  border-bottom-color: var(--line); }
.tier tbody th { color: var(--paper); font-weight: 600; font-size: var(--t-sm); white-space: nowrap; }
.tier td b { color: var(--paper); font-size: var(--t-md); }
.tier td s { color: var(--muted); font-size: var(--t-xs); margin-left: .5rem; text-decoration-color: var(--muted); }
.tier tbody tr:last-child th, .tier tbody tr:last-child td { border-bottom: 0; }
.tier tbody tr:hover { background: var(--ink-3); }
.tier .tier_off { color: var(--amber-2); font-size: var(--t-xs); letter-spacing: .08em; text-transform: uppercase; white-space: nowrap; }

.enq { display: grid; gap: 1rem; }
.enq_row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
@media (max-width: 640px) { .enq_row { grid-template-columns: 1fr; } }
.enq .field i { font-style: normal; color: var(--muted); font-weight: 400; text-transform: none; letter-spacing: 0; }
.enq button { justify-self: start; }
.enq button[disabled] { opacity: .6; cursor: default; }

/* the block dropped into guides whose readers buy in tens */
.pullcta { background: var(--ink-3); border: 1px solid var(--line-2); border-left: 3px solid var(--amber);
  border-radius: var(--r); padding: 1.4rem 1.6rem; margin: 2rem 0; }
.pullcta h3 { margin: .2rem 0 .5rem; font-size: var(--t-lg); }
.pullcta p { margin: 0 0 1rem; color: var(--paper-2); }

/* ── leaving a review ───────────────────────────────────────────────────── */
.rvw_stars { border: 0; padding: 0; margin: 0 0 1.4rem; }
.rvw_stars legend { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .12em;
  text-transform: uppercase; color: var(--amber); padding: 0; margin-bottom: .5rem; }
/* row-reverse with the stars written 5..1 in the markup: they read 1..5 on screen, and a sibling
   selector can then light everything to the left of the one under the cursor */
.rvw_stars_row { display: flex; flex-direction: row-reverse; justify-content: flex-end; gap: .25rem; }
.rvw_star { cursor: pointer; line-height: 1; }
.rvw_star input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.rvw_star span[aria-hidden] { font-size: 2.1rem; color: var(--line); transition: color .12s ease, transform .12s ease; display: block; }
/* row-reverse plus the sibling combinator is what lights every star to the LEFT of the one hovered,
   which is the only way to do a star rating in CSS without a script */
.rvw_star:hover span[aria-hidden],
.rvw_star:hover ~ .rvw_star span[aria-hidden],
.rvw_star input:checked ~ span[aria-hidden],
.rvw_star:has(input:checked) ~ .rvw_star span[aria-hidden] { color: var(--amber); }
.rvw_star:hover span[aria-hidden] { transform: scale(1.12); }
.rvw_star input:focus-visible ~ span[aria-hidden] { outline: 2px solid var(--amber); outline-offset: 3px; border-radius: 4px; }
.rvw form .field { margin-bottom: 1rem; }
.rvw .field i { font-style: normal; color: var(--muted); font-weight: 400; text-transform: none; letter-spacing: 0; }

/* the empty half of a star rating on a review card */
.stars i { font-style: normal; color: var(--line); }

/* review moderation in the back office */
.ord_rev { margin-top: .9rem; padding-top: .9rem; border-top: 1px solid var(--line-2); }
.ord_rev .stars { font-size: var(--t-md); letter-spacing: .1em; color: var(--amber); }
.ord_rev blockquote { margin: .5rem 0 .7rem; font-size: var(--t-sm); color: var(--paper-2); line-height: 1.6; }
.ord_rev_state { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .1em;
  text-transform: uppercase; color: var(--muted); }

/* ── order status ───────────────────────────────────────────────────────── */
.trk { margin-top: 2rem; background: var(--ink-3); border: 1px solid var(--line-2); border-radius: var(--r); padding: 1.6rem; }
.trk_hd { display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; flex-wrap: wrap;
  padding-bottom: 1rem; border-bottom: 1px solid var(--line-2); }
.trk_hd b { font-family: var(--f-ui); letter-spacing: .06em; color: var(--paper); }

.trk_steps { list-style: none; margin: 1.4rem 0; padding: 0; display: grid; grid-template-columns: repeat(3, 1fr); gap: .6rem; }
.trk_steps li { display: flex; flex-direction: column; gap: .5rem; font-family: var(--f-ui); font-size: var(--t-xs);
  letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }
/* the bar above each label is the progress indicator — three of them, filled left to right */
.trk_steps li span { display: block; height: 3px; border-radius: 3px; background: var(--line); }
.trk_steps li[data-state="done"] span { background: var(--amber); }
.trk_steps li[data-state="done"] b { color: var(--paper-2); }
.trk_steps li[data-state="now"] span { background: var(--amber); box-shadow: 0 0 14px rgba(200, 133, 58, .55); }
.trk_steps li[data-state="now"] b { color: var(--amber-2); }
.trk_steps li b { font-weight: 600; }
@media (prefers-reduced-motion: no-preference) {
  .trk_steps li[data-state="now"] span { animation: trkPulse 2.4s ease-in-out infinite; }
}
@keyframes trkPulse {
  0%, 100% { box-shadow: 0 0 10px rgba(200, 133, 58, .35); }
  50% { box-shadow: 0 0 18px rgba(200, 133, 58, .7); }
}

.trk_detail { color: var(--paper-2); font-size: var(--t-sm); line-height: 1.65; margin: 0 0 1.2rem; }
.trk_items { margin-top: 1.2rem; padding-top: 1.2rem; border-top: 1px solid var(--line-2); }
.trk_item { margin: 0 0 .7rem; font-size: var(--t-sm); color: var(--paper-2); }
.trk_item b { color: var(--paper); font-family: var(--f-ui); }
.trk_form .field .help { color: var(--muted); }
@media (max-width: 560px) { .trk_steps { grid-template-columns: 1fr; gap: .8rem; } }

/* the "3 boards, one parcel" hint beside the shipping line in the cart */
.ship_note { font-style: normal; font-size: var(--t-xs); color: var(--muted); letter-spacing: .04em; }

/* The hidden attribute loses to any author rule that sets display — .arrival is display:flex, so
   el.hidden = true left it on screen. Every "hidden" in this codebase is the attribute, so make it
   mean what it says rather than hunting the override each time. */
[hidden] { display: none !important; }

/* ── the order queue ────────────────────────────────────────────────────────
   A row per order, detail on demand. Twenty orders that each take a screen is not a work queue —
   you cannot see what is waiting, which is the only question the page exists to answer. */
.ordt { border: 1px solid var(--line-2); border-radius: var(--r); overflow: hidden; background: var(--ink-2); }
.ordt_head, .ordt_row {
  display: grid;
  grid-template-columns: 8.5rem minmax(9rem, 1.3fr) minmax(8rem, 1fr) 7.5rem minmax(8rem, 1fr) 7.5rem;
  gap: 1rem; align-items: center; text-align: left;
}
.ordt_head { padding: .7rem 1.1rem; background: var(--ink-3); border-bottom: 1px solid var(--line-2);
  font-family: var(--f-ui); font-size: .62rem; letter-spacing: .14em; text-transform: uppercase; color: var(--muted); }
.ordt_head .ordt_r { text-align: right; }

.ordt .ord { background: none; border: 0; border-bottom: 1px solid var(--line-2); border-radius: 0; padding: 0; margin: 0; }
.ordt .ord:last-child { border-bottom: 0; }
.ordt .ord.is-open { background: var(--ink-3); }

.ordt_row { width: 100%; padding: .85rem 1.1rem; background: none; border: 0; color: inherit; cursor: pointer;
  font: inherit; transition: background .14s; }
.ordt_row:hover { background: rgba(245, 239, 224, .035); }
.ordt_row:focus-visible { outline: 2px solid var(--amber); outline-offset: -2px; }
.ordt_row > span { display: flex; flex-direction: column; gap: .15rem; min-width: 0; }
.ordt_row b { font-family: var(--f-ui); font-size: var(--t-sm); font-weight: 600; color: var(--paper);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ordt_row i { font-style: normal; font-family: var(--f-ui); font-size: var(--t-xs); color: var(--muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ordt_ref b { letter-spacing: .06em; }
.ordt_next b { color: var(--amber-2); font-weight: 600; }
.ordt_state b { display: inline-block; width: fit-content; }
.ordt_total { flex-direction: row !important; align-items: center; justify-content: flex-end; gap: .55rem;
  font-family: var(--f-ui); font-weight: 700; color: var(--amber); }
.ordt_chev { font-style: normal; color: var(--muted); transition: transform .18s ease; font-size: 1.1rem; line-height: 1; }
.ord.is-open .ordt_chev { transform: rotate(90deg); color: var(--amber); }

.ord_detail { padding: .2rem 1.1rem 1.2rem; }
.ord_detail .ord_act { margin-top: .9rem; }

/* On a phone the grid becomes two lines of real information rather than six squeezed columns. */
@media (max-width: 860px) {
  .ordt_head { display: none; }
  .ordt_row { grid-template-columns: 1fr auto; gap: .35rem .8rem; padding: .9rem 1rem; }
  .ordt_row .ordt_items { grid-column: 1; }
  .ordt_row .ordt_state, .ordt_row .ordt_next { grid-column: 2; align-items: flex-end; text-align: right; }
  .ordt_row .ordt_total { grid-column: 2; grid-row: 1; }
  .ordt_row .ordt_ref { grid-row: 1; }
  .ord_detail { padding: .2rem 1rem 1.1rem; }
}

/* ── back office: tabs ──────────────────────────────────────────────────── */
.adm_tabs { display: flex; gap: .3rem; margin-right: auto; margin-left: 1.4rem; }
.adm_tabs a { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .12em; text-transform: uppercase;
  color: var(--muted); text-decoration: none; padding: .45rem .9rem; border-radius: 999px; border: 1px solid transparent; }
.adm_tabs a:hover { color: var(--paper); }
.adm_tabs a[aria-current="page"] { color: var(--amber-2); border-color: var(--line); background: var(--ink-3); }
@media (max-width: 720px) { .adm_tabs { margin-left: .4rem; } .adm_tabs a { padding: .4rem .55rem; letter-spacing: .06em; } }

/* ── back office: sales ─────────────────────────────────────────────────── */
.perf { margin-top: 1.6rem; }
.perf_top { display: grid; grid-template-columns: minmax(15rem, 20rem) 1fr; gap: 2rem; align-items: end;
  padding-bottom: 1.6rem; border-bottom: 1px solid var(--line-2); }
.perf_big { font-family: var(--f-display); font-size: clamp(2.4rem, 5vw, 3.4rem); line-height: 1.12; color: var(--paper); margin: .3rem 0 .5rem; }
.perf_delta { display: inline-block; font-family: var(--f-ui); font-size: var(--t-xs); font-weight: 600;
  letter-spacing: .06em; padding: .3rem .65rem; border-radius: 999px; }
.perf_delta.is-up { color: #A6C98A; background: rgba(140, 190, 100, .13); }
.perf_delta.is-down { color: #D98A7A; background: rgba(210, 110, 90, .13); }
.perf_delta.is-flat { color: var(--muted); background: rgba(245, 239, 224, .07); }
.perf_head .small { margin-top: .8rem; max-width: 34ch; }
.perf_chart svg { width: 100%; height: 160px; display: block; }
.perf_axis { display: flex; justify-content: space-between; font-family: var(--f-ui); font-size: var(--t-xs);
  color: var(--muted); margin-top: .5rem; }
@media (max-width: 860px) { .perf_top { grid-template-columns: 1fr; gap: 1.4rem; align-items: start; } }

.perf_tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); gap: .8rem; margin: 1.6rem 0; }
.tile { background: var(--ink-3); border: 1px solid var(--line-2); border-radius: var(--r-sm); padding: 1rem 1.1rem; }
.tile span { display: block; font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .1em;
  text-transform: uppercase; color: var(--muted); margin-bottom: .45rem; }
.tile b { display: block; font-family: var(--f-ui); font-size: var(--t-lg); color: var(--paper); }
.tile i { display: inline-block; font-style: normal; font-family: var(--f-ui); font-size: var(--t-xs);
  color: var(--muted); margin-top: .35rem; }
.tile i.is-up { color: #A6C98A; } .tile i.is-down { color: #D98A7A; }

.perf_split { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; margin-top: 1.4rem; }
@media (max-width: 760px) { .perf_split { grid-template-columns: 1fr; gap: 1.6rem; } }
.perf_h { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .14em; text-transform: uppercase;
  color: var(--amber); margin: 0 0 .9rem; }
.perf_notes { margin: 0; padding-left: 1.1rem; color: var(--paper-2); font-size: var(--t-sm); line-height: 1.7; }
.perf_notes li { margin-bottom: .5rem; }

.bars { display: grid; gap: .6rem; }
.bar { display: grid; grid-template-columns: minmax(8rem, 14rem) 1fr 2rem; gap: .8rem; align-items: center;
  font-family: var(--f-ui); font-size: var(--t-sm); }
.bar span { color: var(--paper-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bar_track { background: var(--ink-3); border-radius: 999px; height: 8px; overflow: hidden; }
.bar_track i { display: block; height: 100%; background: var(--amber); border-radius: 999px; }
.bar b { color: var(--paper); text-align: right; }
@media (max-width: 560px) { .bar { grid-template-columns: 1fr 2rem; } .bar_track { grid-column: 1 / -1; order: 3; } }

/* ── back office: stock ─────────────────────────────────────────────────── */
.stk { margin-top: 1.6rem; }
.stk_grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr)); gap: 1rem; }
.stk_card { background: var(--ink-3); border: 1px solid var(--line-2); border-radius: var(--r); padding: 1.3rem 1.4rem; }
.stk_card--low { border-color: rgba(200, 133, 58, .45); }
.stk_card--out { border-color: rgba(210, 110, 90, .5); }
.stk_card_hd { display: flex; justify-content: space-between; align-items: center; gap: .8rem; }
.stk_card h3 { margin: 0; font-size: var(--t-md); }
.stk_pill { font-family: var(--f-ui); font-size: .62rem; letter-spacing: .12em; text-transform: uppercase;
  padding: .28rem .6rem; border-radius: 999px; border: 1px solid var(--line); color: var(--muted); white-space: nowrap; }
.stk_pill--in { border-color: var(--ok); color: #A6C98A; }
.stk_pill--low { border-color: var(--amber); color: var(--amber-2); }
.stk_pill--out { border-color: #D98A7A; color: #D98A7A; }
.stk_big { font-family: var(--f-display); font-size: 3rem; line-height: 1.12; color: var(--paper); margin: .8rem 0 1rem; }
.stk_big i { display: block; font-style: normal; font-family: var(--f-ui); font-size: var(--t-xs);
  letter-spacing: .1em; text-transform: uppercase; color: var(--muted); margin-top: .5rem; }
.stk_rows { margin: 0 0 1rem; padding-top: .9rem; border-top: 1px solid var(--line-2); display: grid; gap: .4rem; }
.stk_rows div { display: flex; justify-content: space-between; gap: 1rem; font-family: var(--f-ui); font-size: var(--t-sm); }
.stk_rows dt { color: var(--muted); margin: 0; }
.stk_rows dd { margin: 0; color: var(--paper); font-weight: 600; }

.stk_add, .stk_log { margin-top: 2rem; padding-top: 1.6rem; border-top: 1px solid var(--line-2); }
.stk_form { display: flex; gap: 1rem; align-items: flex-end; flex-wrap: wrap; max-width: 44rem; }
.stk_form .field { margin: 0; flex: 1 1 12rem; }
.stk_form select, .stk_form input { background: var(--ink-3); border: 1px solid var(--line); color: var(--paper);
  border-radius: var(--r-sm); padding: .7rem .8rem; font-family: var(--f-ui); font-size: var(--t-sm); width: 100%; }
.stk_form button { flex: 0 0 auto; }

/* the out-of-stock correction on a product page */
.stocknote { border-radius: var(--r-sm); padding: .85rem 1rem; margin: 0 0 1rem;
  font-size: var(--t-sm); line-height: 1.55; color: var(--paper-2); }
.stocknote b { color: var(--paper); }
.stocknote--low { background: rgba(200, 133, 58, .1); border: 1px solid rgba(200, 133, 58, .35); }
.stocknote--out { background: rgba(210, 110, 90, .1); border: 1px solid rgba(210, 110, 90, .4); }

/* the single-day chart puts its two labels under the two bars rather than at the far edges */
.perf_axis.is-pair { justify-content: center; gap: 7.2rem; }

/* "tax at checkout" under the cart total — the total is not the total until Stripe says so */
.totals_note { margin: .7rem 0 0; font-family: var(--f-ui); font-size: var(--t-xs); color: var(--muted); line-height: 1.5; }

/* tax on an order row: money taken, but not money earned */
.ordt_tax { font-style: normal; font-family: var(--f-ui); font-size: .62rem; font-weight: 400;
  letter-spacing: .04em; color: var(--muted); white-space: nowrap; }

/* ── guide furniture ────────────────────────────────────────────────────── */
/* The summary box. A reader who scans gets the answer; a model quoting the page gets it in one
   block rather than reassembling it from five paragraphs. */
.takeaways { background: var(--ink-3); border: 1px solid var(--line-2); border-left: 3px solid var(--amber);
  border-radius: var(--r); padding: 1.3rem 1.6rem; margin: 2rem 0; }
.takeaways h2 { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .14em; text-transform: uppercase;
  color: var(--amber); margin: 0 0 .8rem; }
.takeaways ul { margin: 0; padding-left: 1.1rem; }
.takeaways li { color: var(--paper-2); font-size: var(--t-sm); line-height: 1.65; margin-bottom: .55rem; }

/* Related guides, generated per post from declared topic clusters. Styled as a quiet list rather
   than another amber-rule callout, so it reads as navigation at the foot of the article and does
   not compete with the takeaways box at the top. */
.related { margin: 2.4rem 0 0; }
.related h2 { font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .14em; text-transform: uppercase;
  color: var(--paper-3); margin: 0 0 .9rem; }
.related ul { list-style: none; margin: 0; padding: 0; display: grid; gap: .1rem; }
.related li { border-top: 1px solid var(--line-2); padding: .85rem 0; }
.related li:last-child { border-bottom: 1px solid var(--line-2); }
.related a { font-weight: 600; text-decoration: none; }
.related a:hover { color: var(--amber-2); }
.related .small { display: block; margin-top: .2rem; }
.takeaways li:last-child { margin-bottom: 0; }

.postfig { margin: 2rem 0; }
.postfig img { width: 100%; height: auto; border-radius: var(--r); display: block; }
.postfig figcaption { margin-top: .7rem; font-family: var(--f-ui); font-size: var(--t-xs); color: var(--muted);
  line-height: 1.6; }

/* a question heading, so the FAQ section reads as a list of answers rather than more prose */
.prose h3 { margin-top: 2rem; }


/* Packing instruction on a gift order, not customer text — coloured so it reads as an action. */
.ord_care { display: block; margin-top: .45rem; color: var(--amber); font-family: var(--f-ui); font-size: var(--t-xs); letter-spacing: .03em; }
