/* fonts served from this origin — the site makes no external requests */
@font-face{font-family:"Bricolage Grotesque";font-style:normal;font-weight:200 800;font-display:swap;
  src:url(fonts/bricolage.woff2) format("woff2-variations")}
@font-face{font-family:"Source Serif 4";font-style:normal;font-weight:200 900;font-display:swap;
  src:url(fonts/source-serif.woff2) format("woff2-variations")}
@font-face{font-family:"Source Serif 4";font-style:italic;font-weight:200 900;font-display:swap;
  src:url(fonts/source-serif-it.woff2) format("woff2-variations")}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;
  src:url(fonts/plex-mono-400.woff2) format("woff2")}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:500;font-display:swap;
  src:url(fonts/plex-mono-500.woff2) format("woff2")}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:600;font-display:swap;
  src:url(fonts/plex-mono-600.woff2) format("woff2")}

:root{
  --paper:#EEF1F3;
  --surface:#FFFFFF;
  --surface-2:#E3E8EB;
  --ink:#10151C;
  --ink-2:#39444F;
  --ink-3:#636F79;
  --rule:#C9D2D8;
  --rule-soft:#DCE3E7;
  /* Darkened 2026-09-22 from #BF4517, which measured 4.54:1 on the page
     background — AA needs 4.5, so it had 0.04 of headroom and failed the moment
     it sat on anything. 15 figure labels were below AA in light mode purely
     because an accent label was drawn over a 13-14% tint OF ITSELF. Lowering
     those tints alone cannot fix it: the solver put the required tint at 0, and
     in kitesurfing 8.1 the tinted bar IS the data. This value reads 5.53:1
     plain and ~4.9:1 on the reduced 8% tint. Dark mode (#FF7A47) already had
     7.28:1 and is unchanged. Same call as A19 made for the cyan: a live AA
     failure is a defect fix, not a scope change. */
  --accent:#A83D14;
  --accent-soft:#F2DCD3;
  --cyan:#1F6F8B;
  --cyan-soft:#D6E7EC;
  /* Text drawn ON TOP of a filled accent or cyan mark - a label inside a bar,
     not beside it. It cannot be a fixed colour and it cannot be currentColor.
     Added 2026-09-22: five such labels were hardcoded fill="#FFFFFF", which is
     right in light mode (5.67:1 on the cyan, 6.28:1 on the accent) and wrong in
     dark, where both marks get BRIGHTER rather than darker - white on the dark
     cyan measured 2.23:1 and on the dark accent 2.58:1, live. The label has to
     invert with the theme like everything else. Dark uses the figure surface so
     the text reads as punched through the bar: 7.78:1 on cyan, 6.71:1 on
     accent. */
  --on-mark:#FFFFFF;
  --warn:#8A5A00;
  --shadow:rgba(16,21,28,.10);
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    --paper:#0D1218;
    --surface:#141B23;
    --surface-2:#1B242E;
    --ink:#E6EDF2;
    --ink-2:#B2C0CC;
    --ink-3:#7E8D9A;
    --rule:#2A3742;
    --rule-soft:#1F2A34;
    --accent:#FF7A47;
    --accent-soft:#3A2016;
    --cyan:#63B9D4;
    --cyan-soft:#12303A;
    --on-mark:#141B23;
    --warn:#E0A83C;
    --shadow:rgba(0,0,0,.45);
  }
}
:root[data-theme="dark"]{
  --paper:#0D1218;
  --surface:#141B23;
  --surface-2:#1B242E;
  --ink:#E6EDF2;
  --ink-2:#B2C0CC;
  --ink-3:#7E8D9A;
  --rule:#2A3742;
  --rule-soft:#1F2A34;
  --accent:#FF7A47;
  --accent-soft:#3A2016;
  --cyan:#63B9D4;
  --cyan-soft:#12303A;
  --on-mark:#141B23;
  --warn:#E0A83C;
  --shadow:rgba(0,0,0,.45);
}

