/* ==========================================================================
   Miles Below — shared stylesheet
   Deep water editorial · v1 · August 2026
   ========================================================================== */

:root{
  --abyss:#0A1214;
  --deep:#0F1C20;
  --shelf:#16262B;
  --line:#20353A;
  --line-soft:#1A2C31;
  --paper:#F2EFE9;
  --muted:#96A3A5;
  --dim:#6B7B7E;
  --copper:#C9724A;
  --copper-dim:#8F5233;
  --serif:"Fraunces",Georgia,"Times New Roman",serif;
  --sans:"Inter",ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;
  --wrap:1080px;
}

*{box-sizing:border-box;}
html{scroll-behavior:smooth;}
body{
  margin:0;background:var(--abyss);color:var(--paper);
  font-family:var(--sans);font-size:16px;line-height:1.65;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
img{display:block;max-width:100%;}
a{color:inherit;}
.wrap{max-width:var(--wrap);margin:0 auto;padding:0 32px;}
.narrow{max-width:680px;}
h1,h2,h3,h4,h5{font-family:var(--serif);font-weight:400;letter-spacing:-.018em;margin:0;}

/* ---------- type helpers ---------- */
.eyebrow{font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;color:var(--dim);font-weight:500;}
.lede{color:var(--muted);font-size:15px;}
p.b{color:var(--muted);max-width:66ch;}
p.b b,p.b strong{color:var(--paper);font-weight:500;}
.hint{font-size:11.5px;color:var(--dim);}

/* ---------- buttons ---------- */
.btn{
  display:inline-flex;align-items:center;gap:9px;font-family:var(--sans);
  font-size:13px;font-weight:500;letter-spacing:.04em;padding:14px 26px;
  border-radius:4px;border:1px solid transparent;cursor:pointer;
  text-decoration:none;transition:.18s;
}
.btn-p{background:var(--copper);color:#120803;}
.btn-p:hover{background:#D9835B;}
.btn-s{background:transparent;color:var(--paper);border-color:rgba(242,239,233,.28);}
.btn-s:hover{border-color:var(--paper);}
.btn-sm{font-size:12.5px;padding:10px 18px;}

/* ---------- pills ---------- */
.pill{
  display:inline-block;font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;
  padding:4px 10px;border-radius:3px;background:var(--shelf);color:var(--muted);white-space:nowrap;
}

/* ---------- header ---------- */
/* ONE HEADER, EVERY PAGE -- Miles, 22 Sep: "the root pages are the reference". Measured at
   1400 on index.html (the Below Magazine header, header.run): 64px row + 1px rule, Montserrat,
   wordmark 13px/500 at .22em caps, a 24px mark, nav 17px #aeb6ba with the current page white
   500, a copper button 14px/500 padded 11px 20px. shell_nav() stays the one markup for guides,
   operators, product pages and the hand-built roots; these are the root header's SIZES.
   THE CONTENT WIDTH IS NOT ONE OF THEM -- a first pass copied header.run's own measure
   (1260px/48px, which is that six-page design's own choice) onto header.site, and the header
   stopped lining up with the footer and every other .fwrap/.wrap block on the page (item4,
   found by measuring the footer against it: 138 against 214 at 1440). header.site keeps
   var(--wrap), the measure the rest of a guide/operator/product page is held to; only the
   type, the button and the fixed height change. Scoped to header.site, so nothing else
   called .nav or .brand is touched. */
header.site{
  position:sticky;top:0;z-index:60;background:#0e1416;color:#efe9df;
  border-bottom:1px solid rgba(255,255,255,.08);font-family:Montserrat,system-ui,sans-serif;
}
header.site .nav{
  max-width:var(--wrap);margin:0 auto;padding:0 32px;height:64px;box-sizing:border-box;
  display:flex;align-items:center;justify-content:space-between;gap:24px;
}
header.site .brand{display:flex;align-items:center;gap:11px;text-decoration:none;color:#efe9df;flex:0 0 auto;}
header.site .brand svg{width:24px;height:24px;flex:0 0 auto;}
header.site .brand .wm{font:500 13px Montserrat,system-ui,sans-serif;letter-spacing:.22em;text-transform:uppercase;white-space:nowrap;}
header.site .nav ul{display:flex;gap:26px;list-style:none;margin:0;padding:0;}
header.site .nav ul a{font:400 17px Montserrat,system-ui,sans-serif;color:#aeb6ba;text-decoration:none;transition:.15s;}
header.site .nav ul a:hover,header.site .nav ul a[aria-current="page"]{color:#fff;}
header.site .nav ul a[aria-current="page"]{font-weight:500;}
header.site .nav .btn{background:#c2673a;border:1px solid #c2673a;color:#fff;padding:11px 20px;border-radius:3px;
  font:500 14px Montserrat,system-ui,sans-serif;letter-spacing:0;text-transform:none;white-space:nowrap;flex:0 0 auto;}
header.site .nav .btn:hover{background:#a9542c;border-color:#a9542c;}
@media(max-width:900px){header.site .nav{padding:0 20px;}header.site .nav ul{display:none;}}

/* ---------- page head ---------- */
.pagehead{padding:64px 0 44px;border-bottom:1px solid var(--line-soft);}
.pagehead h1{font-size:clamp(34px,5.4vw,56px);font-weight:300;line-height:1.04;margin:16px 0 0;}
.pagehead .lede{max-width:60ch;margin:20px 0 0;}

/* ---------- sections ---------- */
section.blk{padding:72px 0;border-bottom:1px solid var(--line-soft);}
section.blk:last-of-type{border-bottom:0;}
/* ONE COLUMN. Miles, on the two-column version: "the type face and how it
   just seems to float on the right ... something about it just feels off."
   The lede was bottom-aligned to a wrapped headline with a wide gap between
   them: no shared edge, no shared baseline. Eyebrow, headline, lede, one left
   edge. Proven on the V3 proposal first. */
.shead{display:block;margin-bottom:36px;}
.shead h2{font-size:clamp(25px,3.2vw,34px);max-width:20ch;margin-top:12px;}
.shead .lede{max-width:60ch;font-size:14.5px;margin-top:14px;}

/* ---------- score components ---------- */
/* .srow (the old score bars) retired 22 Sep 2026: no page rendered it once the product page
   moved to the Below Magazine grammar. The rules are in git if a rollback needs them. */

/* difficulty ladder */
.rungs{display:grid;grid-template-columns:repeat(5,1fr);gap:5px;}
@media(max-width:700px){.rungs{grid-template-columns:1fr 1fr;}}
.cc{background:var(--abyss);padding:20px 18px;}
.cc .k{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim);}
.cc .v{font-size:15px;margin-top:8px;}
.cc .v small{display:block;font-size:12px;color:var(--muted);margin-top:3px;}

.idx{width:100%;border-collapse:collapse;}
.idx th{
  text-align:left;font-size:10px;letter-spacing:.15em;text-transform:uppercase;
  color:var(--dim);font-weight:500;padding:0 12px 14px 0;
  border-bottom:1px solid var(--line);cursor:pointer;user-select:none;white-space:nowrap;
}
.idx th:hover{color:var(--paper);}
.idx th .ar{opacity:0;margin-left:4px;}
.idx th.on{color:var(--paper);}
.idx th.on .ar{opacity:1;color:var(--copper);}
.idx th.r,.idx td.r{text-align:right;padding-right:0;}
.idx td{padding:14px 12px 14px 0;border-bottom:1px solid var(--line-soft);vertical-align:middle;font-size:14px;}
.idx tbody tr.area{transition:.15s;}
.idx tbody tr.area:hover{background:rgba(22,38,43,.5);}
.idx .dest .n{font-size:14.5px;}
.idx .dest .s{font-size:11.5px;color:var(--dim);margin-top:1px;}
.idx .dest a{text-decoration:none;}
.idx .dest a:hover .n{color:var(--copper);}
.idx td.num{font-variant-numeric:tabular-nums;color:var(--muted);}
.idx td.tot{font-variant-numeric:tabular-nums;color:var(--paper);}
.idx td.g{font-family:var(--serif);font-size:17px;}
.idx td.g.hi{color:var(--copper);}
.idx tr.stay td{
  padding:9px 12px 9px 0;border-bottom:1px solid var(--line-soft);
  font-size:13px;color:var(--muted);background:rgba(15,28,32,.45);
}
.idx tr.stay.hidden{display:none;}
.flag{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--copper-dim);margin-left:8px;}
@media(max-width:900px){.idx .hidesm{display:none;}}
.hidden{display:none !important;}

/* ---------- footer ---------- */
/* THE FOOTER, IN THE BELOW MAGAZINE GRAMMAR -- 19 Sep 2026.
   Self-contained tokens: this lands on pages carrying three different palettes, so it
   declares its own and inherits nothing. Values are template.html's --g-* set. The old
   dark .fgrid rules below are kept for rollback and match nothing now; see css-check. */
footer.site.fend{display:block;--fe-paper:#f2efe9;--fe-ink:#141414;--fe-mut:#8a8a8a;--fe-rule:#e4e0d8;
  --fe-cu:#C9724A;--fe-mono:"IBM Plex Mono",ui-monospace,monospace;
  background:var(--fe-paper);color:var(--fe-mut);border-top:1px solid var(--fe-rule);
  margin:0;padding:34px 0 40px;font:400 10.5px/2 var(--fe-mono);letter-spacing:.18em;text-transform:uppercase;}
/* 22 Sep eve: the padding was max(gutter,(100% - 1180px)/2) INSIDE a box already capped at 1180px
   and centred -- the half-margin was paid twice, so at 1440 the footer ran 260-1180 while the
   guide header runs 212-1228. The cap centres it; the padding is only the gutter. */
footer.site.fend .fwrap{display:block;width:100%;box-sizing:border-box;max-width:1180px;margin:0 auto;padding:0 clamp(16px,6vw,84px);}
footer.site.fend .fend-row{display:flex;flex-wrap:wrap;justify-content:flex-start;gap:10px 28px;padding:10px 0;}
footer.site.fend .fend-row + .fend-row{border-top:1px solid var(--fe-rule);}
footer.site.fend nav.fend-row{justify-content:flex-start;font-size:12px;}
footer.site.fend a{color:var(--fe-ink);text-decoration:none;border-bottom:1px solid transparent;}
footer.site.fend a:hover{border-bottom-color:var(--fe-cu);color:var(--fe-ink);}
footer.site.fend .fend-fine{font-size:10.5px;letter-spacing:.14em;}
footer.site.fend .fend-fine span{display:flex;flex-wrap:wrap;gap:6px 18px;}
footer.site.fend .fend-fine a{color:var(--fe-mut);}
@media(max-width:700px){footer.site.fend .fend-row{flex-direction:column;gap:8px;}}
footer.site{padding:72px 0 44px;border-top:1px solid var(--line-soft);margin-top:0;}
.fgrid{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:36px;padding-bottom:40px;border-bottom:1px solid var(--line-soft);}
.fgrid h5{font-family:var(--sans);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);font-weight:500;margin:0 0 16px;}
.fgrid ul{list-style:none;margin:0;padding:0;}
.fgrid li{margin-bottom:10px;}
.fgrid a{text-decoration:none;font-size:13.5px;color:var(--muted);}
.fgrid a:hover{color:var(--paper);}
.fbot{display:flex;justify-content:space-between;gap:20px;padding-top:26px;font-size:12.5px;color:var(--dim);flex-wrap:wrap;}
.sister{background:var(--deep);border:1px solid var(--line-soft);border-radius:8px;padding:18px;margin-top:20px;}
.sister .l{font-size:12px;color:var(--dim);}
.sister .n{font-size:14.5px;margin-top:5px;}
.sister a{text-decoration:none;}
@media(max-width:820px){.fgrid{grid-template-columns:1fr 1fr;}}

/* ---------- operator photographs ----------
   ONE HOME. This sheet held the retired two-column 3:2 grid while
   template.html held the six-column mosaic that replaced it -- one name, two
   components, both declared bare, so name-check's descendant-only rule two
   never saw them disagree. The page-local copy won, which is the only reason
   the page looked right. Lifted here verbatim; rule three now catches the
   bare case. */
/* ---- operator photographs ----
   The same lesson the gallery mosaic learned, in the quieter place where it
   matters more. This was two fixed columns with every cell forced to 3:2, so
   Misool Resort's single photograph rendered as a half-width orphan beside a
   hole, three photographs rendered as two and a gap, and a 3.25:1 panorama of
   a jetty kept its middle 46%.

   These are the least glamorous pictures on the site and they do the one job
   the reef frames cannot: they show a reader what they are buying. Cropping
   them badly on the section that sells the trip is not a small thing.

   Six columns, and the layout follows the COUNT rather than assuming two. The
   class comes from build.py, which read the real ratio out of each JPEG
   header; the CSS only turns a name into a span. Wide frames always run full
   width and tall frames keep a tall cell, so nothing is cropped into a shape
   it was not shot in. */
.stayimgs{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;margin-bottom:20px;}
.stayimgs img{width:100%;height:100%;object-fit:cover;border-radius:4px;display:block;
  background:var(--deep);aspect-ratio:3/2;}
/* Span comes from opLayout(), which pairs the frames so no row is ever short.
   Shape comes from the file's own ratio: a panorama is never squeezed into a
   3:2 box and a portrait is never laid on its side. */
.stayimgs img.s6{grid-column:span 6;}
/* THE ODD ONE OUT. Three photographs pair two at half width and leave one
   at full width. A 4:3 at full width is a 720px tower -- Miles, 4 September:
   "the third photos ... weren't so high?" They never were cropped; the rule
   only ever protected panoramas and portraits. A normal frame that lands
   alone crops to a wide band (about 2.1:1, his own example), keeping ~70% of a
   3:2. Panoramas (.sw) and portraits (.st) keep their own shapes below. */
.stayimgs img.s6:not(.sw):not(.st){aspect-ratio:2.1/1;}
.stayimgs img.s3{grid-column:span 3;}
.stayimgs img.sw{aspect-ratio:auto;max-height:300px;object-fit:cover;}
.stayimgs img.st{aspect-ratio:2/3;}
.stayimgs img.s6.st{grid-column:span 3;justify-self:center;max-width:340px;}
@media(max-width:640px){
  .stayimgs img.s3,.stayimgs img.s6{grid-column:span 6;}
}

/* ---------- month strip ---------- */
.months{display:grid;grid-template-columns:repeat(12,1fr);gap:3px;margin-top:20px;}
.mo{text-align:center;padding:12px 2px;border-radius:4px;background:var(--shelf);}
.mo .m{font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--dim);}
.mo .d{height:4px;border-radius:2px;margin-top:8px;background:var(--line);}
.mo.best .d{background:var(--copper);}
.mo.ok .d{background:var(--muted);}
.mo.best .m{color:var(--paper);}
@media(max-width:700px){.months{grid-template-columns:repeat(6,1fr);}}

/* ---------- suits / doesn't suit ---------- */

/* ---------- planning list ---------- */
.plan{margin-top:22px;}
.plan .item{display:grid;grid-template-columns:150px 1fr;gap:22px;padding:18px 0;border-top:1px solid var(--line-soft);}
.plan .item:last-child{border-bottom:1px solid var(--line-soft);}
.plan .k{font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--copper);padding-top:2px;}
.plan .v{font-size:14.5px;color:var(--muted);line-height:1.6;max-width:62ch;}
.plan .v b{color:var(--paper);font-weight:500;}
@media(max-width:700px){.plan .item{grid-template-columns:1fr;gap:6px;}}
.months{display:grid;grid-template-columns:repeat(12,1fr);gap:3px;}
.mo{text-align:center;padding:12px 2px 10px;border-radius:4px;background:var(--shelf);cursor:pointer;transition:.15s;border:1px solid transparent;}
.mo:hover{background:var(--deep);border-color:var(--line);}
.mo[aria-selected="true"]{background:var(--deep);border-color:var(--copper);}
.mo .m{font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--dim);}
.mo .d{height:4px;border-radius:2px;margin-top:8px;background:var(--line);}
.mo.best .d{background:var(--copper);}
.mo.ok .d{background:var(--muted);}
.mo.shut .d{background:transparent;border-top:1px dashed var(--line);}
.mo.best .m,.mo[aria-selected="true"] .m{color:var(--paper);}
@media(max-width:700px){.months{grid-template-columns:repeat(6,1fr);}}

.moPanel{
  margin-top:16px;border:1px solid var(--line-soft);border-radius:8px;
  background:var(--deep);padding:26px 28px;min-height:150px;
}
.moPanel .st{display:inline-block;font-size:10px;letter-spacing:.14em;text-transform:uppercase;padding:4px 10px;border-radius:3px;margin-bottom:14px;}
.moPanel .st.best{background:rgba(201,114,74,.16);color:var(--copper);}
.moPanel .st.ok{background:var(--shelf);color:var(--muted);}
.moPanel .st.shut{background:var(--shelf);color:var(--dim);}
.moPanel h4{font-size:21px;margin:0 0 10px;}
.moPanel p{font-size:14.5px;color:var(--muted);margin:0;max-width:62ch;line-height:1.6;}
.moPanel p b{color:var(--paper);font-weight:500;}
.predict{display:flex;align-items:center;gap:10px;margin-top:18px;padding:14px 16px;border-radius:6px;background:var(--shelf);}
.predict .k{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim);flex:0 0 auto;}
.predict .v{font-size:13.5px;color:var(--muted);line-height:1.5;}
.predict .v b{color:var(--paper);font-weight:500;}
.predict.warn{background:rgba(201,114,74,.10);}
.predict.warn .v b{color:var(--copper);}