*{box-sizing:border-box}
body{
  margin:0;
  background:var(--paper);
  color:var(--ink);
  font-family:"Source Serif 4",Georgia,"Times New Roman",serif;
  font-size:17px;
  line-height:1.62;
  -webkit-font-smoothing:antialiased;
}
h1,h2,h3,h4,.disp{font-family:"Bricolage Grotesque","Helvetica Neue",Arial,sans-serif;text-wrap:balance}
code,.mono,table,.fig-label,.eyebrow,.num{font-family:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,monospace}

.wrap{max-width:1180px;margin:0 auto;padding-inline:20px;padding-block:0}
.col{max-width:66ch}

/* ---------- cover ---------- */
.cover{
  border-bottom:1px solid var(--rule);
  padding-block:clamp(40px,7vw,86px) clamp(32px,5vw,60px);
}
.cover .eyebrow{
  font-size:11px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--accent);font-weight:600;margin:0 0 20px;
}
.cover h1{
  font-size:clamp(42px,9vw,92px);line-height:.95;letter-spacing:-.025em;
  font-weight:800;margin:0 0 22px;
}
.cover .sub{
  font-size:clamp(17px,2.2vw,22px);line-height:1.45;color:var(--ink-2);
  max-width:34ch;margin:0 0 30px;
}
.spec{
  display:flex;flex-wrap:wrap;gap:0;border-top:1px solid var(--rule);
  font-family:"IBM Plex Mono",monospace;font-size:12px;
}
.spec div{
  padding:12px 22px 12px 0;margin-right:22px;border-right:1px solid var(--rule-soft);
}
.spec div:last-child{border-right:0}
.spec b{display:block;color:var(--ink-3);font-weight:500;font-size:10px;letter-spacing:.1em;text-transform:uppercase;margin-bottom:3px}

/* ---------- layout ---------- */
.book{display:grid;grid-template-columns:minmax(0,1fr);gap:0}
.book > *{min-width:0}
@media (min-width:1000px){
  .book{grid-template-columns:232px minmax(0,1fr);gap:56px;align-items:start}
  .toc-rail{position:sticky;top:calc(env(safe-area-inset-top,0px) + 24px);max-height:88vh;overflow-y:auto;padding-block:40px 40px}
}
.toc-rail{padding-block:28px}
.toc-rail h2{
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);
  margin:0 0 12px;font-weight:600;
}
.toc-rail ol{list-style:none;margin:0 0 22px;padding:0;font-family:"IBM Plex Mono",monospace;font-size:12.5px;line-height:1.5}
.toc-rail li{margin-bottom:7px;display:flex;gap:9px}
.toc-rail a{color:var(--ink-2);text-decoration:none;border-bottom:1px solid transparent}
.toc-rail a:hover{color:var(--accent);border-bottom-color:var(--accent)}
.toc-rail .n{color:var(--ink-3);min-width:1.6em}
.toc-rail .part{color:var(--accent);font-size:10px;letter-spacing:.12em;text-transform:uppercase;margin:0 0 8px;font-weight:600}

main{padding-block:28px 72px}

/* ---------- parts & chapters ---------- */
.part-open{
  margin:68px 0 34px;padding-top:26px;border-top:2px solid var(--ink);
  display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;
}
.part-open .pn{font-family:"IBM Plex Mono",monospace;font-size:12px;color:var(--accent);letter-spacing:.12em;text-transform:uppercase;font-weight:600}
.part-open h2{font-size:clamp(26px,4vw,38px);margin:0;letter-spacing:-.02em;font-weight:800;line-height:1.05}
.part-open .pd{flex-basis:100%;color:var(--ink-3);font-size:15px;margin-top:2px;max-width:60ch}