/* ==========================================================================
   Scoring overlays. Two of them: one for the water, one for the operator.
   They are separate because they answer different questions and a reader
   arrives with only one of them. A single merged panel forced everyone to
   scroll past the half they did not ask about.
   Native <dialog>, so Esc, the focus trap and inertness are the browser's job.
   ========================================================================== */
dialog.sx{
  border:0;padding:0;color:var(--paper);
  background:linear-gradient(180deg,#122126 0%,var(--deep) 46%);
  border-radius:14px;width:min(660px,calc(100vw - 28px));max-height:min(86vh,900px);
  box-shadow:0 1px 0 rgba(255,255,255,.05) inset,0 30px 80px -12px rgba(0,0,0,.7);
  overflow:hidden;
}
dialog.sx::backdrop{background:rgba(5,13,15,.76);backdrop-filter:blur(3px);}
dialog.sx[open]{display:flex;flex-direction:column;animation:sxin .22s cubic-bezier(.2,.7,.3,1);}
@keyframes sxin{from{opacity:0;transform:translateY(8px) scale(.985);}to{opacity:1;}}
@media (prefers-reduced-motion:reduce){dialog.sx[open]{animation:none;}}

.sx .hd{
  flex:none;position:relative;padding:26px 30px 20px;
  padding-right:64px;
  border-bottom:1px solid var(--line-soft);
  display:flex;align-items:flex-end;justify-content:space-between;gap:24px;
}
.sx .hd .eyebrow{margin-bottom:9px;}
.sx .hd h2{
  font-family:Fraunces,Georgia,serif;font-weight:300;
  font-size:25px;line-height:1.2;margin:0;letter-spacing:-.01em;
}
.sx .hd .tot{text-align:right;flex:none;}
.sx .hd .tot .n{font-family:Fraunces,Georgia,serif;font-size:30px;line-height:1;font-weight:300;}
.sx .hd .tot .n s{text-decoration:none;font-size:15px;color:var(--dim);margin-left:1px;}
.sx .hd .tot .l{font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);margin-top:7px;}
.sx .x{
  position:absolute;top:16px;right:16px;width:28px;height:28px;padding:0;
  border:1px solid var(--line);border-radius:50%;background:transparent;
  color:var(--dim);font-size:15px;line-height:1;cursor:pointer;
  transition:color .15s,border-color .15s;
}
.sx .x:hover{color:var(--paper);border-color:var(--muted);}

.sx .bd{flex:1 1 auto;min-height:0;overflow-y:auto;padding:4px 30px 34px;
  overscroll-behavior:contain;scrollbar-width:thin;}
.sx .bd > :last-child{margin-bottom:0;}
.sx .intro{font-size:13.5px;color:var(--muted);line-height:1.68;margin:20px 0 4px;max-width:60ch;}

.sx .row{padding:19px 0;border-bottom:1px solid var(--line-soft);}
.sx .row:last-of-type{border-bottom:0;}
.sx .row .top{display:flex;align-items:baseline;justify-content:space-between;gap:14px;}
.sx .row .nm{font-size:14.5px;font-weight:500;color:var(--paper);letter-spacing:.005em;}
.sx .row .vl{font-family:Fraunces,Georgia,serif;font-size:17px;font-weight:300;flex:none;}
.sx .row .vl s{text-decoration:none;color:var(--dim);font-size:12px;}
.sx .row .tr{height:2px;background:var(--line);margin:11px 0 0;border-radius:2px;overflow:hidden;}
.sx .row .fl{display:block;height:100%;background:var(--muted);border-radius:2px;}
.sx .row .df{font-size:12.5px;color:var(--muted);line-height:1.68;margin:11px 0 0;max-width:66ch;}
.sx .row.bm .nm,.sx .row.bm .vl{color:var(--copper);}
.sx .row.bm .fl{background:var(--copper);}
.sx .row.bm .chip{
  font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--copper);
  border:1px solid var(--copper-dim);border-radius:3px;padding:2px 6px;margin-left:9px;
  vertical-align:2px;white-space:nowrap;
}
.sx .row.na .nm,.sx .row.na .vl{color:var(--dim);}
.sx .row.na .tr{background:repeating-linear-gradient(90deg,var(--line) 0 3px,transparent 3px 7px);}

.sx .note{
  margin-top:24px;padding:16px 18px;border:1px solid var(--line-soft);border-radius:9px;
  background:rgba(255,255,255,.017);font-size:12.5px;color:var(--muted);line-height:1.72;
}
.sx .note b{color:var(--paper);font-weight:500;}
.sx .note + .note{margin-top:10px;}
.sx .ft{margin-top:18px;font-size:12px;color:var(--dim);line-height:1.6;}
.sx .ft a{color:var(--muted);text-underline-offset:3px;}
.sx .ft a:hover{color:var(--paper);}

@media (max-width:560px){
  .sx .hd{padding:20px 20px 16px;padding-right:56px;flex-direction:column;align-items:flex-start;gap:14px;}
  .sx .hd .tot{text-align:left;}
  .sx .bd{padding:4px 20px 28px;}
}

/* Prose slots that carry paragraph breaks. The build emits real <p> elements;
   without a margin rule they stack flush and the reader sees one wall of text
   with line breaks in it, which is worse than no breaks at all. */
.prose p{margin:0 0 1.15em;}
.prose p:last-child{margin-bottom:0;}

/* ---------- compare table: tell the two halves apart at a glance ----------
   Underwater and Operator are different measurements of different things, and
   a reader scanning the table needs to know which column they are in without
   reading the header. A copper wash marks the water; the operator column stays
   plain. The header was also clipping — these are explicit widths, not guesses. */
.idx th.uwcol{color:var(--copper);border-bottom-color:var(--copper-dim);}
.idx th.opcol{color:var(--muted);}
/* Explicit widths. With min-width only, the last unconstrained column
   absorbed every spare pixel — which is why Underwater rendered as a
   copper block a third of the table wide. */
/* These add up. Six axis columns plus four totals plus the destination name
   have to fit inside --wrap minus its padding, or the whole page scrolls
   sideways rather than the table doing it politely inside its own box. The
   sum below is 990 against 1016 available. */
.idx th.uwcol, .idx td.uwcol{width:104px;max-width:110px;white-space:nowrap;}
.idx th.opcol, .idx td.opcol{width:100px;max-width:106px;white-space:nowrap;}
/* The sort arrow needs somewhere to sit. It is absent, not invisible, until
   the column is sorted — reserving it as inline space pushed the label into
   its neighbour instead. */
.idx th.r .ar{position:absolute;margin-left:5px;}
.idx th.r{position:relative;padding-left:14px;}
.idx tr.area td.uwcol{font-weight:500;}/* Which total columns exist is a property of the scope, so it is declared once
   here rather than assigned per element in script. Rows are redrawn constantly;
   any JS that styles cells is racing the next innerHTML, and when it lost, a
   hidden header sat above a visible cell and shunted every number one column
   sideways. CSS cannot lose that race — it applies to rows that do not exist
   yet. */