.ch{margin:0 0 58px;scroll-margin-top:24px}
.ch-head{margin:46px 0 20px}
.ch-head .num{font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);display:block;margin-bottom:9px}
.ch-head h3{font-size:clamp(24px,3.6vw,33px);line-height:1.1;letter-spacing:-.02em;margin:0;font-weight:800}

h4{font-size:15px;letter-spacing:.01em;margin:32px 0 10px;font-weight:600;color:var(--ink)}
p{margin:0 0 15px;max-width:66ch}
strong{font-weight:600}
a{color:var(--accent)}

ul,ol{max-width:66ch;padding-left:1.15em;margin:0 0 15px}
li{margin-bottom:7px}

/* ---------- pull elements ---------- */
.lede{font-size:19px;line-height:1.5;color:var(--ink-2);max-width:60ch;margin-bottom:22px}

blockquote{
  margin:20px 0;padding:14px 0 14px 20px;border-left:3px solid var(--accent);
  max-width:64ch;font-size:16.5px;color:var(--ink);
}
blockquote p{margin-bottom:8px}
blockquote p:last-child{margin-bottom:0}
blockquote cite{display:block;font-style:normal;font-family:"IBM Plex Mono",monospace;font-size:11.5px;color:var(--ink-3);margin-top:8px}

.callout{
  border:1px solid var(--rule);background:var(--surface);border-radius:2px;
  padding:18px 20px;margin:24px 0;max-width:66ch;
}
.callout.warn{border-left:3px solid var(--accent);background:var(--accent-soft)}
.callout.warn p{color:var(--ink)}
.callout .k{
  font-family:"IBM Plex Mono",monospace;font-size:10px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--accent);display:block;margin-bottom:8px;font-weight:600;
}
.callout p:last-child{margin-bottom:0}

.keyfact{
  display:flex;gap:18px;align-items:baseline;margin:22px 0;padding:16px 0;
  border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);max-width:66ch;
}
.keyfact .big{
  font-family:"Bricolage Grotesque",sans-serif;font-size:42px;font-weight:800;
  line-height:1;color:var(--accent);letter-spacing:-.03em;white-space:nowrap;
}
.keyfact .t{font-size:15px;color:var(--ink-2);line-height:1.4}

/* ---------- tables ---------- */
.tw{overflow-x:auto;margin:22px 0;border:1px solid var(--rule);border-radius:2px;background:var(--surface)}
table{border-collapse:collapse;width:100%;font-size:13px;font-variant-numeric:tabular-nums}
th,td{padding:9px 13px;text-align:left;border-bottom:1px solid var(--rule-soft);vertical-align:top}
th{
  background:var(--surface-2);font-weight:600;font-size:10.5px;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink-2);white-space:nowrap;
}
tbody tr:last-child td{border-bottom:0}
td strong{color:var(--ink);font-weight:600}
.hl td{background:var(--accent-soft)}

/* ---------- figures ---------- */
figure{margin:32px 0;max-width:100%}
figure svg{display:block;width:100%;max-width:100%;height:auto;color:var(--ink)}
/* The figures' themed colours, as classes rather than attributes. SVG
   presentation attributes do not accept var(): fill="var(--accent)" is simply
   invalid and the element falls back to black, so a class is the only way a
   figure can follow the theme. Before this they were hardcoded hex - the accent
   in 220 places, the cyan in 28 - and stayed at their light-mode values on the
   dark page while everything around them switched. Measured against the figure
   surface: the accent's 97 text labels at 3.4:1 and the cyan's 8 at 3.1:1, under
   the 4.5:1 AA wants at those sizes. Structure uses currentColor and always did
   follow the theme; only the coloured marks did not.
   Adding a colour: add the rules here and use the class in the figures.
   verify_figure_colours.mjs checks every one of them in both themes. */