body[data-scope="place"] .idx .opcol, body[data-scope="op"]    .idx .uwcol{display:none;}
.idx th, .idx td{overflow:visible;}/* ---------- guides index control bar ----------
   Two rows with one job each: what you are looking at, then how it is ordered.
   The old single row wrapped the view toggle onto its own line below the
   filters, which read as a third unrelated control. */
/* row-gap, not just gap: when a group wraps, the second line needs vertical
   separation or it reads as a broken control rather than a second row. On a
   phone the three scope buttons cannot fit on one line at any sane type size,
   so wrapping is a certainty and has to be designed rather than tolerated. */

/* Below this the scope group always wraps. Letting the buttons grow gives two
   flush rows instead of a full-width pair and one orphan, so the wrap reads as
   deliberate. The view toggle takes the full width for the same reason. */
@media(max-width:560px){
}

/* .scorelink, .endcta, .ctagrid, .ctacard retired 16 Sep -- they styled the
   old destinations.html's "how this is scored" link and end-of-page CTA
   cards. Destinations is ported now (see notes/72-ive-port.md); the new
   page's "How this is scored" button is .v3-btn, and it has no end CTA
   grid. Nothing else on the site used these four. */
/* ---------- compare table: the six axes as columns ----------
   Ranking by Macro used to float Lembeh to the top showing 77% — its overall —
   with nothing on the row explaining the order. The axes are columns now, so
   the reason for the ranking is visible beside it, and so is what the place
   gives up on the other five. */
/* Sized for a one- or two-character number, not the bars these used to hold. */
.idx th.axcol, .idx td.axcol{width:72px;padding-right:6px;font-variant-numeric:tabular-nums;}
/* A LABEL THAT DOES NOT FIT IS A LAYOUT FAULT, NOT A NAMING FAULT.
   SUSTAINABILITY is 14 characters and needs ~90px at this type; the column is
   72. `white-space:nowrap` turned that into a shove -- the header pushed into
   its neighbour and every heading after it drifted, which is what Miles saw.
   Wrapping costs one line of header height and keeps the word the whole
   category uses. It also fixes the axis generally rather than one label:
   nothing here has to be short any more. */
.idx th.axcol{font-size:9px;letter-spacing:.03em;line-height:1.2;
  white-space:normal;overflow-wrap:anywhere;vertical-align:bottom;}
.idx th.axcol.on{color:var(--copper);border-bottom-color:var(--copper-dim);}

.idx th[data-k]{cursor:pointer;user-select:none;}
.idx th[data-k]:hover{color:var(--paper);}

/* ---------- compare table: bars, and a row you can hit ---------- */
.idx tr.area{cursor:pointer;}
.idx tr.area:hover td{background:rgba(255,255,255,.022);}
.idx td.dest .flagrow{display:block;margin:5px 0 0;}
.idx td.dest .flag{margin:0 6px 0 0;}
.idx td.dest .s{margin-top:5px;}
.idx td.dest .s2{display:flex;align-items:center;gap:10px;margin-top:8px;}
.idx td.dest .s2 .yr{font-size:11.5px;color:var(--dim);}/* ---------- compare table: the number is the mark ----------
   A bar beside a value encodes the same fact twice. Magnitude is carried by
   the type itself — bright and medium-weight at the top of the scale, receding
   to the background at the bottom — so a column can be scanned for its high
   scores without a single non-data mark being added. */
.idx td.axcol{padding-top:12px;padding-bottom:12px;font-variant-numeric:tabular-nums;
  font-size:13.5px;color:var(--muted);}
/* Tufte again: rules only where they separate, never a grid. */
.idx tr.stay td{border-top:0;}

/* The sort arrow only appears on the column actually doing the sorting. Six
   permanent arrows cost about sixty pixels of width and carried no information. */
.idx td.dest{min-width:190px;}

/* The destination cell takes whatever is left; every other column is fixed. */
.idxwrap{overflow-x:auto;max-width:100%;}
.idx{table-layout:auto;}
.idx td.dest,.idx th:first-child{width:auto;min-width:190px;}
.idx th.tot,.idx td.tot,.idx th:last-child,.idx td.g{width:64px;white-space:nowrap;}

/* The underwater band is a column marker, not a fill. It needs air on both
   sides or it reads as a hard edge butted against the number. */
.idx th.uwcol, .idx td.uwcol{padding-left:16px;padding-right:16px;border-radius:0;}
.idx tr:first-child td.uwcol{border-top-left-radius:4px;border-top-right-radius:4px;}

/* ---------- compare table: sticky header ----------
   Sixteen destinations is more than a screen. Scroll past the head and the
   numbers become anonymous — nine columns of digits with nothing saying which
   axis is which. The header now travels with them. */
.idxwrap{overflow-x:auto;max-width:100%;overflow-y:visible;}
.idx thead th{
  position:sticky;top:0;z-index:5;
  background:var(--abyss);
  box-shadow:inset 0 -1px 0 var(--line);
}
.idx thead th.opcol{background:var(--abyss);}
@supports not (position:sticky){ .idx thead th{position:static;} }/* Operator rows carry the operator axes in the same six columns. They are
   dimmed and the header names them. */
.idx tr.nest td.axcol{color:var(--muted);font-weight:400;}
/* Axis labels live inside each block, so a destination names its own six and an
   operator names its six — two vocabularies, never crowded into one header.
   The sticky header keeps only the summary columns. */
.idx tr.axlab td{
  border:0;padding:14px 6px 4px 0;font-size:9px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--dim);text-align:right;font-weight:500;
}/* An axis label is a sort control. It has to look like one or nobody clicks it. */
.idx tr.axlab td[data-sort]{cursor:pointer;user-select:none;transition:color .15s;}
/* Totals keep their own identity without a full-height column wash, which broke
   once inline label rows interrupted the columns. Colour lives on the number. */