figure svg .accent-fill{fill:var(--accent)}
figure svg .accent-stroke{stroke:var(--accent)}
figure svg .accent-stop{stop-color:var(--accent)}
figure svg .cyan-fill{fill:var(--cyan)}
figure svg .cyan-stroke{stroke:var(--cyan)}
figure svg .on-mark-fill{fill:var(--on-mark)}
figcaption{
  font-family:"IBM Plex Mono",monospace;font-size:11.5px;line-height:1.5;color:var(--ink-3);
  margin-top:12px;padding-top:9px;border-top:1px solid var(--rule-soft);max-width:70ch;
}
figcaption b{color:var(--ink-2);font-weight:600}
.fig-frame{border:1px solid var(--rule);background:var(--surface);padding:22px 20px;border-radius:2px}
@media (min-width:1000px){.fig-wide{width:min(100%,900px)}}

/* ---------- misc ---------- */
.gaps{border:1px dashed var(--rule);padding:18px 20px;margin:26px 0;max-width:66ch;background:transparent}
.gaps .k{font-family:"IBM Plex Mono",monospace;font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);display:block;margin-bottom:8px;font-weight:600}
.src p{font-size:13.5px;color:var(--ink-2);max-width:72ch}
.endnote{margin-top:64px;padding-top:24px;border-top:2px solid var(--ink);font-size:13px;color:var(--ink-3);max-width:70ch}

@media (prefers-reduced-motion:no-preference){a{transition:color .15s,border-color .15s}}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}

/* ---------- print ----------
   Added 2026-09-21. There was no print stylesheet before this, despite the
   to-do list asserting there was: printing a book page put the sticky contents
   rail on paper and clipped the widest tables. verify_print.mjs checks all of
   it, at paper width - emulateMedia alone does not resize the viewport, so a
   check that skips that step flags every block element and means nothing. */
@media print {
  /* Force the light palette. These selectors must match the specificity of the
     dark-mode rules above, or a reader printing in dark mode gets black paper. */
  :root,
  :root:not([data-theme="light"]),
  :root[data-theme="dark"] {
    --paper:#fff; --surface:#fff; --surface-2:#f4f4f4;
    --ink:#000; --ink-2:#1a1a1a; --ink-3:#444;
    --rule:#999; --rule-soft:#ccc; --accent-soft:#f0f0f0; --shadow:transparent;
  }
  body { background:#fff; font-size:10.5pt; line-height:1.45 }

  /* Screen furniture that has no business on paper. */
  .toc-rail, .dl, .downloads, nav, .site-nav { display:none !important }

  /* One column, full measure. */
  .book { display:block }
  .wrap { max-width:none; padding-inline:0 }
  .col, p, ul, ol, blockquote, .callout, .keyfact, .gaps, .lede { max-width:none }
  main { padding-block:0 }
  .cover { padding-block:0 14pt }

  /* Keep things whole across a page break. */
  h1, h2, h3, h4, .ch-head { break-after:avoid; page-break-after:avoid }
  figure, .callout, .keyfact, .gaps, blockquote, .tw { break-inside:avoid; page-break-inside:avoid }
  .part-open { break-before:page; page-break-before:always }

  /* Tables were the one thing actually clipped: the power book's wind table ran
     760px into a 702px page box, the parakite licensing table 714px. Fixed
     layout plus wrapping keeps them inside the margin. */
  .tw { overflow:visible; border-radius:0 }
  table { font-size:8.5pt; table-layout:fixed; width:100% }
  th, td { word-break:break-word; overflow-wrap:anywhere; padding:4px 6px }
  /* th carries white-space:nowrap on screen. On paper that is what actually
     overflows: the power book's 12-column Beaufort table has headers that cannot
     wrap, so they set a 799px minimum inside a 700px table. Let them wrap. */
  th { white-space:normal }

  figure svg { max-width:100% !important; height:auto }
  a { color:inherit; text-decoration:underline }
}

/* ---------- site chrome (shared across the two books) ---------- */
.sitebar{
  border-bottom:1px solid var(--rule); background:var(--surface);
  position:sticky; top:0; z-index:40;
}
.sitebar .in{
  max-width:1180px; margin:0 auto; padding:10px 20px;
  display:flex; align-items:center; gap:18px; flex-wrap:wrap;
  font-family:"IBM Plex Mono",monospace; font-size:11px;
  letter-spacing:.1em; text-transform:uppercase;
}
.sitebar a{ color:var(--ink-3); text-decoration:none; border-bottom:1px solid transparent;
  display:inline-flex; align-items:center; min-height:24px; }
.sitebar a:hover{ color:var(--accent); border-bottom-color:var(--accent); }
.sitebar .home{ color:var(--ink); font-weight:600; letter-spacing:.14em; }
.sitebar .sep{ margin-left:auto; }
.sitebar a[aria-current="page"]{ color:var(--accent); }

.themer{
  display:inline-flex; align-items:center; gap:6px; cursor:pointer; min-height:24px;
  font:inherit; letter-spacing:inherit; text-transform:inherit;
  color:var(--ink-3); background:none; border:0; padding:0; line-height:1;
}
.themer:hover{ color:var(--accent); }
.themer svg{ width:12px; height:12px; display:block; }

/* ---------- display formula ---------- */
.formula{
  margin:26px 0; padding:18px 20px; max-width:66ch;
  border-left:3px solid var(--accent); background:var(--surface);
  font-family:"IBM Plex Mono",monospace; font-size:21px; letter-spacing:.03em;
  display:flex; align-items:baseline; gap:.42em; color:var(--ink);
}
.formula .op{ opacity:.55; }
.formula sup{ font-size:.58em; vertical-align:super; }


.sitebar .offline{
  font-size:9.5px; letter-spacing:.12em; color:var(--accent);
  border:1px solid var(--accent); border-radius:2px; padding:2px 6px; margin-left:-10px;
}
.dl{
  border:1px solid var(--rule); border-radius:2px; background:var(--surface);
  padding:22px 24px; margin:34px 0 0;
}
.dl h3{ margin:0 0 6px; font-size:15px; }
.dl p{ font-size:14.5px; color:var(--ink-2); margin:0 0 16px; max-width:60ch; }
.dl ul{ list-style:none; margin:0; padding:0; max-width:none; }
.dl li{ margin:0; border-top:1px solid var(--rule-soft); }
.dl li a{
  display:flex; align-items:baseline; gap:12px; flex-wrap:wrap;
  padding:11px 0; text-decoration:none; color:var(--ink);
  font-family:"IBM Plex Mono",monospace; font-size:12.5px;
}
.dl li a:hover{ color:var(--accent); }
.dl li a .sz{ color:var(--ink-3); font-size:11px; margin-left:auto; }
.dl li a .arr{ color:var(--accent); }

/* ---------- landing ---------- */
.shelf{ display:grid; gap:20px; margin:34px 0 0; grid-template-columns:repeat(auto-fit,minmax(272px,1fr)); }
@media (min-width:820px){ .shelf{ gap:24px; } }
.vol{
  display:block; text-decoration:none; color:inherit;
  border:1px solid var(--rule); background:var(--surface); border-radius:2px;
  padding:26px 24px 24px; transition:border-color .15s, transform .15s;
}
.vol:hover{ border-color:var(--accent); transform:translateY(-2px); }
.vol .vn{
  font-family:"IBM Plex Mono",monospace; font-size:10px; letter-spacing:.16em;
  text-transform:uppercase; color:var(--accent); font-weight:600; display:block; margin-bottom:12px;
}
.vol h2{ font-size:clamp(23px,3vw,30px); line-height:1.1; letter-spacing:-.02em; margin:0 0 12px; font-weight:800; }
.vol p{ margin:0 0 14px; font-size:15.5px; color:var(--ink-2); max-width:46ch; }
.vol .meta{
  font-family:"IBM Plex Mono",monospace; font-size:11px; color:var(--ink-3);
  border-top:1px solid var(--rule-soft); padding-top:11px; margin-top:16px;
}
.vol .go{ font-family:"IBM Plex Mono",monospace; font-size:11px; color:var(--accent); letter-spacing:.08em; text-transform:uppercase; font-weight:600; }
.sitefoot{ margin-top:64px; padding:24px 0 72px; border-top:2px solid var(--ink); font-size:13px; color:var(--ink-3); max-width:70ch; }

/* ---------- spots atlas (build_spots.py) ---------- */
.tabs{ display:flex; flex-wrap:wrap; gap:2px 6px; margin:0 0 28px; border-bottom:1px solid var(--rule); }
/* While a spots page streams in, only the first continent shows; the tab script at the
   foot of the page then chooses the right one and adds .tabs-ready. Without JS there is
   no .js class and every continent shows, which is the intended no-script page. */
html.js:not(.tabs-ready) .continent ~ .continent{ display:none; }
.tabs button{
  font-family:"IBM Plex Mono",monospace; font-size:11.5px; letter-spacing:.1em; text-transform:uppercase;
  color:var(--ink-3); background:none; border:0; border-bottom:2px solid transparent; margin-bottom:-1px;
  padding:10px 12px; min-height:24px; cursor:pointer; line-height:1;
}
.tabs button:hover{ color:var(--accent); }
.tabs button[aria-selected="true"]{ color:var(--ink); border-bottom-color:var(--accent); }
.tabs .cnt{ color:var(--ink-3); margin-left:6px; font-weight:400; }
/* the books let figure svgs overflow so labels can escape; a map must clip to its window */
.cmap svg{ overflow:hidden; }
.cmap svg .land{ fill:var(--surface-2); stroke:var(--ink-3); stroke-opacity:.55; stroke-width:.8; }
.cmap svg .pin text{ font-family:"IBM Plex Mono",monospace; font-size:10px; font-weight:600; text-anchor:middle; pointer-events:none; }
.cmap svg .pin:hover circle, .cmap svg .pin:focus circle{ stroke:var(--ink); stroke-width:2; }
.spot{ border-top:2px solid var(--ink); padding-top:20px; margin:0 0 56px; }
.spot .ch-head{ margin-bottom:6px; }
.spot .where{ font-family:"IBM Plex Mono",monospace; font-size:11px; letter-spacing:.08em; text-transform:uppercase; color:var(--ink-3); margin:0 0 14px; }
.spot .spec{ margin:16px 0 0; }
.year{ display:grid; grid-template-columns:repeat(12,minmax(0,1fr)); gap:3px; max-width:66ch; margin:18px 0 8px;
  font-family:"IBM Plex Mono",monospace; font-size:10px; letter-spacing:.06em; color:var(--ink-3); }
.year span{ text-align:center; padding:7px 0 3px; border-top:5px solid var(--rule-soft); }
.year .m1{ border-top-color:var(--rule); }
.year .m2{ border-top-color:var(--cyan); }
.year .m3{ border-top-color:var(--accent); }
.year-key{ font-family:"IBM Plex Mono",monospace; font-size:10.5px; color:var(--ink-3); margin:0 0 20px; }
.spot-links{ font-family:"IBM Plex Mono",monospace; font-size:12px; letter-spacing:.04em; margin:0 0 6px; }
.spot-links a{ margin-right:16px; }
.spot .sources ol{ font-size:14px; }
/* records quote bare URLs; a 50-character unbreakable string is wider than a phone */
.spot p, .spot li, .spot td{ overflow-wrap:anywhere; }
.empty{ color:var(--ink-3); }


@media print{
@page{ size:A4; margin:16mm 15mm 17mm 15mm; }
html,body{ background:#fff !important; }
html{ -webkit-print-color-adjust:exact; print-color-adjust:exact; }
body{ font-size:10.3pt; line-height:1.54; }
.sitebar,.themer{ display:none !important; }
.wrap{ max-width:none; padding-inline:0; }
.book{ display:block !important; grid-template-columns:none !important; gap:0 !important; }
main{ padding-block:0; }
a{ text-decoration:none; color:var(--ink) !important; }
.cover{ padding:52mm 0 0; border-bottom:0; min-height:247mm; display:flex; flex-direction:column; }
.cover h1{ font-size:56pt; line-height:.92; margin-bottom:10mm; letter-spacing:-.03em; }
.cover .sub{ font-size:13.5pt; line-height:1.4; max-width:38ch; margin-bottom:auto; }
.cover .eyebrow{ font-size:9pt; margin-bottom:8mm; }
.cover .spec{ font-size:8.4pt; margin-bottom:6mm; border-top:1px solid var(--rule); padding-top:2mm; }
.cover .spec div{ padding:3mm 5mm 3mm 0; margin-right:5mm; }
.cover .spec b{ font-size:7pt; }
.toc-rail{ position:static !important; max-height:none !important; overflow:visible !important;
  padding-block:0 !important; break-before:page; break-after:page; }
.toc-rail h4{ font-size:8pt; margin-bottom:6mm; }
.toc-rail ol{ font-size:9.6pt; line-height:1.45; margin-bottom:7mm; }
.toc-rail li{ margin-bottom:2.4mm; }
.toc-rail .part{ font-size:8pt; margin-bottom:3mm; }
.part-open{ break-before:page; break-after:avoid; margin:0 0 9mm; border-top:2px solid var(--ink); padding-top:5mm; }
.part-open h2{ font-size:24pt; }
.part-open .pd{ font-size:10pt; }
.ch{ break-before:page; margin:0; }
.part-open + .ch{ break-before:avoid; }
.ch-head{ margin:0 0 6mm; break-after:avoid; }
.ch-head h3{ font-size:19pt; line-height:1.12; }
.ch-head .num{ font-size:8.4pt; margin-bottom:2.5mm; }
h4{ font-size:11pt; margin:7mm 0 2.5mm; break-after:avoid; }
p{ orphans:3; widows:3; max-width:none; }
ul,ol{ max-width:none; }
.lede{ font-size:12pt; max-width:none; margin-bottom:6mm; }
figure,.callout,.keyfact,blockquote,.gaps,.tw,.formula{ break-inside:avoid; max-width:none; }
figure{ margin:8mm 0; }
.fig-frame{ padding:6mm 5mm; }
figcaption{ font-size:8.6pt; margin-top:3mm; padding-top:2.5mm; max-width:none; }
.callout{ padding:4.5mm 5mm; margin:6mm 0; }
.callout .k{ font-size:7.6pt; }
.keyfact{ margin:6mm 0; padding:4mm 0; }
.keyfact .big{ font-size:28pt; }
.keyfact .t{ font-size:10pt; }
.formula{ font-size:14pt; padding:4mm 5mm; margin:6mm 0; }
blockquote{ margin:6mm 0; padding:3mm 0 3mm 5mm; font-size:10.4pt; max-width:none; }
blockquote cite{ font-size:8.4pt; }
.tw{ overflow:visible; margin:6mm 0; }
table{ font-size:8.4pt; }
th,td{ padding:2mm 3mm; }
th{ font-size:7.6pt; }
thead{ display:table-header-group; }
tr{ break-inside:avoid; }
.src p{ font-size:9.4pt; max-width:none; }
.gaps{ padding:4.5mm 5mm; margin:6mm 0; }
.endnote{ margin-top:10mm; padding-top:5mm; font-size:9.4pt; max-width:none; break-inside:avoid; }
/* the atlas: every continent prints, tabs do not */
.tabs{ display:none !important; }
.continent[hidden]{ display:block !important; }
html.js .continent{ display:block !important; }
.spot{ break-before:page; margin:0; }
}