.idx th.uwcol{color:var(--copper);border-bottom-color:var(--copper-dim);}
.idx td.uwcol{color:var(--copper);}
.idx tr.stay td.uwcol{color:#8F5B42;}
.idx th.opcol{color:#7FA6AE;border-bottom-color:#3E5A62;}
.idx td.opcol{color:#7FA6AE;}
.idx td.tot{color:var(--paper);font-weight:500;}
.idx thead th.uwcol,.idx thead th.opcol{background:var(--abyss);}/* Give the two longest labels a little more room than the short ones, so a
   fourteen-character word is not squeezed into the same box as FOOD. */
.idx tr.axlab td{padding-left:4px;}
.idx tr.axlab td:nth-child(5),.idx tr.axlab td:nth-child(7){letter-spacing:.02em;}


/* ---------- the homepage top ten: give the table its columns ----------
   This table borrows .idx from the guides index, and .idx is written for a
   table with six axis columns. Here there are seven ordinary ones and no
   widths, so `table-layout:auto` sized them by content: at --wrap the
   Destination column took 287px, Level and Last visited took 343px between
   them to hold a pill and a four-digit year, and the four score columns —
   the reason the table exists — were left sharing 359px, getting tighter
   left to right. It read as unbalanced because it was.

   Percentages rather than pixels, so it holds together between --wrap and the
   900px breakpoint instead of only at one width. Scoped to #topTable: the
   guides index has its own column arithmetic and its own lint checking it. */
#topTable{table-layout:fixed;}
#topTable th:nth-child(1),#topTable td:nth-child(1){width:30%;}   /* Destination */
#topTable th:nth-child(2),#topTable td:nth-child(2){width:13%;}   /* Level */
#topTable th:nth-child(3),#topTable td:nth-child(3){width:11%;}   /* Last visited */
#topTable th:nth-child(4),#topTable td:nth-child(4){width:13%;}   /* Underwater */
#topTable th:nth-child(5),#topTable td:nth-child(5){width:12%;}   /* Operator */
#topTable th:nth-child(6),#topTable td:nth-child(6){width:11%;}   /* Overall */
#topTable th:nth-child(7),#topTable td:nth-child(7){width:10%;}   /* Grade */
/* .idx sets fixed pixel widths on these for the guides index. Under
   table-layout:fixed the first row wins, and a stray 104px would override the
   share above, so the percentage is restated at higher specificity. */
#topTable th.uwcol,#topTable td.uwcol{width:13%;max-width:none;}
#topTable th.opcol,#topTable td.opcol{width:12%;max-width:none;}
#topTable td.dest{min-width:0;}
/* Below 900px .hidesm removes Level and Last visited. Reapportion, or the
   five survivors inherit shares that no longer sum to the table. */
@media(max-width:900px){
  #topTable th:nth-child(1),#topTable td:nth-child(1){width:42%;}
  #topTable th:nth-child(4),#topTable td:nth-child(4),
  #topTable th.uwcol,#topTable td.uwcol{width:17%;}
  #topTable th:nth-child(5),#topTable td:nth-child(5),
  #topTable th.opcol,#topTable td.opcol{width:16%;}
  #topTable th:nth-child(6),#topTable td:nth-child(6){width:14%;}
  #topTable th:nth-child(7),#topTable td:nth-child(7){width:11%;}
}

/* ---------- the season map ---------- */
#seasonMap{margin-top:26px;}
.smap{width:100%;height:auto;display:block;background:rgba(14,24,27,.6);border-radius:6px;}
.smland{fill:rgba(140,160,163,.17);stroke:none;}
.smeq{stroke:rgba(150,170,172,.10);stroke-width:1;stroke-dasharray:3 6;}
.smpt{cursor:pointer;}
.smhit{fill:transparent;}
.smdot{transition:r .18s,fill .18s;stroke:var(--abyss);stroke-width:1.5;}
.smpt:hover .smdot,.smpt:focus-visible .smdot{r:8.5;}
.smpt:focus-visible{outline:none;}
.smpt:focus-visible .smdot{stroke:var(--paper);stroke-width:2;}
.smlist{display:grid;grid-template-columns:repeat(3,1fr);gap:2px 34px;margin-top:22px;}
.smlist a{display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  padding:8px 0;border-bottom:1px solid var(--line-soft);text-decoration:none;}
.smlist a:hover .n{color:var(--copper);}
.smlist .n{font-size:14px;color:var(--paper);}
.smlist .s{font-size:12px;color:var(--dim);font-variant-numeric:tabular-nums;}
@media(max-width:900px){.smlist{grid-template-columns:1fr 1fr;}}
@media(max-width:600px){.smlist{grid-template-columns:1fr;}}

.smlab{fill:var(--paper);font-size:11px;letter-spacing:.02em;opacity:0;
  pointer-events:none;paint-order:stroke;stroke:var(--abyss);stroke-width:3.5px;
  stroke-linejoin:round;transition:opacity .15s;}
.smpt:hover .smlab,.smpt:focus-visible .smlab{opacity:1;}

/* ==========================================================================
   REDESIGN — "witness with a method"
   Added on the redesign-witness branch, August 2026.

   The ordering rule everything below serves: DESIRE FIRST, PROOF SECOND,
   HONESTY THIRD. The old site led with methodology — "Every place, scored the
   same way" — which is a sentence nobody ever booked a dive trip because of.
   The honesty is what makes the praise believable, so it has to be present and
   findable; it does not have to be the first thing said.
   ========================================================================== */

/* ---------- cross-document view transitions ----------
   Supported in Chrome, Edge, Safari 18.2+ and Firefox as of 2026. Costs no
   JavaScript and degrades to nothing at all in a browser that lacks it, which
   is the only reason it is worth having on a static site. */
@view-transition{navigation:auto;}
::view-transition-old(root){animation:vtOut .22s ease both;}
::view-transition-new(root){animation:vtIn .28s ease both;}
@keyframes vtOut{to{opacity:0;}}
@keyframes vtIn{from{opacity:0;}}
@media(prefers-reduced-motion:reduce){
  @view-transition{navigation:none;}
  html{scroll-behavior:auto;}
}

/* ---------- the frame ----------
   One photograph at size, with what is actually known about it: the animal
   (verified against the species audit), where it was taken, and — when Miles
   has written it — why it was hard to take.

   Difficulty and rarity are the two things that make his work worth money and
   the two things invisible in the file itself. This unit exists to give them
   somewhere to live. It renders without them rather than inventing them. */
.frame{display:grid;grid-template-columns:1.35fr 1fr;gap:0;align-items:stretch;
  border:1px solid var(--line-soft);border-radius:8px;overflow:hidden;background:var(--deep);}
.frame.rev>.frame-img{order:2;}
.frame-img{position:relative;min-height:420px;}
.frame-img img{width:100%;height:100%;object-fit:cover;aspect-ratio:3/2;}
.frame-body{padding:40px 38px;display:flex;flex-direction:column;justify-content:center;}
.frame-body .sci{font-style:italic;font-size:12.5px;color:var(--dim);letter-spacing:.01em;}
.frame-body h3{font-size:clamp(24px,2.6vw,32px);font-weight:300;line-height:1.12;margin:10px 0 0;}
.frame-where{font-size:12px;letter-spacing:.13em;text-transform:uppercase;color:var(--copper);
  margin-top:14px;}
.frame-body p{color:var(--muted);font-size:14.5px;line-height:1.68;margin:18px 0 0;max-width:44ch;}
.frame-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:24px;}
.frame-meta .pill{background:transparent;border:1px solid var(--line);}
.frame-acts{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:28px;}
.frame-ed{font-size:11.5px;color:var(--dim);}
@media(max-width:900px){
  .frame{grid-template-columns:1fr;}
  .frame.rev>.frame-img{order:0;}
  .frame-img{min-height:0;}
  .frame-img img{aspect-ratio:3/2;}
  .frame-body{padding:30px 26px;}
}

/* ---------- the planner ----------
   Replaces "Join the waitlist", which asks for an email and returns nothing
   until a trip exists 6 to 48 months later. This answers a real question out
   of data nobody else has, and the email is given for the answer rather than
   extracted for the promise of one. */
.plan{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--deep);}
.plan-q{padding:26px 30px;border-bottom:1px solid var(--line-soft);}
.plan-q:last-of-type{border-bottom:0;}
.plan-q .qh{display:flex;align-items:baseline;gap:12px;margin-bottom:16px;}
.plan-q .qn{font-family:var(--serif);font-size:15px;color:var(--copper);width:22px;flex:none;}
.plan-q .qt{font-size:14.5px;color:var(--paper);}
.plan-opts{display:flex;flex-wrap:wrap;gap:8px;padding-left:34px;}
.popt{background:transparent;border:1px solid var(--line);color:var(--muted);
  font:inherit;font-size:13px;padding:9px 16px;border-radius:4px;cursor:pointer;transition:.15s;}
.popt:hover{border-color:var(--paper);color:var(--paper);}
.popt.on{background:var(--copper);border-color:var(--copper);color:#120803;}
.plan-out{background:var(--abyss);border-top:1px solid var(--line);padding:30px;}
.plan-res{display:flex;flex-direction:column;gap:2px;margin-top:6px;}
.presult{display:grid;grid-template-columns:auto 1fr auto auto;gap:16px;align-items:baseline;
  padding:13px 0;border-bottom:1px solid var(--line-soft);text-decoration:none;}
.presult:last-child{border-bottom:0;}
.presult .rk{font-family:var(--serif);font-size:14px;color:var(--dim);width:20px;}
.presult .nm{font-size:15px;color:var(--paper);}
.presult .nm .sb{display:block;font-size:12px;color:var(--dim);margin-top:2px;}
.presult:hover .nm{color:var(--copper);}
.presult .st{font-size:11px;letter-spacing:.1em;text-transform:uppercase;}
.presult .sc{font-size:13px;color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;}
.plan-none{color:var(--muted);font-size:14px;}
@media(max-width:640px){
  .plan-opts{padding-left:0;}
  .plan-q{padding:22px 20px;}
  .presult{grid-template-columns:auto 1fr;gap:6px 12px;}
  .presult .st,.presult .sc{grid-column:2;}
}

/* ---------- the ask ----------
   One email capture, phrased as an exchange rather than a favour. */
.ask{border:1px solid var(--line);border-radius:10px;padding:38px 36px;background:
  linear-gradient(180deg,var(--deep),var(--abyss));}
.ask h3{font-size:clamp(22px,2.4vw,28px);font-weight:300;margin:8px 0 0;}
.ask p{color:var(--muted);font-size:14.5px;max-width:56ch;margin:14px 0 0;}
.askform{display:flex;gap:10px;margin-top:26px;flex-wrap:wrap;}
.askform input{flex:1 1 260px;background:var(--abyss);border:1px solid var(--line);
  border-radius:4px;color:var(--paper);font:inherit;font-size:14px;padding:14px 16px;}
.askform input:focus{outline:none;border-color:var(--copper);}
.askform input::placeholder{color:var(--dim);}
.ask .fine{font-size:11.5px;color:var(--dim);margin-top:14px;}

/* ---------- section rhythm ----------
   A full-bleed photograph between sections, used sparingly, to stop the page
   reading as an unbroken run of grids. Height is capped so a 3:2 frame never
   becomes a strip — the fault that shipped four times already. */
.breath{position:relative;height:min(56vh,520px);overflow:hidden;margin:0;}
.breath img{width:100%;height:100%;object-fit:cover;}
.breath figcaption{position:absolute;inset:auto 0 0 0;padding:26px 0;
  background:linear-gradient(180deg,transparent,rgba(10,18,20,.9));}
.breath figcaption .t{font-family:var(--serif);font-size:17px;}
.breath figcaption .s{font-size:12px;color:var(--muted);margin-top:3px;}

/* ---------- the month strip ----------
   The coloured column is .mbar, NOT .bar. template.html already had a .bar —
   a prose callout with a copper left border and 15px of padding — and on a
   guide page that page-local rule reached straight into the calendar and
   applied its padding to every column. With box-sizing:border-box the padding
   outgrew the 36/25/12 heights and every month rendered the same height, which
   is the entire information content of the strip. One name, two components.
   Moved here from template.html so the guide pages and the season map on the
   destinations index render ONE calendar rather than two that merely look
   alike. Miles: "why create a new calendar element when we already have one".
   ------------------------------------------------------------------------ */
.mgrid{display:grid;grid-template-columns:repeat(12,1fr);gap:3px;align-items:end;}
.mo2{cursor:pointer;text-align:center;}
/* THE HOVER BOX HAD NO ROOM IN IT. The month cell takes a 1px border on hover,
   and the bar was drawn edge to edge inside it -- so the outline arrived hard
   against the bar on both sides and against the legend below. The state was
   right; the cell was never built to hold a border.

   Padding on the CELL, not a margin on the bar: the bar's height is the whole
   information content of this strip, and a margin would eat into it. */
.mo2{padding:5px 6px 4px;border-radius:4px;border:1px solid transparent;
  transition:border-color .18s,background .18s;}
.mo2:hover{border-color:var(--line);background:rgba(255,255,255,.02);}
.mo2 .mbar{display:block;border-radius:3px;background:#2A3436;opacity:.74;transition:opacity .18s,background .18s;}
.mo2.best .mbar{height:36px;background:var(--copper);}
.mo2.ok   .mbar{height:25px;background:#5A7E88;}   /* 4.30:1 — was #3E5A62 at 2.56:1 */
.mo2.shut .mbar{height:12px;background:var(--shelf);}
.mo2 .mn{display:block;font-size:11.5px;margin-top:6px;color:var(--muted);}
.mo2.shut .mn{color:#4A5A5E;text-decoration:line-through;}
.mo2:hover .mbar,.mo2.sel .mbar{opacity:1;}
.mo2.sel .mn{color:var(--paper);}
.mkey{display:flex;gap:18px;margin:16px 0 16px;font-size:11px;color:var(--dim);}
.mkey i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px;vertical-align:-1px;}
.mkey i.best{background:var(--copper);}.mkey i.ok{background:#3E5A62;}.mkey i.shut{background:var(--shelf);}

/* On the season map the bar means something different: not one destination's
   state in a month, but HOW MANY of the sixteen are at their best. Height is
   set inline from the count, so the fixed heights above are turned off.

   This also retires the sentence that used to sit above it — "August. 7 at
   their best, 7 worth going, 2 I would not" — which read as confusing next to
   a calendar that was about to say the same thing. The bars say it. */
.mgrid.mcount .mo2 .mbar{height:auto;background:#2A3436;opacity:1;}
.mgrid.mcount .mo2.on .mbar{background:var(--copper);}
.mgrid.mcount .mo2:hover .mbar{background:#3E5A62;}
.mgrid.mcount .mo2.on .mn{color:var(--paper);}
.mgrid.mcount .mo2 .ct{display:block;font-size:10px;color:var(--dim);margin-top:3px;
  font-variant-numeric:tabular-nums;}
.mgrid.mcount .mo2.on .ct{color:var(--copper);}
.mgrid.mcount .mo2:focus-visible{outline:1px solid var(--paper);outline-offset:3px;border-radius:3px;}
.qsub{font-size:11.5px;color:var(--dim);margin:12px 0 0;padding-left:34px;line-height:1.5;}
.plan-q .mgrid{padding-left:34px;}
@media(max-width:640px){.qsub,.plan-q .mgrid{padding-left:0;}}
.pclear{font-size:11.5px;padding:5px 12px;}
.pclear:disabled{opacity:.5;cursor:default;}
.plan-q .qh{width:100%;}

/* ---------- the shop, and the one control bar it shares with the guides ----
   One result set, one bar, applied state as removable chips with live counts.
   The old prints page had five collection tiles linking to "#", a separate
   region list and a grid of squares — three things showing overlapping subsets
   with no shared state. ------------------------------------------------- */
.shopbar{border:1px solid var(--line);border-radius:10px;background:var(--deep);
  padding:16px 18px 14px;}
.shoprow{display:flex;flex-wrap:wrap;gap:16px 22px;align-items:flex-end;}
.shopf{display:flex;flex-direction:column;gap:6px;min-width:150px;}
.shopf label{font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);
  font-weight:500;}
.shopf select{background:var(--abyss);border:1px solid var(--line);border-radius:4px;
  color:var(--paper);font:inherit;font-size:13.5px;padding:9px 11px;min-width:150px;}
.shopf select:focus{outline:none;border-color:var(--copper);}
.shopf select option:disabled{color:var(--dim);}
.shopsort{margin-left:auto;}
.shopchips{display:flex;flex-wrap:wrap;gap:7px;align-items:center;margin-top:14px;
  padding-top:12px;border-top:1px solid var(--line-soft);min-height:30px;}
.chip{background:rgba(201,114,74,.14);border:1px solid rgba(201,114,74,.42);color:var(--copper);
  font:inherit;font-size:12px;padding:4px 11px;border-radius:3px;cursor:pointer;transition:.15s;}
.chip:hover{background:rgba(201,114,74,.24);}
.chip-all{background:transparent;border-color:var(--line);color:var(--muted);}
.shopcount{font-size:13.5px;color:var(--muted);margin:20px 0 16px;}
.shopcount b{color:var(--paper);font-weight:500;}
.shopgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px 22px;}
@media(max-width:900px){.shopgrid{grid-template-columns:1fr 1fr;}.shopsort{margin-left:0;}}
@media(max-width:560px){.shopgrid{grid-template-columns:1fr;}}
/* THE TILE IS A TILE, WHATEVER TAG IT IS. A Library tile is an <a> when the
   frame has a product page to link to and a <button> when it has only a
   lightbox to open, and it must look identical either way. This said
   display:block and text-decoration:none, which is everything an anchor needs
   and almost nothing a button does, so the 507 licensable tiles rendered with
   the browser's own chrome: white background, grey border, centred label, the
   system font. Styled for the ROLE, both tags carry the same rules, and
   all:unset comes first so nothing of the button's own is left underneath. */
a.prod,button.prod{all:unset;display:block;box-sizing:border-box;width:100%;cursor:pointer;text-align:left;}
.prodimg{background:#0D1517;border-radius:5px;overflow:hidden;}
.prodimg img{width:100%;aspect-ratio:3/2;object-fit:contain;display:block;transition:.4s;}
.prod:hover .prodimg img{opacity:.86;}
.prodm{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-top:11px;}
.prodm .pn{font-family:var(--serif);font-size:16px;color:var(--paper);line-height:1.25;}
.prodm .pp{font-size:13.5px;color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;}
.prodw{font-size:11.5px;color:var(--dim);margin-top:3px;}
.viewseg{display:flex;gap:0;border:1px solid var(--line);border-radius:4px;overflow:hidden;}
.viewseg button{background:transparent;border:0;border-right:1px solid var(--line);color:var(--muted);
  font:inherit;font-size:12.5px;padding:9px 15px;cursor:pointer;transition:.15s;}
.viewseg button:last-child{border-right:0;}
.viewseg button:hover{color:var(--paper);background:rgba(255,255,255,.04);}
.viewseg button.on{background:var(--copper);color:#120803;}
/* auto-fill, not a fixed three. Miles: "because of the vertical nature, it is
   hard to read the recommendations list — would it be better to have a side by
   side instead". One card per row is a column of things you cannot compare,
   and a ranked recommendation exists to be compared. 190px minimum keeps two
   abreast even in a narrow window. */
.bgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:22px 18px;}
/* The top pick is the recommendation, so it gets the room — two columns and a
   wider crop. Everything below it is for scanning. */
.bcard.lead{grid-column:span 2;}
.bcard.lead .bimg img{aspect-ratio:2/1;}
.bcard.lead .bname{font-size:23px;}
@media(max-width:520px){.bgrid{grid-template-columns:1fr;}.bcard.lead{grid-column:span 1;}}
.bcard{display:block;text-decoration:none;}
.bimg{border-radius:6px;overflow:hidden;background:#0D1517;}
.bimg img{width:100%;aspect-ratio:3/2;object-fit:cover;display:block;transition:.4s;}
.bcard:hover .bimg img{transform:scale(1.03);}
.bname{font-family:var(--serif);font-size:17px;color:var(--paper);margin-top:10px;line-height:1.2;}
.bsub{font-size:11px;color:var(--dim);margin-top:2px;}
/* One line, not four stacked. Four stacked lines per card is what made the
   list so tall that only one fitted on screen. */
.bline{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:baseline;margin-top:7px;
  font-size:12px;font-variant-numeric:tabular-nums;}
.bwhen{color:#7FA6AE;} .bwhen.peak{color:var(--copper);}
.bmeta{color:var(--muted);}








.idx td .peakdot{color:var(--copper);}
.popt .pct{display:inline-block;margin-left:7px;font-size:10.5px;color:var(--dim);
  font-variant-numeric:tabular-nums;}
.popt.on .pct{color:rgba(18,8,3,.6);}
.popt.off{opacity:.4;}
/* Month-strip bands. Height is the value, colour is the band — two channels,
   because a range of 13 to 16 out of 16 on a 40px bar is visually flat and
   Miles could see no affordance at all. */
/* Colour marks the SELECTED month only. The spread across the year is 7 to 13
   of 16 — too narrow to encode as three colour bands without implying a
   difference that is not there. The printed count carries the value. */
.mgrid.mcount .mo2 .mbar{background:#3A4A4E;}
.mgrid.mcount .mo2:hover .mbar{background:#51666B;}
.mgrid.mcount .mo2.on .mbar{background:var(--copper);}
.mgrid.mcount .mo2.on .mbar{outline:1px solid var(--paper);outline-offset:1px;}
.mkey .sw{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:6px;
  vertical-align:-1px;}
.segrow{display:flex;flex-wrap:wrap;gap:6px;}
.monthf{width:100%;}
.monthf .mgrid{max-width:560px;}
.shopf label{margin-bottom:8px;}

/* ---------------------------------------------------------------------------
   THE MONTH INSTRUMENT — home page.

   The strip reuses .mgrid / .mo2 / .mbar / .mn, because there is ONE calendar on
   this site. What is new here is that it is operable, and that operating it
   changes the photographs. Everything below is a MODIFIER on the shared
   component; nothing redeclares it. A page-local bare .mo2 is what flattened
   every guide calendar once already.
--------------------------------------------------------------------------- */
.mgrid.mnow{max-width:none;align-items:end;gap:5px;}
.mgrid.mnow .mo2{background:none;border:0;padding:0 0 4px;font:inherit;color:inherit;cursor:pointer;
  border-radius:4px;transition:background .18s;}
.mgrid.mnow .mo2 .mbar{width:100%;background:#2A3436;opacity:.8;transition:background .22s,opacity .22s,transform .22s;
  transform-origin:bottom;}
.mgrid.mnow .mo2:hover .mbar{opacity:1;background:#5A7E88;}
.mgrid.mnow .mo2.sel .mbar{background:var(--copper);opacity:1;}
.mgrid.mnow .mo2 .ct{display:block;font-size:12px;color:var(--dim);margin-top:2px;
  font-variant-numeric:tabular-nums;}
.mgrid.mnow .mo2.sel .mn,.mgrid.mnow .mo2.sel .ct{color:var(--paper);}
.mgrid.mnow .mo2:focus-visible{outline:1px solid var(--paper);outline-offset:3px;}

.mnline{font-family:var(--serif);font-size:29px;font-weight:300;line-height:1.4;
  color:var(--muted);margin:30px 0 0;max-width:26ch;}
.mnline b{color:var(--paper);font-weight:400;}
.mnbox{margin-top:30px;transition:opacity .28s ease;}
.mnbox.fade{opacity:0;}
.mncards{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;}
.mnc{display:block;text-decoration:none;color:inherit;}
.mnimg{overflow:hidden;border-radius:5px;}
.mnc img{width:100%;aspect-ratio:4/3;object-fit:cover;display:block;transition:transform .5s;}
.mnc:hover img{transform:scale(1.03);}
.mnn{font-family:var(--serif);font-size:20px;color:var(--paper);margin-top:13px;}
.mns{font-size:13.5px;color:var(--muted);margin-top:3px;}
.mnp{font-size:12px;color:var(--dim);margin-top:6px;font-variant-numeric:tabular-nums;}
.mnone{color:var(--muted);font-size:15px;}
.mnfoot{margin-top:34px;display:flex;gap:12px;flex-wrap:wrap;}

@media(max-width:760px){
  .mnline{font-size:23px;max-width:none;}
  .mncards{grid-template-columns:1fr 1fr;gap:12px;}
  .mncards .mnc:last-child{display:none;}
  .mgrid.mnow .mo2 .ct{font-size:11px;}
}

/* Reduced motion: the crossfade and the hover zoom are decoration, not meaning.
   The month strip still works with every animation off. */
@media(prefers-reduced-motion:reduce){
  .mnbox,.mnc img,.mgrid.mnow .mo2 .mbar{transition:none;}
  .mnbox.fade{opacity:1;}
}

/* The availability tag on a gallery card. Three states, mutually exclusive at
   the point of sale: a signed limited print, an open print, or a licence.
   Licensing was a line in the revenue model with nothing buyable behind it. */
.prodimg{position:relative;}
.ptag{position:absolute;left:9px;top:9px;font-size:10px;letter-spacing:.1em;
  text-transform:uppercase;padding:4px 8px;border-radius:3px;font-weight:600;
  backdrop-filter:blur(6px);}
.ptag.ltd{background:rgba(201,114,74,.92);color:#120803;}
.ptag.open{background:rgba(242,239,233,.9);color:#0A1214;}
.ptag.lic{background:rgba(10,18,20,.72);color:#C6CCC9;border:1px solid rgba(198,204,201,.4);}

/* ---------------------------------------------------------------------------
   BORROWED, CHEAPLY.

   The reference sites Miles shared buy their feeling with weight: Blue Marine is
   7.8 MB across 63 requests and was still on a "LOADING EXPERIENCE" screen at 45
   seconds. Both effects below cost ZERO bytes of JavaScript and no library.

   1. The shared-element morph. A destination photograph on the browser becomes
      the hero on its guide, instead of the page blinking. The names are paired
      in browse.js and template.html.
   2. Scroll-driven reveal on the mosaic, using animation-timeline, which is
      supported. Frames rise as they enter rather than all at once.
--------------------------------------------------------------------------- */
::view-transition-old(dest-*),
::view-transition-new(dest-*){animation-duration:.42s;}

@supports (animation-timeline: view()) {
  /* The container is .gal. Two wrong guesses before this one: .mosaic, which
     has never existed here, and .galband, which is the band HEADING -- that rule
     animated the children of an h3. css-check.js proves a class EXISTS; it
     cannot prove a rule targets the element you meant. Read the emitted markup. */
  .gal > *{
    animation:riseIn linear both;
    animation-timeline:view();
    animation-range:entry 0% entry 44%;
  }
  @keyframes riseIn{from{opacity:0;transform:translateY(16px);}to{opacity:1;transform:none;}}
}

/* Motion here is decoration and never carries meaning, so all of it goes. */
@media(prefers-reduced-motion:reduce){
  @supports (animation-timeline: view()) { .gal > *{animation:none;opacity:1;transform:none;} }
  ::view-transition-old(dest-*),::view-transition-new(dest-*){animation:none;}
}

/* ---------------------------------------------------------------------------
   REGIONS view. Was a grid of equal-width TEXT cards, so a region with nine
   destinations and a region with one got the same box -- three of the five
   rendered as near-empty rectangles. It also carried no photograph, on a site
   whose first principle is that the pictures are the argument.

   A band per region, reusing the Browse card. One destination takes one card's
   width, not a fifth of the screen.
--------------------------------------------------------------------------- */
.rband{margin-top:34px;}
.rband:first-child{margin-top:22px;}
.rbh{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);
  font-weight:500;margin:0 0 14px;display:flex;align-items:baseline;gap:9px;
  padding-bottom:9px;border-bottom:1px solid var(--line-soft);}
.rbh span{color:var(--copper);font-size:12px;letter-spacing:.04em;
  font-variant-numeric:tabular-nums;}
.bgrid.rgrid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));}
.bgrid.rgrid .bcard{grid-column:auto;}

/* A destination with no photograph says so, rather than drawing a browser's
   broken-image icon. Cozumel has no image folder at all. */
.noimg{display:flex;align-items:center;justify-content:center;width:100%;
  aspect-ratio:4/3;background:var(--shelf);color:var(--dim);font-size:12px;
  letter-spacing:.06em;border-radius:4px;}

/* A region with one or two destinations lays its heading beside its cards.
   Three of five bands hold a single destination; a full-width grid row for one
   card is a row of empty space. */
.rband.solo{display:grid;grid-template-columns:200px 1fr;gap:26px;align-items:start;}
.rband.solo .rbh{border-bottom:0;padding-bottom:0;margin:0;display:block;
  padding-top:4px;line-height:1.7;}
.rband.solo .rbh span{display:block;}
.rband.solo .bgrid.rgrid{grid-template-columns:repeat(auto-fill,minmax(190px,220px));}
@media(max-width:700px){
  .rband.solo{grid-template-columns:1fr;gap:12px;}
  .rband.solo .rbh{border-bottom:1px solid var(--line-soft);padding-bottom:9px;}
  .rband.solo .rbh span{display:inline;margin-left:8px;}
}



/* ---------------------------------------------------------------------------
   ACCESSIBILITY ON THE MONTH STRIP.

   Measured against WCAG 2.1, not eyeballed:

     selected vs unselected     1.29:1   needs 3:1 for a UI component
     shoulder bar vs page       2.56:1   needs 3:1
     shut bar vs page           1.47:1   needs 3:1

   And selection was signalled by COLOUR ALONE, which fails SC 1.4.1 whatever
   the ratio. Miles: "the contrast of when we are going vs other months is very
   subtle."

   Fixed on four channels, three of them not colour:
     1. a caret above the selected column
     2. the label goes paper-white and semibold
     3. an outline around the column
     4. the bar itself lightens to #F2EFE9 — 3.06:1 against the copper
--------------------------------------------------------------------------- */
.mo2{position:relative;}
.mo2.sel .mbar{background:var(--paper);}
.mo2.sel .mn{color:var(--paper);font-weight:600;}
.mo2.sel::before{
  content:"";position:absolute;left:50%;top:-9px;transform:translateX(-50%);
  border:5px solid transparent;border-top-color:var(--paper);
}
.mo2.sel::after{
  content:"";position:absolute;inset:-4px -3px -20px;border:1px solid var(--paper);
  border-radius:4px;opacity:.5;pointer-events:none;
}
/* A shut month is struck through as well as short, so "you cannot go" does not
   depend on seeing a 12px bar in a dark colour. */
/* A shut month is a HOLLOW bar, not a dark one. Filled-but-dark failed 3:1
   against the page (1.47:1, then 2.56:1); an outline reads as "nothing here"
   by SHAPE, which is the honest signal anyway, and its border passes. */
.mo2.shut .mbar{background:transparent;border:1px solid #5A7E88;opacity:1;}
.mo2.shut .mn{text-decoration:line-through;text-decoration-thickness:1px;}

@media (prefers-contrast: more){
  .mo2.ok .mbar{background:#7FA6AE;}
  .mo2.sel::after{opacity:1;}
}
@media(prefers-reduced-motion:reduce){ .mo2,.mo2 .mbar{transition:none;} }

/* Sortable column heads on the compare table. The six axes are back as columns
   rather than filter buttons -- sorting by Macro finds the macro destinations,
   and a filter that duplicates a sortable column is one control built twice. */
.idx th.sc{cursor:pointer;user-select:none;white-space:nowrap;}
.idx th.sc:hover{color:var(--paper);}
.idx th.ax{font-size:10.5px;letter-spacing:.08em;}
.idx td.ax{font-variant-numeric:tabular-nums;color:var(--muted);}
.idx td.ax.na{color:var(--dim);}
.idx th .ar{color:var(--copper);margin-left:4px;}

/* ---------------------------------------------------------------------------
   The destinations control bar. FOUR AXES, four controls, each naming a
   different question: WHEN, SHOWING, SORT, VIEW.

   The preference filters are gone at Miles's direction. Scope and sort came
   back because they are not preferences -- deleting the scope made 33 scored
   operators unreachable, which is half the rubric with no way to see it.
--------------------------------------------------------------------------- */
/* Three labelled rows, one grid, all three labels on the same left edge.
   View used to sit in a right-hand column of its own, which left its label
   floating between the Showing and Sort rows and belonging to neither. */
.ctlgrid{display:block;margin-top:20px;padding-top:18px;
  border-top:1px solid var(--line-soft);}
.ctlcol{display:flex;flex-direction:column;gap:14px;}
/* GRID, not flex, and the reason is alignment rather than taste.
   With flex + min-width the label column is only as wide as the longest label
   that happens to fit, so SUBJECT, SHOWING and SORT each started their controls
   at a different x. Miles: "move the sort to be left justified under showing."
   A fixed first column makes that true by construction and stays true when a
   label is renamed. */
.ctlrow2{display:grid;grid-template-columns:92px 1fr;align-items:center;
  gap:0 16px;}
.ctlk{font-size:10px;letter-spacing:.15em;text-transform:uppercase;color:var(--dim);
  line-height:1.4;align-self:center;}
/* The segments size to their buttons instead of stretching across the row, and
   they start at the column edge. Stated on the grid item AND on the element so
   the result does not depend on which of the two rules a browser applies last:
   the whole point of this row is that Sort begins exactly where Showing does. */
.ctlrow2 > *{grid-column:2;justify-self:start;margin-left:0;}
.ctlrow2 > .ctlk{grid-column:1;justify-self:start;}
.ctlrow2 > .viewseg,.ctlrow2 > .findbox{justify-self:start;width:auto;max-width:100%;}
/* NOT .viewseg.wrap. `.wrap` is the page container -- max-width, auto margins
   and 32px of padding -- so a component that borrowed the name inherited all
   three inside its own border. A modifier gets its own name. */
.viewseg.segwrap{flex-wrap:wrap;}
.viewseg button[disabled]{opacity:.38;cursor:not-allowed;}
.viewseg button[disabled]:hover{background:none;color:var(--muted);}
/* The sorted column is tinted so the button and the column agree. One state,
   shown twice -- not two authorities. */
.idx th.ax.on,.idx td.ax.on{color:var(--copper);}
.idx tr.nest td.dest{padding-left:26px;}
.idx tr.nest td.dest .n{font-size:13.5px;color:var(--muted);}
@media(max-width:820px){
  .ctlgrid{grid-template-columns:1fr;gap:16px;}
  
}

/* ---------------------------------------------------------------------------
   VIEW sits with the calendar, not under the filters.

   It changes the MODE of the whole page -- gallery, table, or regions -- and it
   was the last row of a three-row filter stack, so the most consequential
   control on the page had the least visual weight. Miles, as product manager:
   "you don't want poor interaction due to visibility vs desirability."

   Now it shares the calendar's header line, right-aligned, one step larger than
   the Showing and Sort segments below it. Hierarchy: WHEN and VIEW are the two
   things that change what you are looking at; Showing and Sort refine it.
--------------------------------------------------------------------------- */
.monthhead{display:flex;align-items:center;justify-content:space-between;
  gap:24px;flex-wrap:wrap;margin-bottom:10px;}
.monthhead label{margin:0;max-width:44ch;}
.viewseg.big button{font-size:14px;padding:10px 18px;}
.viewseg.big{border-color:var(--line);}
@media(max-width:760px){
  .monthhead{flex-direction:column;gap:12px;}
  .viewseg.big button{font-size:13px;padding:9px 14px;}
}

/* ---------------------------------------------------------------------------
   THE RUBRIC PANEL, and the affordance that opens it.

   Norman's objection, and it is the sharpest one on the list: the score has no
   explanation where the score is. "95% · A" arrives at first contact and the
   six axes that produced it are in section 03 of a page the reader may never
   open. The reader's model is "review sites are paid"; this site's model is
   "one diver, one rubric, nobody paid", and the gap was closed in the last
   place anybody looks.

   The affordance is deliberately quiet and deliberately verbal. A bare "?" is
   a puzzle; "How this is scored" is a promise. It sits beside the number, not
   on it -- the same rule the lightbox follows about never putting a button on
   a photograph.
--------------------------------------------------------------------------- */
.whyscore{background:none;border:0;padding:0;font:inherit;font-size:11.5px;
  letter-spacing:.02em;color:var(--dim);cursor:pointer;text-align:left;
  border-bottom:1px solid rgba(201,114,74,.35);line-height:1.3;
  transition:color .2s,border-color .2s;}
.whyscore:hover,.whyscore:focus-visible{color:var(--copper);border-bottom-color:var(--copper);}
.whyscore:before{content:"";display:inline-block;width:11px;height:11px;
  border:1px solid currentColor;border-radius:50%;margin-right:6px;
  transform:translateY(1px);opacity:.7;}

.rbwrap{position:fixed;inset:0;background:rgba(6,11,12,.86);z-index:300;
  display:none;align-items:flex-start;justify-content:center;overflow:auto;
  padding:6vh 20px 40px;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);}
.rbwrap.on{display:flex;}
.rbpanel{position:relative;background:var(--deep);border:1px solid var(--line);
  border-radius:10px;max-width:720px;width:100%;padding:38px 40px 34px;}
.rbpanel h3{font-size:27px;margin:10px 0 18px;font-weight:400;}
.rbpanel h4{font-size:11px;letter-spacing:.15em;text-transform:uppercase;
  color:var(--dim);margin:30px 0 12px;font-weight:500;}
.rbx{position:absolute;top:14px;right:16px;background:none;border:0;color:var(--dim);
  font-size:26px;line-height:1;cursor:pointer;padding:6px 10px;}
.rbx:hover{color:var(--paper);}
.rbintro{font-size:14.5px;line-height:1.66;color:var(--muted);margin:0 0 14px;max-width:62ch;}
/* The independence claim is the load-bearing sentence in the whole panel, so
   it gets the copper rule the pull quotes use. Everything else here explains
   the arithmetic; this one explains why the arithmetic is worth reading. */
.rbhard{border-left:2px solid var(--copper);padding-left:18px;color:var(--paper);}
.rbax{display:grid;grid-template-columns:112px 1fr;gap:14px;padding:11px 0;
  border-top:1px solid var(--line-soft);}
.rbax:first-of-type{border-top:0;}
.rbk{font-size:12.5px;color:var(--paper);letter-spacing:.02em;}
.rbv{font-size:13.5px;line-height:1.6;color:var(--muted);}
.rbmore{background:none;border:0;padding:0;font:inherit;font-size:12px;
  color:var(--copper);cursor:pointer;text-decoration:underline;}
.rbrest{display:block;margin-top:8px;}
.rbbands{display:flex;flex-wrap:wrap;gap:8px;}
.rbbands span{font-size:11.5px;color:var(--dim);background:var(--shelf);
  border-radius:3px;padding:6px 10px;font-variant-numeric:tabular-nums;}
.rbbands b{color:var(--paper);font-weight:500;margin-right:7px;}
.rbnote{font-size:12.5px;line-height:1.62;color:var(--dim);margin:14px 0 0;max-width:70ch;}
.rblink{display:inline-block;margin-top:26px;font-size:13px;color:var(--copper);
  text-decoration:none;border-bottom:1px solid rgba(201,114,74,.4);}
.rblink:hover{border-bottom-color:var(--copper);}
@media(max-width:640px){
  .rbpanel{padding:30px 22px 26px;}
  .rbpanel h3{font-size:23px;}
  .rbax{grid-template-columns:1fr;gap:4px;}
}

/* ---------------------------------------------------------------------------
   SUBJECT SEARCH. 486 photographs and, until now, no way to type "nudibranch".

   It is a FILTER and it sits with the other filters, not floating in a header
   as site search usually does — because on this page it changes the one result
   set exactly the way the month strip does. Typing "pygmy seahorse" is asking
   the same question as clicking March: narrow this list.

   The count beside the field is the system status Nielsen asked for: how many
   photographs the word actually reaches, before you commit to the filter.
--------------------------------------------------------------------------- */
.findbox{display:flex;align-items:center;gap:12px;flex:1;min-width:240px;}
.findbox input{flex:1;min-width:0;background:var(--shelf);border:1px solid var(--line);
  border-radius:4px;color:var(--paper);font:inherit;font-size:14px;padding:9px 13px;
  max-width:340px;}
.findbox input::placeholder{color:var(--dim);}
.findbox input:focus{outline:none;border-color:var(--copper);}
.findn{font-size:11.5px;color:var(--copper);letter-spacing:.03em;
  font-variant-numeric:tabular-nums;white-space:nowrap;}
.findn.dim{color:var(--dim);}
/* The evidence, on the card. A search that answers "Wakatobi" and then shows
   Wakatobi's usual photograph has answered the question and withheld the
   proof. */
.bfind{display:flex;gap:4px;align-items:center;margin-top:10px;}
.bfind img{width:46px;height:34px;object-fit:cover;border-radius:2px;display:block;
  background:var(--deep);}
.bmore{font-size:11px;color:var(--dim);margin-left:2px;font-variant-numeric:tabular-nums;}
@media(max-width:560px){
  .findbox{flex-wrap:wrap;}
  .findbox input{max-width:none;}
}

/* Six places, one diver. The only human being on this site used to be a byline
   and one self portrait — a strange omission for a business whose first product
   is ten days in a boat with a specific person. Each cell links to the guide
   the photograph was taken on, so the picture is evidence rather than decoration. */
.megrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px;
  margin-top:26px;}
.mecell{position:relative;display:block;border-radius:6px;overflow:hidden;
  background:var(--deep);text-decoration:none;}
.mecell img{width:100%;aspect-ratio:4/3;object-fit:cover;display:block;
  transition:transform .5s cubic-bezier(.2,.6,.2,1);}
.mecell:hover img{transform:scale(1.04);}
.mecell span{position:absolute;left:0;right:0;bottom:0;padding:22px 12px 10px;
  font-size:12.5px;color:var(--paper);letter-spacing:.02em;
  background:linear-gradient(to top,rgba(6,11,12,.85),rgba(6,11,12,0));}

/* The rubric link, bottom right of the control box.

   It used to share the calendar's header line with "WHEN — HOW MANY ARE IN HIGH
   SEASON EACH MONTH" and on a normal window the two collided — the affordance
   printed on top of the last word of the label. It is a footnote about the
   numbers rather than a control, so it goes where a footnote goes: after
   everything it explains, right-aligned, quiet. */
.barfoot{display:flex;justify-content:flex-end;margin-top:16px;padding-top:14px;
  border-top:1px solid var(--line-soft);}
@media(max-width:560px){
  .ctlrow2{grid-template-columns:1fr;gap:7px 0;}
  .barfoot{justify-content:flex-start;}
}

/* ===========================================================================
   MILES ABOVE — the field-report treatment.

   Miles: "I generally find it a little stale ... how would you make the site
   feel a little more funky, Patagonia."

   FIRST, THE THING WORTH NAMING: the palette he chose IS the Patagonia sky.
   Peach into coral into mauve into purple into deep blue is the P-6 gradient —
   the Fitz Roy skyline — which is why it felt right to him for a property about
   trucks and mountains. He got there by eye before either of us said the word.

   WHAT ACTUALLY MAKES A PAGE FEEL STALE, and it is not the colour:

     every section is the same section, .blk on .blk on .blk
     every photograph is the same size in the same 1080px box
     nothing on the page is bigger than the column

   So the treatment is three moves, not a repaint:

     1  A DUSK GRADIENT behind the whole page, fixed, from a warm top to a deep
        blue bottom. Mixed only 5% into the neutral ground, because anything
        stronger drops the rose accent below 4.5:1 — measured, not guessed. It
        reads as atmosphere over a long scroll rather than as a coloured page.
     2  SECTIONS THAT ALTERNATE. Three tints from his ramp at 5-7%, so the page
        has movement and a reader can tell one section from the next.
     3  PHOTOGRAPHS THAT BREAK THE COLUMN. Full-bleed bands, and larger cells.
        This is the single biggest difference between this and a blog, and it is
        what Patagonia actually does — the photograph is the page, the text is
        the caption.

   THE LINE THIS DOES NOT CROSS. The funk lives in the chrome and the sections.
   It never touches the score components. A site whose credibility rests on
   publishing an unflattering number cannot render that number playfully — and
   Patagonia can be loud precisely because it is selling a jacket rather than an
   assessment. Everything under .gradebox, .idx and .mgrid stays exactly as it
   is on Below.
   ======================================================================== */
/* THE DUSK GRADIENT, and the constraint that shaped it.

   Miles's poster runs peach at the top down to deep blue. On a dark interface
   that inverts, because ANY tint that lightens the ground costs the rose accent
   its contrast: at a 10% peach mix the accent falls to 3.97:1, at 22% to
   2.95:1. Measured, not guessed.

   So the page uses the DARK HALF of his ramp — plum through violet through
   slate to deep blue — which is the same sky twenty minutes later. The peach
   and the coral are not discarded; they live in the data layer as --ramp-r1 and
   --ramp-r2, where they sit ON the ground rather than behind text and their
   lightness is an asset.

   Every band below clears 4.5:1 for the accent and 14:1 for body text. */
body[data-prop="above"]{
  background:
    linear-gradient(180deg,
      #1C1620 0%,     /* plum      — dusk overhead */
      #1A1720 24%,    /* violet    */
      #17181A 52%,    /* neutral   — the reading zone */
      #161B21 78%,    /* slate     */
      #142028 100%);  /* deep blue — the horizon */
  background-attachment:fixed;
}
/* SECTION GROUNDS, from a class rather than from nth-of-type.

   The first version alternated on :nth-of-type(odd/even), which is a selector
   that names a position rather than describing a thing — the same species of
   fault as `.gal a` and `.mosaic > *`. Add one section anywhere and every tint
   below it flips. build.py stamped .tint-a / .tint-b instead, until the guide
   port of 16 Sep 2026: guide_grammar() now alternates every guide's sections. */
body[data-prop="above"] section.blk{border-bottom:0;padding:88px 0;}
body[data-prop="above"] section.blk.tint-a{background:rgba(53,92,125,.075);}

/* DISPLAY TYPE, one step heavier and tighter. Same two typefaces as Below —
   the method is the brand and the typefaces are the method — but Above is a
   field report and Below is a survey, and a field report is allowed a firmer
   voice. Fraunces 500 rather than 300, tracked in. */
body[data-prop="above"] .pagehead h1{font-weight:500;letter-spacing:-.03em;
  font-size:clamp(38px,6.2vw,68px);}
body[data-prop="above"] .shead h2{font-weight:500;letter-spacing:-.026em;}
body[data-prop="above"] .eyebrow{color:var(--copper);letter-spacing:.2em;}

/* PHOTOGRAPHS BREAK THE COLUMN. A full-bleed band is the one component Below
   does not have and the one Patagonia never stops using. */
body[data-prop="above"] .bleedband{width:100vw;margin-left:calc(50% - 50vw);
  margin-top:56px;margin-bottom:56px;}
body[data-prop="above"] .bleedband img{width:100%;aspect-ratio:21/9;object-fit:cover;
  display:block;}
body[data-prop="above"] .bleedband figcaption{max-width:var(--wrap);margin:14px auto 0;
  padding:0 32px;font-size:13px;color:var(--dim);}

/* BIGGER BOXES. Miles: "images generally are displayed larger in a box." The
   card grid goes from 190px minimum to 300px, the lead card takes a full row,
   and the gallery rows grow — the same mosaic, at a scale where a landscape
   frame has room to be a landscape. */
body[data-prop="above"] .bgrid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));
  gap:30px 24px;}
body[data-prop="above"] .bcard.lead{grid-column:1 / -1;}
body[data-prop="above"] .bcard.lead .bimg img{aspect-ratio:21/9;}
body[data-prop="above"] .bcard .bimg img{aspect-ratio:3/2;}
/* A WIDER COLUMN, and it is the most direct answer to "images generally are
   displayed larger in a box". --wrap was already a token, so widening it makes
   every photograph on every Above page bigger in ONE value, with no component
   touched and no class renamed. 1240 against Below's 1080.

   Below stays narrow on purpose: its subject is 3:2 macro on black, and a 2 mm
   shrimp does not get better at 1240px -- it gets lonelier. */
body[data-prop="above"] .gal{grid-auto-rows:150px;gap:12px;}
/* .sites AND .sp2 ARE NOT TOUCHED FROM HERE, and the reason is the same one
   the lightbox taught ten minutes ago: template.html declares both BARE, so
   scoping them in site.css instantly turns those page-local rules into shadows
   of a shared component -- the `.bar` fault, caught by name-check.js twice in
   one afternoon.

   THE RULE THAT COMES OUT OF IT: a per-property variation belongs in a TOKEN,
   never in a scoped override of a class the template already owns. --wrap does
   the work here anyway, and it does it everywhere at once. */
body[data-prop="above"] .stayimgs{gap:12px;}
/* THE LIGHTBOX IS A SHARED COMPONENT AND IS NOT RE-STYLED FROM HERE.
   Writing `body[data-prop="above"] .lb{...}` made .lb a scoped-only class in
   this file, which meant template.html's bare `.lb` was suddenly shadowing a
   shared component -- and name-check.js caught it immediately, because that is
   precisely the shape that flattened every month calendar when `.bar` existed
   twice. The variation belongs in a TOKEN, not an override: --lb-bg and
   --lb-pad are set per property in palette.css and template.html reads them. */
@media(max-width:820px){
  body[data-prop="above"] section.blk{padding:56px 0;}
  body[data-prop="above"] .bleedband{margin-top:36px;margin-bottom:36px;}
}

/* ===========================================================================
   THE LAND GUIDE — itinerary, fork, bookings.

   Miles: "the whole point of the post was to provide a four day timeline ...
   you stripped it out and now it's not that useful."

   THE STRUCTURAL DIFFERENCE, in his words: underwater "the weather and the
   operator have an itinerary and you don't deviate"; on land "you get a certain
   choose your own adventure". So a dive guide is an EVALUATION, read before the
   trip, and its centrepiece is a twelve-month calendar. A land guide is a
   SEQUENCE, read DURING the trip, and its centrepiece is an itinerary.

   Which is why these three components exist and why the dive template does not
   get them. The decision table in particular is the land equivalent of the
   month strip: underwater the deciding variable is the month you booked, on
   land it is the weather that morning.
   ======================================================================== */

/* ---- the itinerary ----
   Read on a phone, in a car park, in the rain. So: big day numbers, short
   slots, and nothing that needs two hands. */
.itin{display:flex;flex-direction:column;gap:18px;margin-top:26px;}
.iday{border:1px solid var(--line-soft);border-radius:10px;background:var(--deep);
  padding:26px 28px;}
.iday .idn{font-size:10px;letter-spacing:.19em;text-transform:uppercase;
  color:var(--copper);}
.iday h3{font-size:23px;font-weight:400;margin:9px 0 20px;}
.islots{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1px;
  background:var(--line-soft);border:1px solid var(--line-soft);border-radius:7px;
  overflow:hidden;}
.islot{background:var(--abyss);padding:18px 18px 20px;}
.islot .iw{font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);
  margin-bottom:8px;}
.islot p{margin:0;font-size:14px;line-height:1.62;color:var(--muted);}

/* ---- the fork ----
   The mechanic the dive guides do not have. Each option carries the CONDITION
   it is right under, because "surf if the wind is under fifteen knots" is worth
   more than any amount of description -- it converts a forecast into an action.
   That sentence is the local knowledge, and it is the whole reason somebody
   reads a guide by a person rather than a listicle. */
.ifork{margin-top:20px;padding-top:20px;border-top:1px solid var(--line-soft);}
.ifq{font-size:11px;letter-spacing:.15em;text-transform:uppercase;color:var(--dim);
  margin-bottom:14px;}
.ifopts{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:12px;}
.ifo{border:1px solid var(--line-soft);border-radius:7px;padding:15px 16px;
  background:var(--shelf);}
.ifo .ifn{font-family:var(--serif);font-size:16px;color:var(--paper);margin-bottom:7px;}
.ifo p{margin:0;font-size:13.5px;line-height:1.58;color:var(--muted);}
.ifo .ifw{margin-top:10px;padding-top:9px;border-top:1px solid var(--line-soft);
  font-size:11.5px;color:var(--copper);letter-spacing:.02em;}
/* Which day to cut first, and what it costs. One guide serving three days and
   six without being rewritten. */
.idrop{margin:18px 0 0;font-size:13px;line-height:1.6;color:var(--dim);}
.idrop b{color:var(--muted);font-weight:500;}

/* ---- the decision table ----
   Nobody else in travel writing publishes this, which is the test every data
   layer on this site has to pass. */
.decide{width:100%;border-collapse:collapse;margin-top:24px;
  border:1px solid var(--line-soft);border-radius:8px;overflow:hidden;}
.decide th{text-align:left;font-size:10px;letter-spacing:.15em;text-transform:uppercase;
  color:var(--dim);font-weight:500;padding:14px 18px;background:var(--deep);
  border-bottom:1px solid var(--line-soft);}
.decide td{padding:15px 18px;font-size:14px;line-height:1.6;color:var(--muted);
  border-bottom:1px solid var(--line-soft);vertical-align:top;}
.decide tr:last-child td{border-bottom:0;}
.decide td.dc{color:var(--paper);width:32%;}

/* ---- book first ----
   Urgent and irreversible, so it leaves the bullet list it was buried in. The
   ferry window and a table at Wolf in the Fog are the two things that ruin a
   Tofino weekend, and on the dive side the equivalent gets a whole calendar. */
.booklist{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1px;
  background:var(--line-soft);border:1px solid var(--line-soft);border-radius:8px;
  overflow:hidden;margin-top:24px;}
.bkr{background:var(--abyss);padding:20px 20px 22px;}
.bkr .bkn{font-family:var(--serif);font-size:17px;color:var(--paper);margin-bottom:8px;}
.bkr p{margin:0;font-size:13.5px;line-height:1.6;color:var(--muted);}
@media(max-width:700px){
  .iday{padding:20px 18px;}
  .islots{grid-template-columns:1fr;}
  .decide td.dc{width:40%;}
}

/* A guide with no photograph yet. The hero used to emit <img src=""> — which a
   browser resolves against the current page URL, so it is a broken image at the
   top of a photography site, and no check caught it because an empty src is not
   a path outside the deploy root. Now there is no img at all and the hero is a
   band of ground with the type on it. */
.hero.nohero{min-height:auto;padding:96px 0 64px;background:var(--deep);}
.hero.nohero .veil{display:none;}

/* The dive-by-dive cost of carrying your own gear. Quiet, and set apart from the year-round facts it qualifies. */
.fnote.entrynote{border-left:2px solid var(--line);padding-left:12px;margin-top:14px;max-width:62ch;}

/* ---------------------------------------------------------------------------
   THE CRAFT ARTICLE. Shared by every page in tutorials/.

   THE FAULT THIS EXISTS FOR: it did not. `underwater-housings.html` and
   `resolution-underwater.html` shipped using .art, .body, .lead, .fig, .pull,
   .spec and .meta, and NOT ONE of them was styled -- not here, not in either
   page's own <style> block. Two published articles rendering as a column of
   browser-default paragraphs, and thirty-one checks green over the top of it.

   css-check.js cannot see this. It walks the stylesheet and asks whether each
   styled class reaches an element -- the opposite direction. A class used in
   markup that nothing styles is invisible to it, which is the limit its own
   comment warns about: it proves a class exists, not that a rule targets the
   element you meant.
--------------------------------------------------------------------------- */
.art{max-width:74ch;margin:0 auto;}
.pagehead.art{max-width:78ch;}
.pagehead .meta{margin-top:22px;padding-top:16px;border-top:1px solid var(--line-soft);
  font-size:11.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--muted);}
.pagehead .meta b{color:var(--paper);font-weight:500;}

.art .body p{font-size:16.5px;line-height:1.72;color:var(--muted);margin:0 0 20px;}
.art .body p b{color:var(--paper);font-weight:500;}
.art .body p a{color:var(--copper);}
.art .body p.lead{font-size:19px;line-height:1.62;color:var(--paper);margin-bottom:30px;}
.art .body h2{font-family:var(--serif);font-size:25px;font-weight:400;color:var(--paper);
  margin:44px 0 16px;line-height:1.28;}

/* A figure is the argument, not decoration, so it breaks the measure. */
.fig{margin:36px 0;}
.fig img{width:100%;height:auto;display:block;border-radius:5px;}
.fig figcaption{margin-top:12px;font-size:13px;line-height:1.6;color:var(--muted);max-width:66ch;}
.fig figcaption a{color:var(--copper);}
@media(min-width:1100px){.art .fig{margin-left:-70px;margin-right:-70px;}}

/* THE PHOTOGRAPHER, LEADING "BEFORE YOU GO".
   It used to sit inside section 04, directly under the gallery, where it read
   as a frame that had failed to get into the mosaic. Miles: "I don't like where
   this section sits within pictures, maybe as an image at the top of before you
   go -- that way that is also not a wall of text."

   Both of those are right and they are different arguments. The placement one:
   section 04 is his work and this is a picture OF him, so it was the one frame
   on the page competing with the thing it was meant to introduce. The wall-of-
   text one: section 08 is eight to twelve stacked question rows and nothing to
   look at, on the section that does the most selling.

   NOT CROPPED TO A BAND. A 21:9 slot would take the middle 57% of a 3:2 frame,
   and on the Misool photograph the diver sits low-left with the school high
   right -- a centre crop clips both subjects. This site's argument is that it
   does not crop the thing it is showing you. */
.melead{margin:0 0 40px;}
.melead img{width:100%;height:auto;max-height:78vh;object-fit:cover;display:block;border-radius:5px;}
.melead figcaption{margin-top:12px;font-size:13px;line-height:1.6;
  color:var(--muted);max-width:66ch;}

/* One sentence the reader should carry away. Never an aphorism -- if it reads
   as quotable rather than as a claim, it is the wrong sentence. */
.pull{font-family:var(--serif);font-size:22px;line-height:1.45;color:var(--paper);
  border-left:2px solid var(--copper);padding:4px 0 4px 22px;margin:34px 0;max-width:60ch;}

/* A specification list, which is a data layer rather than a table: label,
   figure, and what the figure means. The third column is the whole point --
   a number with no noun is not information. */
.spec{border-top:1px solid var(--line-soft);margin:28px 0 32px;}
.spec > div{display:grid;grid-template-columns:180px 84px 1fr;gap:18px;align-items:baseline;
  padding:14px 0;border-bottom:1px solid var(--line-soft);}
.spec .l{color:var(--paper);font-size:14px;}
.spec .v{font-family:var(--serif);font-size:19px;color:var(--copper);}
.spec .r{font-size:13.5px;line-height:1.6;color:var(--muted);}

/* WHERE A FIGURE CAME FROM, under the table that prints it. A shared class in
   site.css rather than a page-local one, because all three tutorials publish
   numbers and the .spec block above is the third component this page tried to
   restyle locally. Never invent a class in a page: either it is a component
   and it lives here, or it is not a component and it should not have a name. */
.srcnote{font-size:12.5px;line-height:1.65;color:var(--dim);max-width:66ch;
  margin:-14px 0 30px;}

/* WHY A RELATED CARD IS THERE. The strip used to be the site's top three under
   a heading claiming they were related; the reason line is what makes the new
   pairing checkable -- "Also Raja Ampat" and "Scores like it for macro" are
   both facts a reader can verify against the table two sections up. */
.rcard .rwhy{font-size:11px;letter-spacing:.02em;color:var(--dim);
  padding:0 14px 13px;margin-top:-4px;}

.idx td.inherit{color:var(--dim);}

/* A DEFINITION LIST: a term, an optional sub-label, and a paragraph explaining
   it. Distinct from .spec above, which is a three-cell row for a short measured
   VALUE ("GN 22"). Both were called .spec and lived in two stylesheets, so a
   page whose markup followed one convention got the other one's rules. */
.deflist{border-top:1px solid var(--line-soft);margin:34px 0;max-width:68ch;}
.deflist .r{display:grid;grid-template-columns:190px 1fr;gap:20px;padding:13px 0;
  border-bottom:1px solid var(--line-soft);font-size:13.5px;}
.deflist .r .k{color:var(--copper);letter-spacing:.02em;}
.deflist .r .k .d{display:block;font-size:11px;color:var(--dim);letter-spacing:.04em;margin-top:4px;}
.deflist .r .v{color:var(--muted);line-height:1.6;}
@media(max-width:640px){.deflist .r{grid-template-columns:1fr;gap:4px;}}

@media(max-width:640px){
  .spec > div{grid-template-columns:1fr auto;gap:4px 14px;}
  .spec .r{grid-column:1 / -1;}
}

/* ---- lightbox carousel ------------------------------------------------
   Miles: "the light box should allow me to scroll through other images from
   that destination ... it should work like a carousel for each destination."
   The arrows sit ON the backdrop rather than on the photograph: a control laid
   over a picture someone is deciding whether to buy is a mark they cannot
   remove, which is the same objection as a Buy button on the image itself. */
/* THE ARROWS SIT IN THE COLUMN, DIRECTLY UNDER THE PHOTOGRAPH, ABOVE THE SHELF.
   They were position:fixed at the bottom -- the same place the buy shelf lands --
   so on a landscape frame the title, edition and price rendered THROUGH the
   arrows. Miles: "light box navigation interferes with description". A control
   and the thing it controls belong together; the shelf, the count and the arrows
   are now one stack under the picture. (The black-field variant keeps its
   overlay, stacked the same way.) */
.lbnav{position:static;display:flex;align-items:center;
  justify-content:center;gap:20px;z-index:3;pointer-events:none;margin-top:16px;}
.lb.dark .lbnav{position:fixed;left:0;right:0;bottom:92px;margin:0;}
.lbnav>*{pointer-events:auto;}
.lba{width:44px;height:44px;border-radius:50%;border:1px solid rgba(242,239,233,.28);
  background:rgba(10,18,20,.72);color:var(--paper);font-size:22px;line-height:1;
  cursor:pointer;display:grid;place-items:center;transition:border-color .15s,background .15s;}
.lba:hover{border-color:var(--copper);background:rgba(10,18,20,.92);}
.lbn{font-size:12px;letter-spacing:.1em;color:var(--muted);min-width:64px;text-align:center;}
body.lbon{overflow:hidden;}

/* The old print page's zoom-in cursor rule on .pshot.zoomable was removed 16 Sep --
   the Ive design's product page (v4gen.real_product_page) uses .v4-fr, a real
   button, which needs no cursor override. Dead the moment write_print_pages()
   stopped emitting .pshot anywhere on the shipped site -- css lint catches a rule
   matching nothing, which is exactly this. */

/* ---- lightbox --------------------------------------------------------
   MOVED HERE FROM template.html, and the reason is the `.bar` fault in its
   purest form. These rules lived in the guide template's page-local <style>.
   The moment the lightbox became a shared component -- guide pages AND the 46
   product pages -- the product pages had the markup, the module and the data
   and no CSS, so `.lb` stayed at its default `display:none` with nothing to
   turn it on. Miles: "the carousel light box is broken, it display nothing".
   The arrows showed because .lbnav is position:fixed and lives in this file,
   which is precisely why the symptom looked like a data problem.
   A COMPONENT USED BY MORE THAN ONE PAGE TYPE CANNOT BE STYLED PAGE-LOCALLY.
   --lb-bg and --lb-pad stay tokens, so Miles Above keeps its own variation. */
.lb.on{display:flex;}
.lb img{max-width:100%;max-height:calc(100% - 130px);object-fit:contain;}
.lb.dark img{max-height:100%;max-width:100%;}
.lb.dark .lbbuy{position:absolute;left:0;right:0;bottom:52px;margin:0;
  padding:0 30px;text-shadow:0 1px 14px rgba(0,0,0,.9);}
.lb{position:fixed;inset:0;background:var(--lb-bg,rgba(6,11,12,.97));z-index:200;display:none;
  flex-direction:column;align-items:center;justify-content:center;
  padding:var(--lb-pad,30px 30px 24px);cursor:zoom-out;}
.lb.dark{background:#000;padding:0;}
/* THE CAPTION, 17 Sep. A description under the photograph at full size, instead of
   burned over the top of it in the grid. Sits between the image and the buy shelf,
   centred on the same measure, and is display:none whenever a frame carries no
   caption -- which is every gallery that existed before today. Styled here and not
   page-locally: one lightbox, one stylesheet. */
.lbcap{margin-top:14px;max-width:62ch;text-align:center;cursor:auto;
  font:300 14px/1.6 var(--sans);color:var(--paper);opacity:.92;}
.lb.dark .lbcap{position:absolute;left:0;right:0;bottom:96px;margin:0;padding:0 30px;
  max-width:none;text-shadow:0 1px 14px rgba(0,0,0,.9);}
.lbexif{margin-top:10px;text-align:center;font:400 11px/1.6 "IBM Plex Mono",ui-monospace,monospace;letter-spacing:.08em;color:var(--paper);opacity:.6;cursor:auto;}
.lb.dark .lbexif{position:absolute;left:0;right:0;bottom:72px;margin:0;padding:0 30px;text-shadow:0 1px 14px rgba(0,0,0,.9);}
.lbbuy{margin-top:14px;display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;
  justify-content:center;cursor:auto;min-height:22px;}
.lbbuy .t{font-family:var(--serif);font-size:16px;color:var(--paper);}
.lbbuy .m{font-size:11.5px;color:var(--dim);letter-spacing:.03em;}
.lbbuy a{font-size:12px;color:var(--copper);text-decoration:none;border-bottom:1px solid rgba(201,114,74,.4);}
.lbbuy a:hover{border-bottom-color:var(--copper);}

/* ---- previous / next under a product photograph ------------------------------------
   The guides' `.guide .gnext` (site/data/template.html), carried to the one page type that
   does not wear `.guide`. Same declarations -- flex, space-between, 10px sans caps at .2em,
   a copper underline on the link -- with the guide's tokens (--g-ink, --g-mut, --g-rule)
   swapped for this ground's (--paper, --dim, --line): the guide strip is white paper and a
   product page is ink. The horizontal padding is dropped because the strip sits inside
   .v4-wrap, which already sets the measure. Selector is `.gnext.pnext`, not a bare `.pnext`,
   so BOTH classes on the element resolve to a rule the page can reach (lint_css). */
.gnext.pnext{display:flex;justify-content:space-between;gap:16px;padding:16px 0;border-top:1px solid var(--line);
  font:500 10px/1.4 var(--sans);letter-spacing:.2em;text-transform:uppercase;color:var(--dim);}
.gnext.pnext a{color:var(--paper);text-decoration:none;border-bottom:1px solid var(--copper);}
