/* ===== theme/tokens.css ===== */
/* ============================================================================
   Research tokens: the only values any research block may read.

   Two layers:

   1. HOST tokens (--r-font-*, --r-paper, --r-ink, --r-accent, --r-radius, …)
      describe the site the page lands on. The integrating agent maps the host
      site's own variables onto these, once, in the site's CSS. Defaults below
      are neutral so an unmapped page still looks deliberate.

   2. RESEARCH-LAYER tokens (--r-panel-*, --r-num-*, --r-eyebrow-*, --r-bar-*)
      are the research pages' own visual language, derived from the host
      tokens. Locked in lab F1. Hosts normally never touch these.

   Rules:
   - Every research block lives inside `.rs` and reads only --r-* tokens.
     No block hard-codes a colour, family, size or radius.
   - Blocks respond to their CONTAINER (`@container rs`), never the viewport,
     because host layouts differ (sidebars, narrow article columns).
   - Light only. Host sites decide on dark mode; if one adds it, it remaps
     the host tokens and supplies dark chart steps.
   ============================================================================ */

.rs {
  /* ---- 1. Host tokens --------------------------------------------------- */
  --r-font-body: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
  --r-font-head: var(--r-font-body);
  --r-font-num:  var(--r-font-head);       /* figures in stats, tables, charts */

  --r-size-body: 18px;
  --r-leading:   1.65;
  --r-measure:   680px;
  --r-size-h1:   38px;
  --r-size-h2:   27px;
  --r-size-h3:   21px;
  --r-size-lede: 20px;
  --r-size-small: 15.5px;
  --r-size-micro: 13px;
  --r-weight-head: 700;
  --r-tracking-head: -0.02em;

  --r-paper:     #FFFFFF;   /* page ground */
  --r-card:      #FFFFFF;   /* raised surface */
  --r-ink:       #16181D;
  --r-ink-soft:  #5B616B;
  --r-ink-faint: #8B9099;
  --r-rule:      #E3E5E8;
  --r-accent:    #2456C9;   /* links, eyebrows */
  --r-accent-ink:#1A3F94;
  --r-radius:    12px;

  /* Categorical chart slots, validated per host (see theme/skins/*.css).
     Slot 1 is also the single-series colour. */
  --r-series-1:  #2563EB;
  --r-series-2:  #E0592A;
  --r-series-3:  #12916a;
  --r-series-4:  #7C3AED;

  /* ---- 2. Research-layer tokens: LOCKED in lab F1, 2026-09-15 ------------
     Owner choice (verbatim):
       F1 variant=A (Editorial rules) tuned=[shadow,numColor,numScale,barH,btn] | panel=none
       tint=5 tintSrc=ink border=0 radius=0 shadow=soft density=1 findings=list
       numColor=accent numWeight=700 numScale=1.6 accentBar=0 h2mark=rule eyebrow=upper
       barH=16 bars=highlight grid=on btn=solid
     Follow-up decision: shadow with no surface drew a bare edge, so boxed blocks
     (key findings, charts, tables) became white cards with padding + that soft shadow.
     Structural parts of the choice live in the blocks: findings=list (key-findings),
     h2mark=rule (base.css), bars=highlight + grid=on (chart-bar), btn=solid (base.css). */
  --r-density:        1;                          /* multiplies block spacing */
  --r-gap:            calc(24px * var(--r-density));
  --r-block-space:    calc(40px * var(--r-density));

  --r-panel-bg:       var(--r-card);
  --r-panel-border-w: 0px;
  --r-panel-border-c: var(--r-rule);
  --r-panel-radius:   0px;
  --r-panel-shadow:   0 1px 2px rgba(20,20,30,.05), 0 10px 26px -14px rgba(20,20,30,.18);
  --r-panel-pad:      calc(22px * var(--r-density));
  --r-rule-w:         1px;                        /* hairlines between items */
  --r-accent-bar-w:   0px;                        /* left bar on stat items */

  --r-num-weight:     700;
  --r-num-color:      var(--r-accent);
  --r-num-scale:      1.6;                        /* stat number vs body size */

  --r-eyebrow-transform: uppercase;
  --r-eyebrow-tracking:  0.08em;

  --r-btn-radius:     calc(var(--r-radius) * 0.6);

  --r-bar-h:          16px;
  --r-grid-opacity:   1;
  --r-data-mute:      color-mix(in srgb, var(--r-ink) 22%, var(--r-paper));
  --r-data-track:     color-mix(in srgb, var(--r-ink) 6%, var(--r-paper));
  --r-grid:           color-mix(in srgb, var(--r-ink) 10%, var(--r-paper));

  container: rs / inline-size;
  color: var(--r-ink);
  font-family: var(--r-font-body);
  font-size: var(--r-size-body);
  line-height: var(--r-leading);
}

/* Resolved sizes. Blocks read --r-h1/--r-h2/--r-body (never the --r-size-* inputs),
   so the narrow-container step-down lands everywhere. A container query can only
   style descendants of the container, hence the inner `.rs-scope` wrapper. */
.rs-scope {
  --r-h1: var(--r-size-h1);
  --r-h2: var(--r-size-h2);
  --r-h3: var(--r-size-h3);
  --r-body: var(--r-size-body);
  --r-lede: var(--r-size-lede);
  --r-space: var(--r-block-space);
}
@container rs (max-width: 560px) {
  .rs-scope {
    --r-h1: calc(var(--r-size-h1) * 0.78);
    --r-h2: calc(var(--r-size-h2) * 0.84);
    --r-h3: calc(var(--r-size-h3) * 0.92);
    --r-body: calc(var(--r-size-body) * 0.95);
    --r-lede: calc(var(--r-size-lede) * 0.9);
    --r-space: calc(var(--r-block-space) * 0.8);
    --r-panel-pad: calc(16px * var(--r-density));
  }
}


/* ===== theme/base.css ===== */
/* ============================================================================
   Base: typography inside a research page. Reads --r-* tokens only.
   Everything is scoped under .rs-scope so host-site CSS and ours never collide.
   ============================================================================ */

.rs-scope { font-size: var(--r-body); }
.rs-scope *, .rs-scope *::before, .rs-scope *::after { box-sizing: border-box; }

.rs-scope :where(h1, h2, h3, h4) {
  font-family: var(--r-font-head);
  font-weight: var(--r-weight-head);
  letter-spacing: var(--r-tracking-head);
  line-height: 1.18;
  color: var(--r-ink);
  margin: 0;
  text-wrap: balance;
}
.rs-scope :where(h1) { font-size: var(--r-h1); }
.rs-scope :where(h2) { font-size: var(--r-h2); margin-top: var(--r-space); margin-bottom: 0.5em;
  border-top: 1px solid var(--r-rule); padding-top: 0.65em; }          /* F1: h2mark=rule */
.rs-scope :where(h3) { font-size: var(--r-h3); margin-top: calc(var(--r-space) * 0.7); margin-bottom: 0.45em; }
.rs-scope :where(p) { margin: 0 0 1.05em; max-width: var(--r-measure); text-wrap: pretty; }
.rs-scope :where(ul, ol) { max-width: var(--r-measure); padding-left: 1.2em; margin: 0 0 1.05em; }
.rs-scope :where(li) { margin: 0 0 0.4em; }
.rs-scope :where(a) { color: var(--r-accent); text-decoration-thickness: 1px; text-underline-offset: 0.18em; }
.rs-scope :where(a:hover) { color: var(--r-accent-ink); }

/* Figures everywhere line up in columns. */
.rs-scope .rs-num,
.rs-scope :where(td, th) { font-variant-numeric: tabular-nums lining-nums; }

.rs-scope .rs-eyebrow {
  font-size: var(--r-size-micro);
  font-weight: 700;
  letter-spacing: var(--r-eyebrow-tracking);
  text-transform: var(--r-eyebrow-transform);
  color: var(--r-accent);
}
.rs-scope .rs-small { font-size: var(--r-size-small); color: var(--r-ink-soft); }

/* Footnote markers: library/blocks/footnote-ref/footnote.css (F3). */

/* Shared panel surface: every boxed block (findings, chart, table) reads this. */
.rs-scope .rs-panel {
  background: var(--r-panel-bg);
  border: var(--r-panel-border-w) solid var(--r-panel-border-c);
  border-radius: var(--r-panel-radius);
  box-shadow: var(--r-panel-shadow);
  padding: var(--r-panel-pad);
}

/* Buttons. F1 locked btn=solid; owner note: Cite on key findings and Embed use the same
   solid style as Cite this page. Download PNG is the secondary (ghost) action.
     .rs-btn            solid, ink ground
     .rs-btn--sm        compact size for in-block actions (Cite stat, Embed, Download)
     .rs-btn--ghost     secondary: no fill                                                */
.rs-scope .rs-btn {
  --_bg: var(--r-ink); --_ink: var(--r-paper); --_bd: var(--r-ink);
  font: 600 var(--r-size-small)/1 var(--r-font-body);
  display: inline-flex; align-items: center; justify-content: center; gap: 0.45em;
  padding: 0.62em 1em; cursor: pointer; white-space: nowrap; text-decoration: none;
  border-radius: var(--r-btn-radius);
  border: 1px solid var(--_bd); background: var(--_bg); color: var(--_ink);
  transition: background-color .15s, border-color .15s, color .15s;
}
.rs-scope .rs-btn:hover { --_bg: color-mix(in srgb, var(--r-ink) 84%, var(--r-paper)); --_bd: var(--_bg); color: var(--_ink); }
.rs-scope .rs-btn:focus-visible { outline: 2px solid var(--r-accent); outline-offset: 2px; }
.rs-scope .rs-btn--sm { font-size: var(--r-size-micro); padding: 0.55em 0.8em; }
.rs-scope .rs-btn--ghost { --_bg: transparent; --_ink: var(--r-ink); --_bd: color-mix(in srgb, var(--r-ink) 28%, var(--r-paper)); }
.rs-scope .rs-btn--ghost:hover { --_bg: color-mix(in srgb, var(--r-ink) 6%, var(--r-paper)); --_bd: var(--r-ink); --_ink: var(--r-ink); }
.rs-scope .rs-ico { width: 1.05em; height: 1.05em; flex: none; }
.rs-scope .rs-link-btn {
  font: 600 var(--r-size-micro)/1 var(--r-font-body);
  background: none; border: 0; padding: 0.3em 0; cursor: pointer;
  color: var(--r-ink-faint); letter-spacing: 0.02em; white-space: nowrap;
}
.rs-scope .rs-link-btn:hover { color: var(--r-accent); }


/* ===== library/blocks/cite-embed-kit/kit.css ===== */
/* Cite & embed kit (F2): the tiny "COPIED" tag. Reads --r-* tokens only.
   LOCKED 2026-09-15: F2 variant=A (Above the button) tuned=[color] | place=above color=soft
   findCite=right takeCite=text icons=on btnK=0.6 */
.rs-scope [data-rs-cite], .rs-scope [data-rs-embed], .rs-scope [data-rs-download]{position:relative}

.rs-scope .rs-copied{
  position:absolute; z-index:5; pointer-events:none; white-space:nowrap;
  font:700 var(--r-size-micro)/1 var(--r-font-body);
  letter-spacing:.08em; text-transform:uppercase;
  color:var(--r-ink-soft);
  animation:rs-copied var(--rs-copied-ms, 1000ms) ease-out forwards;
}
/* above the button, centred */
.rs-scope .rs-copied{bottom:calc(100% + 6px); left:50%; translate:-50% 0}

@keyframes rs-copied{
  0%{opacity:0; transform:translateY(3px)}
  12%{opacity:1; transform:none}
  65%{opacity:1}
  100%{opacity:0; transform:translateY(-3px)}
}
@media (prefers-reduced-motion:reduce){ .rs-scope .rs-copied{animation-name:rs-copied-still} }
@keyframes rs-copied-still{0%,70%{opacity:1}100%{opacity:0}}


/* ===== library/blocks/footnote-ref/footnote.css ===== */
/* Footnote marker (F3). Reads --r-* tokens only.
   Owner rules: a footnote is just a small number pointing to the reference list at the bottom;
   one number per source; key findings NEVER carry footnotes.
   LOCKED 2026-09-15: F3 variant=A (Plain superscript) tuned=[style,size,back] | style=badge
   color=soft size=0.6 pos=fig hit=flash back=text
   -> grey round badge, placed right after the figure, source flashes on jump, "Back to text" link. */

.rs-scope sup.rs-fn{
  font-size:.6em; line-height:0; vertical-align:.35em; margin-left:.18em;
  white-space:nowrap; font-variant-numeric:lining-nums tabular-nums; color:var(--r-ink-soft);
}
.rs-scope sup.rs-fn a{
  position:relative; display:inline-grid; place-items:center; min-width:1.55em; height:1.55em; padding:0 .3em;
  border-radius:999px; line-height:1; font-size:1.12em; font-weight:600; color:inherit; text-decoration:none;
  background:color-mix(in srgb, var(--r-ink-soft) 13%, var(--r-paper));
}
.rs-scope sup.rs-fn a + a{margin-left:.15em}
.rs-scope sup.rs-fn a::after{content:""; position:absolute; inset:-.6em -.3em}   /* finger-sized hit area */
.rs-scope sup.rs-fn a:hover{background:color-mix(in srgb, var(--r-accent) 20%, var(--r-paper)); color:var(--r-accent-ink)}
.rs-scope sup.rs-fn a:focus-visible{outline:2px solid var(--r-accent); outline-offset:2px}

/* A marker never wraps away from its figure: the renderer wraps figure + marker in .rs-nb. */
.rs-scope .rs-nb{white-space:nowrap}

/* Reference target + back link */
.rs-scope [id^="rs-ref-"]{scroll-margin-top:var(--r-scroll-offset, 96px)}
.rs-scope .rs-ref--hit{animation:rs-ref-hit 1.8s ease-out}
.rs-scope .rs-fn--hit{animation:rs-ref-hit 1.4s ease-out; border-radius:999px}
@keyframes rs-ref-hit{
  0%,35%{background:color-mix(in srgb, var(--r-accent) 16%, transparent); box-shadow:0 0 0 .35em color-mix(in srgb, var(--r-accent) 16%, transparent)}
  100%{background:transparent; box-shadow:0 0 0 .35em transparent}
}
.rs-scope .rs-fn-back{
  margin-left:.4em; font-size:var(--r-size-micro); font-weight:700; text-decoration:none;
  color:var(--r-ink-faint); white-space:nowrap;
}
.rs-scope .rs-fn-back:hover{color:var(--r-accent)}

@media (prefers-reduced-motion:reduce){ .rs-scope .rs-ref--hit, .rs-scope .rs-fn--hit{animation-duration:.01ms} }


/* ===== library/blocks/research-hero/hero.css ===== */
/* research-hero (core block 1). Reads --r-* tokens only.
   LOCKED 2026-09-15: B1 variant=A (Editorial stack) tuned=[facts,dates] | label=label h1k=1 lead=off
   facts=on avatar=initials rev=on dates=both cite=by rule=line align=left
   + owner note: a real author photo instead of the initials circle.
   + owner note: on mobile the facts strip is 2 clean lines: dates, then counts.
   + owner note 2026-09-16: reviewer shown on top too, with photo, in the author-box form
     (kicker "Written by" / "Reviewed by" · name · role), two people side by side; stacked on narrow.
   + owner note 2026-09-16: tiny inline stroke icon before each facts item; the strip stays ONE line on desktop.
     The icons now separate the items (the thin divider lines were dropped to make room).
   + owner 2026-09-16, B1b: decorative strip on top of the hero (strip.js draws it):
     B1b variant=A (Like the reference) tuned=[stripes,color,w] | side=left wedge=cut stripes=3 color=blue band=on rose=off h=72 ww=26 w=column
   + owner rule: this hero REPLACES the host site's hero on research pages (one H1).
   Resulting layout:
     category label · H1 · dek
     facts strip: Published · Updated · N sources · N statistics · N min read
     ruled byline row: [photo · WRITTEN BY / Author / role] [photo · REVIEWED BY / Reviewer / role] · Cite this page (right)

   Markup contract (renderer):
   <header class="rs-hero" data-rs-block>
     <div class="rs-strip" aria-hidden="true"></div>   (drawn by strip.js; hidden without JS)
     <div class="rs-eyebrow rs-hero-label">Research · {category}</div>
     <h1 class="rs-hero-h1">{H1 with main keyword}</h1>
     <p class="rs-hero-dek">{one sentence}</p>
     <div class="rs-hero-facts">          (owner: mobile = dates on line 1, counts on line 2)
       <ul class="g-dates"><li>Published <b><time datetime="2025-11-03">Nov 3, 2025</time></b></li>
         <li>Updated <b><time datetime="2025-12-11">Dec 11, 2025</time></b></li></ul>
       <ul class="g-counts"><li><b>4</b> sources</li><li><b>18</b> statistics</li><li><b>8</b> min read</li></ul>
     </div>
     <div class="rs-hero-by">
       <div class="rs-hero-person">            (twice: author "Written by", reviewer "Reviewed by")
         <img class="rs-hero-photo" src="people/{stem}-96.webp" srcset="… 2x, … 3x" alt="{name}" width="48" height="48">
           (no photo in site config → <span class="rs-hero-photo rs-hero-photo--initials" aria-hidden="true">LM</span>)
         <div class="rs-hero-pt"><div class="rs-hero-kicker">Written by</div>
           <div class="rs-hero-name"><a href="{url}">{name}</a></div><div class="rs-hero-role">{role}</div></div>
       </div>
       <div class="rs-hero-cite">{Cite this page button}</div>
     </div>
   </header> */

.rs-scope .rs-hero-label{margin-bottom:.85em}
.rs-scope .rs-hero-h1{font-size:var(--r-h1);line-height:1.12}
.rs-scope .rs-hero-dek{font-size:var(--r-lede);line-height:1.45;color:var(--r-ink-soft);margin:.55em 0 0;max-width:40em}

.rs-scope .rs-hero-facts{display:flex;flex-wrap:wrap;gap:.4em .85em;margin:1.2em 0 0;font-size:calc(var(--r-size-small) * .94);color:var(--r-ink-soft)}
.rs-scope .rs-hero-facts ul{display:flex;gap:0 .85em;list-style:none;padding:0;margin:0;max-width:none;white-space:nowrap}
.rs-scope .rs-hero-facts li{margin:0;padding:0}
.rs-scope .rs-hero-fi{width:1em;height:1em;margin-right:.3em;vertical-align:-.14em;color:var(--r-accent-ink)}
.rs-scope .rs-hero-facts b{color:var(--r-ink);font-weight:700;font-variant-numeric:tabular-nums}
@container rs (max-width:400px){ .rs-scope .rs-hero-facts{font-size:var(--r-size-micro)} }

.rs-scope .rs-hero-by{display:flex;flex-wrap:wrap;align-items:center;gap:14px 28px;margin-top:1.25em;padding-top:1.1em;border-top:1px solid var(--r-rule)}
.rs-scope .rs-hero-person{display:flex;align-items:center;gap:12px;flex:1 1 200px;min-width:0}
.rs-scope .rs-hero-photo{width:48px;height:48px;border-radius:50%;flex:none;object-fit:cover;
  background:color-mix(in srgb,var(--r-ink) 8%,var(--r-paper))}
.rs-scope .rs-hero-photo--initials{display:grid;place-items:center;
  background:color-mix(in srgb,var(--r-accent) 14%,var(--r-paper));color:var(--r-accent-ink);font:700 14px/1 var(--r-font-body)}
.rs-scope .rs-hero-pt{min-width:0;line-height:1.3}
.rs-scope .rs-hero-kicker{font-size:var(--r-size-micro);font-weight:700;letter-spacing:var(--r-eyebrow-tracking);text-transform:uppercase;color:var(--r-ink-soft)}
.rs-scope .rs-hero-name{font:var(--r-weight-head) var(--r-size-small)/1.3 var(--r-font-head);color:var(--r-ink)}
.rs-scope .rs-hero-name a{color:inherit;text-decoration:none}
.rs-scope .rs-hero-name a:hover{text-decoration:underline;text-decoration-color:var(--r-accent)}
.rs-scope .rs-hero-role{font-size:var(--r-size-micro);color:var(--r-ink-soft)}
.rs-scope .rs-hero-cite{flex:none}

/* hero strip (B1b): 72px band in the text column; 80% height on narrow containers; shown only once strip.js runs (.is-on) */
.rs-scope .rs-strip{display:none;height:72px;margin:0 0 1.4em;overflow:hidden}
.rs-scope .rs-strip.is-on{display:block}
.rs-scope .rs-strip svg{display:block;width:100%;height:100%}
@container rs (max-width:560px){ .rs-scope .rs-strip{height:58px} }

/* person hover card (B1c) on the byline: photo or name hover / focus / tap opens it (people.js).
   LOCKED 2026-09-16: B1c variant=B (Dark card) | theme=dark head=photo bullet=square rules=off edge=off w=400
   fs=micro trigger=hot delay=instant | owner: "B it is. love it."
   Same dark look as the chart hover card. Content = site config name, role, credentials. Kept inside the column by JS. */
.rs-scope .rs-hero-person[data-pc]{position:relative;border-radius:10px;outline-offset:4px}
.rs-scope .rs-hero-person[data-pc]:focus-visible{outline:2px solid var(--r-accent)}
.rs-scope .rs-hero-person[data-pc] .rs-hero-photo,.rs-scope .rs-hero-person[data-pc] .rs-hero-name{cursor:pointer}
.rs-scope .rs-pc{position:absolute;z-index:40;top:calc(100% + 10px);left:0;width:400px;max-width:var(--rs-pc-max,100%);
  box-sizing:border-box;padding:14px 16px 12px;border-radius:12px;font:400 var(--r-size-micro)/1.45 var(--r-font-body);
  background:var(--r-ink);color:var(--r-paper);box-shadow:0 18px 40px -16px rgba(0,0,0,.45);text-align:left;animation:rs-pc-in .12s ease-out}
.rs-scope .rs-pc[hidden]{display:none}
.rs-scope .rs-pc::before{content:"";position:absolute;top:-5px;left:var(--rs-pc-arrow,19px);width:10px;height:10px;background:inherit;transform:rotate(45deg)}
.rs-scope .rs-pc-head{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.rs-scope .rs-pc-photo{width:40px;height:40px;border-radius:50%;object-fit:cover;flex:none}
.rs-scope .rs-pc-kick{font-size:.85em;font-weight:700;letter-spacing:var(--r-eyebrow-tracking);text-transform:uppercase;color:color-mix(in srgb,var(--r-paper) 70%,var(--r-ink))}
.rs-scope .rs-pc-name{font:var(--r-weight-head) var(--r-size-small)/1.25 var(--r-font-head);color:var(--r-paper)}
.rs-scope .rs-pc-role{color:color-mix(in srgb,var(--r-paper) 70%,var(--r-ink))}
.rs-scope .rs-pc ul{list-style:none;margin:0;padding:0;display:grid;gap:6px;max-width:none}
.rs-scope .rs-pc li{position:relative;margin:0;padding-left:1.25em;font-size:inherit;line-height:inherit}
.rs-scope .rs-pc li::before{content:"";position:absolute;left:.15em;top:.55em;width:.42em;height:.42em;background:color-mix(in srgb,var(--r-accent) 60%,var(--r-paper))}
@keyframes rs-pc-in{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){ .rs-scope .rs-pc{animation:none} }


/* ===== library/blocks/key-findings/findings.css ===== */
/* key-findings (core block 2). Reads --r-* tokens only.
   LOCKED 2026-09-15: B2 variant=A (Number column) untuned | layout=column title=findings index=off
   rules=on numw=5 cite=right count=6
   Inherited: F1 white card + accent numbers 1.6x/700; F2 Cite button; owner rule NEVER footnotes.

   Markup contract (renderer):
   <section class="rs-kf" aria-labelledby="kf-h">
     <h2 class="rs-kf-title" id="kf-h">Key findings</h2>
     <ol class="rs-kf-list">
       <li class="rs-kf-item"><span class="rs-kf-num">83%</span><span class="rs-kf-text">of K-12 teachers …</span>
         <span class="rs-kf-act">{Cite button}</span></li>
     </ol>
   </section> */

.rs-scope .rs-kf{background:var(--r-panel-bg);box-shadow:var(--r-panel-shadow);border-radius:var(--r-panel-radius);padding:var(--r-panel-pad);margin-top:var(--r-space)}
.rs-scope .rs-kf-title{font-size:var(--r-h3);margin:0;border:0;padding:0}
.rs-scope .rs-kf-list{list-style:none;margin:.7em 0 0;padding:0;max-width:none}
.rs-scope .rs-kf-item{margin:0;padding:.8em 0;display:grid;gap:.25em 1em;align-items:baseline;
  grid-template-columns:max(5em, var(--rs-kf-numw, 5em)) 1fr auto;grid-template-areas:"num text act"}   /* renderer sets --rs-kf-numw from the widest number */
.rs-scope .rs-kf-item + .rs-kf-item{border-top:1px solid var(--r-rule)}
.rs-scope .rs-kf-item:first-child{padding-top:.3em}
.rs-scope .rs-kf-item:last-child{padding-bottom:0}
.rs-scope .rs-kf-num{grid-area:num;font-family:var(--r-font-num);font-weight:var(--r-num-weight);color:var(--r-num-color);
  font-size:calc(var(--r-body) * var(--r-num-scale));line-height:1.05;letter-spacing:-.02em;
  font-variant-numeric:tabular-nums lining-nums;white-space:nowrap}
.rs-scope .rs-kf-text{grid-area:text;font-size:var(--r-size-small);line-height:1.45;color:var(--r-ink)}
.rs-scope .rs-kf-act{grid-area:act;align-self:center}

@container rs (max-width:560px){
  .rs-scope .rs-kf-item{grid-template-columns:1fr auto;grid-template-areas:"num act" "text act";row-gap:.2em}
}


/* ===== library/blocks/prose/prose.css ===== */
/* prose (core block 3). Body text of a research page. Reads --r-* tokens only.
   LOCKED 2026-09-15: B3 variant=C (Accent figures) tuned=[h3,ul,ol] | fig=accent lead=normal h3=plain
   ul=square ol=plain link=ink gap=1.05 measure=660
   Upstream: F1 H2 rule above (base.css), F3 footnote badges.

   Markup contract (renderer):
   <div class="rs-prose"> p / h2 / h3 / ul / ol </div>
   figure in text: <span class="rs-nb"><span class="rs-fig">69%</span><sup class="rs-fn">…</sup></span> */

/* spacing between blocks: a prose block always starts one block-space below what came before */
.rs-scope .rs-prose{margin-top:var(--r-space)}
.rs-scope .rs-prose > h2:first-child{margin-top:0}
.rs-scope .rs-prose p,
.rs-scope .rs-prose ul,
.rs-scope .rs-prose ol{max-width:660px;margin:0 0 1.05em}
.rs-scope .rs-prose h3{margin-top:calc(var(--r-space) * .7)}

/* figures in running text: bold, accent colour (same colour as key-finding numbers) */
.rs-scope .rs-fig{font-weight:700;color:var(--r-num-color)}

/* bullets: small ink square */
.rs-scope .rs-prose ul{list-style:none;padding-left:1.25em}
.rs-scope .rs-prose ul li{position:relative}
.rs-scope .rs-prose ul li::before{content:"";position:absolute;left:-1.1em;top:.66em;width:.36em;height:.36em;background:var(--r-ink)}

/* numbered lists: plain markers */
.rs-scope .rs-prose ol{padding-left:1.6em}
.rs-scope .rs-prose ol li::marker{font-variant-numeric:tabular-nums}

/* links: ink text with accent underline */
.rs-scope .rs-prose a:not(.rs-fn a){color:var(--r-ink);text-decoration-color:var(--r-accent);text-decoration-thickness:1.5px}
.rs-scope .rs-prose a:not(.rs-fn a):hover{color:var(--r-accent-ink)}


/* ===== library/blocks/figure-shell/figure.css ===== */
/* figure-shell: the frame every chart and table shares. Reads --r-* tokens only.
   Locked upstream: F1 white card + soft shadow; owner F1 note: source line in smaller text,
   Embed solid + Download PNG ghost (charts), Embed only (tables); F2 one-click copy.

   <figure class="rs-figure rs-panel" data-rs-block data-rs-png="charts/{id}.png" data-rs-alt="…" data-rs-w="1200" data-rs-h="…">
     <figcaption class="rs-fig-head"><div class="rs-fig-title">…</div><div class="rs-fig-sub">…</div></figcaption>
     … plot or table …
     <div class="rs-fig-foot"><span class="rs-fig-src">Source: … {footnote}</span><span class="rs-fig-acts">…</span></div>
   </figure> */

.rs-scope .rs-figure{margin:1.4em 0 0;max-width:none}
.rs-scope .rs-fig-head{margin-bottom:1.1em}
.rs-scope .rs-fig-title{font-family:var(--r-font-head);font-weight:var(--r-weight-head);font-size:calc(var(--r-body) * 1.02);line-height:1.3;letter-spacing:var(--r-tracking-head);color:var(--r-ink)}
.rs-scope .rs-fig-sub{font-size:var(--r-size-small);color:var(--r-ink-soft);margin-top:.15em}
/* unit line: every chart and table states its unit (owner 2026-09-16) */
.rs-scope .rs-fig-unit{font-size:var(--r-size-micro);font-weight:700;letter-spacing:.02em;color:var(--r-ink-soft);margin-top:.35em}
.rs-scope .rs-fig-foot{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.7em 1em;margin-top:1.1em;padding-top:.8em;border-top:1px solid var(--r-rule)}
.rs-scope .rs-fig-src{font-size:var(--r-size-micro);color:var(--r-ink-soft);line-height:1.4}
.rs-scope .rs-fig-acts{display:flex;flex-wrap:wrap;gap:.5em}

/* PNG export (renderer adds data-rs-static): no buttons, a small site credit instead. */
.rs-scope .rs-fig-brand{display:none}
.rs-scope .rs-figure[data-rs-static] .rs-fig-acts,
.rs-scope .rs-figure[data-rs-static] .rs-table-more{display:none}
.rs-scope .rs-figure[data-rs-static] .rs-fig-brand{display:block;font:700 var(--r-size-micro)/1 var(--r-font-body);color:var(--r-ink-soft);letter-spacing:.02em}
.rs-scope .rs-figure[data-rs-static]{margin:0;box-shadow:none}
.rs-scope .rs-figure[data-rs-static] sup.rs-fn{display:none}


/* ===== library/blocks/chart-bar/bar.css ===== */
/* chart-bar (core block 4). HTML/CSS bars: labels stay real text at every width; PNG = screenshot.
   LOCKED 2026-09-15: B4 variant=A (Label left) tuned=[track,radius] | dir=row label=left val=right
   color=lead grid=on track=on axis=on barh=16 radius=8
   Behaviour LOCKED in B4b: grow together on scroll (550 ms) with count-up; hover/tap card = label + value.

   Markup contract (renderer):
   <figure class="rs-figure rs-panel rs-barchart" data-rs-block data-unit="%" data-gap-unit="pts" …>
     <figcaption class="rs-fig-head">…</figcaption>
     <ol class="rs-bars">
       <li class="rs-bar is-lead" style="--v:69" data-v="69" data-label="Search for information">
         <span class="rs-bar-lab">Search for information</span>
         <span class="rs-bar-track"><span class="rs-bar-fill"></span></span>
         <span class="rs-bar-val">69%</span></li>
     </ol>
     <div class="rs-bar-axis" aria-hidden="true"><span style="--t:0">0%</span>…<span style="--t:100">100%</span></div>
     <div class="rs-fig-foot">…</div>
   </figure>
   --v = value as % of the axis maximum. Largest value gets .is-lead. */

.rs-scope .rs-barchart{--rs-lab-w:11em;--rs-val-w:3.4em;--rs-bar-r:8px}
.rs-scope .rs-bars{list-style:none;margin:0;padding:0;max-width:none;display:grid;gap:calc(10px * var(--r-density))}
.rs-scope .rs-bar{position:relative;margin:0;display:grid;grid-template-columns:var(--rs-lab-w) 1fr var(--rs-val-w);align-items:center;gap:.35em .8em;font-size:var(--r-size-small)}
.rs-scope .rs-bar-lab{color:var(--r-ink);line-height:1.3;min-width:0}
.rs-scope .rs-bar-track{position:relative;display:block;height:var(--r-bar-h);border-radius:var(--rs-bar-r);overflow:hidden;
  background:
    linear-gradient(90deg,transparent calc(25% - .5px),var(--r-grid) calc(25% - .5px) calc(25% + .5px),transparent calc(25% + .5px) calc(50% - .5px),
      var(--r-grid) calc(50% - .5px) calc(50% + .5px),transparent calc(50% + .5px) calc(75% - .5px),
      var(--r-grid) calc(75% - .5px) calc(75% + .5px),transparent calc(75% + .5px)),
    var(--r-data-track)}
.rs-scope .rs-bar-fill{display:block;height:100%;width:calc(var(--v) * 1%);min-width:2px;background:var(--r-data-mute);border-radius:0 var(--rs-bar-r) var(--rs-bar-r) 0}
.rs-scope .rs-bar.is-lead .rs-bar-fill{background:var(--r-series-1)}
.rs-scope .rs-bar-val{font-family:var(--r-font-num);font-weight:700;color:var(--r-ink);text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}

.rs-scope .rs-bar-axis{position:relative;height:1.4em;margin:.45em var(--rs-val-w) 0 var(--rs-lab-w);padding:0 .8em;box-sizing:content-box;font-size:var(--r-size-small);color:var(--r-ink-faint)}
.rs-scope .rs-bar-axis::before{content:"";position:absolute;inset:0 .8em}
.rs-scope .rs-bar-axis span{position:absolute;top:0;left:calc(.8em + (100% - 0em) * var(--t) / 100);font-size:var(--r-size-micro);transform:translateX(-50%);white-space:nowrap}
.rs-scope .rs-bar-axis span:first-child{transform:none}
.rs-scope .rs-bar-axis span:last-child{transform:translateX(-100%)}

@container rs (max-width:560px){
  .rs-scope .rs-bar{grid-template-columns:1fr var(--rs-val-w);row-gap:.3em}
  .rs-scope .rs-bar-lab{grid-column:1 / -1}
  .rs-scope .rs-bar-axis{margin-left:0;padding-left:0}
  .rs-scope .rs-bar-axis span{left:calc(100% * var(--t) / 100)}
}

/* ---- scroll-in animation (JS arms it; without JS or with reduced motion bars are static) ---- */
/* armed: snap to 0 with no transition; in: grow with the transition (easeOutCubic = count-up curve) */
.rs-scope .rs-barchart.rs-anim-armed .rs-bar-fill{width:0;transition:none}
.rs-scope .rs-barchart.rs-anim-armed.rs-anim-in .rs-bar-fill{width:calc(var(--v) * 1%);
  transition:width 550ms cubic-bezier(.33,1,.68,1)}

/* ---- hover / tap data card ---- */
.rs-scope .rs-bar{cursor:default}
.rs-scope .rs-bar:hover .rs-bar-track,
.rs-scope .rs-bar.is-tip .rs-bar-track{box-shadow:0 0 0 2px color-mix(in srgb,var(--r-ink) 18%,transparent)}
.rs-scope .rs-bar-tip{position:absolute;z-index:20;bottom:calc(100% + 6px);transform:translateX(-50%);pointer-events:none;
  min-width:8em;max-width:16em;padding:.55em .75em;border-radius:8px;background:var(--r-ink);color:var(--r-paper);
  font:500 var(--r-size-micro)/1.4 var(--r-font-body);box-shadow:0 8px 24px -10px rgba(0,0,0,.45);animation:rs-tip-in .12s ease-out}
.rs-scope .rs-bar-tip::after{content:"";position:absolute;top:100%;left:50%;margin-left:-5px;border:5px solid transparent;border-top-color:var(--r-ink)}
.rs-scope .rs-bar-tip b{display:block;font-size:1.35em;font-family:var(--r-font-num);font-variant-numeric:tabular-nums;margin:.1em 0}
.rs-scope .rs-bar-tip .k{color:color-mix(in srgb,var(--r-paper) 72%,var(--r-ink))}
@keyframes rs-tip-in{from{opacity:0}to{opacity:1}}
@media (prefers-reduced-motion:reduce){ .rs-scope .rs-bar-tip{animation:none} }


/* ===== library/blocks/chart-column/column.css ===== */
/* chart-column (vertical columns; the dir=col member of the bar family). Reads --r-* tokens only.
   LOCKED 2026-09-16: B4c variant=A (Values on top) untuned | vals=all grid=on ylab=on w=62 radius=6 mlab=auto
   color=lead div=two   (owner reply: "...B4c-chart-column.html A")
   Behaviour as B4b: columns grow on scroll-in (550 ms easeOutCubic), values count up and ride the column tops;
   hover/tap card = the bar chart's .rs-bar-tip (bar.css). HTML/CSS columns so labels stay real text; PNG = screenshot.

   Use for: a cycle inside a year (months, seasons, hours) or short ordered labels; the diverging (+/−) form for
   deviations. Values carry no unit (the subtitle names it); the hover card shows value + unit.

   Markup contract (renderer):
   <figure class="rs-figure rs-panel rs-colchart [rs-colchart--div]" data-rs-block data-fmt="{v} m/s" data-signed="false" …>
     <figcaption class="rs-fig-head">title · sub · [<div class="rs-col-legend"> only when --div]</figcaption>
     <div class="rs-colplot" style="--_yw:calc(4ch + .6em)">
       <div class="rs-col-ticks" aria-hidden="true"><span class="rs-col-tick [is-zero]" style="--t:0"><span>0</span></span>…</div>
       <ol class="rs-cols" style="--n:12">
         <li class="rs-col is-lead [is-neg] [is-zero]" style="--b:0;--h:76.25" data-v="6.1" data-dec="1" data-label="January">
           <span class="rs-col-area"><span class="rs-col-fill"></span><span class="rs-col-val">6.1</span></span>
           <span class="rs-col-lab"><span class="l3">Jan</span><span class="l1">J</span></span></li>
       </ol>
     </div>
     <div class="rs-fig-foot">…</div>
   </figure>
   --b = column bottom, --h = column height, both % of the value axis (min…max). Largest |value| gets .is-lead.
   Not diverging: lead column --r-series-1, the rest --r-data-mute. Diverging (any value < 0): above zero
   --r-series-1, below --r-series-2 (pair validated PASS on #FFFFFF) + legend, so colour is never the only cue. */

.rs-scope .rs-colchart{--rs-col-w:62;--rs-col-r:6px}
.rs-scope .rs-colplot{position:relative;padding-left:var(--_yw);--_ch:220px}
@container rs (max-width:560px){ .rs-scope .rs-colplot{--_ch:180px} }

.rs-scope .rs-col-ticks{position:absolute;left:0;right:0;top:0;height:var(--_ch);pointer-events:none}
.rs-scope .rs-col-tick{position:absolute;left:0;right:0;bottom:calc(var(--t) * 1%);height:0}
.rs-scope .rs-col-tick::after{content:"";position:absolute;left:var(--_yw);right:0;top:0;border-top:1px solid var(--r-grid)}
.rs-scope .rs-col-tick.is-zero::after{border-top-color:color-mix(in srgb,var(--r-ink) 38%,var(--r-card))}
.rs-scope .rs-col-tick > span{position:absolute;left:0;top:0;width:var(--_yw);padding-right:.55em;box-sizing:border-box;text-align:right;
  transform:translateY(-50%);font-size:var(--r-size-micro);line-height:1;color:var(--r-ink-faint);font-variant-numeric:tabular-nums;white-space:nowrap}

.rs-scope .rs-cols{list-style:none;margin:0;padding:0;max-width:none;display:grid;grid-template-columns:repeat(var(--n),minmax(0,1fr))}
.rs-scope .rs-col{position:relative;margin:0;display:grid;grid-template-rows:var(--_ch) auto;justify-items:center;cursor:default;font-size:var(--r-size-small)}
.rs-scope .rs-col-area{position:relative;display:block;height:100%;width:min(calc(var(--rs-col-w) * 1%), 3.2em)}
.rs-scope .rs-col-fill{position:absolute;left:0;right:0;bottom:calc(var(--b) * 1%);height:max(2px, calc(var(--h) * 1%));
  background:var(--r-data-mute);border-radius:var(--rs-col-r) var(--rs-col-r) 0 0;transform-origin:50% 100%}
.rs-scope .rs-col.is-neg .rs-col-fill{border-radius:0 0 var(--rs-col-r) var(--rs-col-r);transform-origin:50% 0}
.rs-scope .rs-col.is-zero .rs-col-fill{border-radius:0}

.rs-scope .rs-col.is-lead .rs-col-fill,
.rs-scope .rs-colchart--div .rs-col:not(.is-zero) .rs-col-fill{background:var(--r-series-1)}
.rs-scope .rs-colchart--div .rs-col.is-neg .rs-col-fill{background:var(--r-series-2)}

.rs-scope .rs-col-val{position:absolute;left:50%;bottom:calc((var(--b) + var(--h)) * 1% + 5px);transform:translateX(-50%);
  font-family:var(--r-font-num);font-weight:700;font-size:var(--r-size-small);line-height:1;color:var(--r-ink);font-variant-numeric:tabular-nums;white-space:nowrap}
.rs-scope .rs-col.is-neg .rs-col-val{bottom:auto;top:calc((100 - var(--b)) * 1% + 5px)}
@container rs (max-width:560px){ .rs-scope .rs-cols.is-many .rs-col-val{font-size:calc(var(--r-size-micro) * .86)} }

/* category labels: 3 letters, 1 letter on narrow containers (labels that can't shorten keep l1 = full label) */
.rs-scope .rs-col-lab{margin-top:.55em;font-size:var(--r-size-micro);line-height:1.2;color:var(--r-ink-soft);white-space:nowrap}
.rs-scope .rs-col-lab .l1{display:none}
@container rs (max-width:560px){
  .rs-scope .rs-col-lab .l3{display:none}
  .rs-scope .rs-col-lab .l1{display:inline}
}

.rs-scope .rs-col-legend{display:flex;flex-wrap:wrap;gap:.3em 1.2em;margin-top:.55em;font-size:var(--r-size-micro);color:var(--r-ink-soft)}
.rs-scope .rs-col-legend span{display:inline-flex;align-items:center;gap:.45em}
.rs-scope .rs-col-legend i{width:10px;height:10px;border-radius:2px;background:var(--r-series-1)}
.rs-scope .rs-col-legend span + span i{background:var(--r-series-2)}

/* scroll-in growth (JS arms it; without JS, reduced motion or data-rs-static the columns are static) */
.rs-scope .rs-colchart.rs-anim-armed .rs-col-fill{transform:scaleY(0);transition:none}
.rs-scope .rs-colchart.rs-anim-armed.rs-anim-in .rs-col-fill{transform:none;transition:transform 550ms cubic-bezier(.33,1,.68,1)}
.rs-scope .rs-colchart.rs-anim-armed .rs-col:not(.is-neg) .rs-col-val{bottom:calc((var(--b) + var(--h) * var(--_p, 0)) * 1% + 5px)}
.rs-scope .rs-colchart.rs-anim-armed .rs-col.is-neg .rs-col-val{top:calc((100 - var(--b) - var(--h) * (1 - var(--_p, 0))) * 1% + 5px)}
.rs-scope .rs-colchart.rs-anim-armed.rs-anim-in .rs-col-val{--_p:1;transition:bottom 550ms cubic-bezier(.33,1,.68,1),top 550ms cubic-bezier(.33,1,.68,1)}

/* hover / tap: the bar chart's card (.rs-bar-tip, bar.css), placed by column.js */
.rs-scope .rs-col:hover .rs-col-fill,
.rs-scope .rs-col.is-tip .rs-col-fill{box-shadow:0 0 0 2px color-mix(in srgb,var(--r-ink) 18%,transparent)}
.rs-scope .rs-col .rs-bar-tip{bottom:auto;white-space:nowrap;min-width:0}
.rs-scope .rs-col .rs-bar-tip::after{left:var(--ax, 50%)}


/* ===== library/blocks/chart-line/line.css ===== */
/* chart-line (block 12). Reads --r-* tokens only.
   LOCKED 2026-09-16: B12 variant=A (Clean + end labels) untuned | markers=hover area=off ends=name emph=off y=fit
   grid=on lw=2 ms=550   (owner reply: "...B12-chart-line.html A")
   Resulting chart: plain 2px lines in --r-series-1..4 (fixed order), series names at the line ends (single series:
   its latest value), dots only at the hovered point, y axis fitted to the data with 10% headroom (always includes 0
   when any value is negative, zero line emphasised), gridlines on, draw-in 550 ms on scroll-in.
   Hover/tap: crosshair + dark card (.rs-bar-tip look from bar.css); ≥2 series list every series with a swatch.

   Markup contract (renderer):
   <figure class="rs-figure rs-panel rs-linechart" data-rs-block …>
     <figcaption class="rs-fig-head">…</figcaption>
     <ul class="rs-line-legend">(only with ≥2 series)<li style="--c:var(--r-series-1)">Iceland</li>…</ul>
     <div class="rs-line-plot" role="img" aria-label="Line chart: … every value …"></div>
     <script type="application/json" class="rs-line-data">{"x":[…],"xFull":[…],"fmt":"{v} m/s","dec":1,"signed":false,
       "series":[{"name":"…","v":[…]}]}</script>
     <div class="rs-fig-foot">…</div>
   </figure>
   The SVG is drawn by line.js at the container's real width (redrawn on resize and after fonts load), so text never
   scales. data-rs-static (PNG export): drawn at once, no animation, no crosshair. */

.rs-scope .rs-line-legend{display:flex;flex-wrap:wrap;gap:.3em 1.2em;list-style:none;margin:0 0 .7em;padding:0;max-width:none;font-size:var(--r-size-small);color:var(--r-ink-soft)}
.rs-scope .rs-line-legend li{margin:0;display:inline-flex;align-items:center;gap:.45em}
.rs-scope .rs-line-legend li::before{content:"";width:1.1em;height:3px;border-radius:2px;background:var(--c)}
@container rs (max-width:480px){
  .rs-scope .rs-line-legend{font-size:var(--r-size-micro);gap:.25em .9em}
  .rs-scope .rs-line-legend li{gap:.35em}
  .rs-scope .rs-line-legend li::before{width:.9em}
}
.rs-scope .rs-line-plot{position:relative;min-height:200px;touch-action:pan-y}
.rs-scope .rs-line-plot svg{display:block;overflow:visible}
.rs-scope .rs-line-plot text{font-family:var(--r-font-body);font-size:var(--r-size-micro);fill:var(--r-ink-faint)}
.rs-scope .rs-line-plot .ln-grid{stroke:var(--r-grid);stroke-width:1}
.rs-scope .rs-line-plot .ln-zero{stroke:color-mix(in srgb,var(--r-ink) 45%,var(--r-panel-bg));stroke-width:1}
.rs-scope .rs-line-plot .ln-path{fill:none;stroke-width:2px;stroke-linejoin:round;stroke-linecap:round}
.rs-scope .rs-line-plot .ln-dot{stroke:var(--r-panel-bg);stroke-width:2}
.rs-scope .rs-line-plot .ln-end{font-size:var(--r-size-micro);fill:var(--r-ink-soft)}
.rs-scope .rs-line-plot .ln-end tspan.v{font-family:var(--r-font-num);font-weight:700;fill:var(--r-ink);font-variant-numeric:tabular-nums}
.rs-scope .rs-line-plot .ln-cross{stroke:color-mix(in srgb,var(--r-ink) 28%,transparent);stroke-width:1}
.rs-scope .rs-line-plot .ln-hit{fill:transparent;cursor:crosshair}
/* draw-in: paths animate their dash offset (line.js); end labels fade in over the same 550 ms */
.rs-scope .rs-line-plot .ln-fade{transition:opacity 550ms cubic-bezier(.33,1,.68,1)}
.rs-scope .rs-line-plot.is-armed .ln-fade{opacity:0}

/* hover card: .rs-bar-tip supplies the look; the line chart places it beside the crosshair (no arrow) */
.rs-scope .rs-line-plot .rs-bar-tip{top:0;bottom:auto;transform:none}
.rs-scope .rs-line-plot .rs-bar-tip::after{display:none}
.rs-scope .rs-line-plot .rs-bar-tip ul{list-style:none;margin:.25em 0 0;padding:0;max-width:none;display:grid;gap:.15em}
.rs-scope .rs-line-plot .rs-bar-tip li{margin:0;display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:.5em}
.rs-scope .rs-line-plot .rs-bar-tip li i{width:.7em;height:.7em;border-radius:50%;background:var(--c);box-shadow:0 0 0 1.5px var(--r-paper)}
.rs-scope .rs-line-plot .rs-bar-tip li span.v{font-family:var(--r-font-num);font-weight:700;font-variant-numeric:tabular-nums;padding-left:.6em}

/* ---- trend projection (B12b) ----
   LOCKED 2026-09-16: B12b variant=A (Dashed + band) tuned=[style,endlab] | band=on style=fan fit=on div=on endlab=value
   end=2050 dash=dashed op=16 | note: end label value must start with ~
   Figure gets .rs-projchart; data JSON "proj" {from,last,to,fitYears,fit,pts:[{y,v,lo,hi}]}; caption <p class="rs-proj-note">.
   Measured solid series-1 · thin fitted trend · dashed projection · fan band (3 shades) · divider "Measured | Projected". */
.rs-scope .rs-projchart{--rs-band-op:.16}
.rs-scope .rs-line-plot .pj-fit{fill:none;stroke:color-mix(in srgb,var(--r-series-1) 55%,var(--r-panel-bg));stroke-width:1.25px}
.rs-scope .rs-line-plot .pj-proj{fill:none;stroke:var(--r-series-1);stroke-width:2px;stroke-linecap:round;stroke-dasharray:6 5}
.rs-scope .rs-line-plot .pj-band{fill:var(--r-series-1);stroke:none}
.rs-scope .rs-line-plot .pj-divider{stroke:color-mix(in srgb,var(--r-ink) 30%,var(--r-panel-bg));stroke-width:1;stroke-dasharray:2 3}
.rs-scope .rs-line-plot text.pj-zone{font-size:calc(var(--r-size-micro) * .85);letter-spacing:.06em;text-transform:uppercase;fill:var(--r-ink-faint)}
.rs-scope .rs-line-plot text.pj-end{fill:var(--r-ink-soft)}
.rs-scope .rs-line-plot text.pj-end tspan.v{font-family:var(--r-font-num);font-weight:700;fill:var(--r-ink)}
.rs-scope .rs-line-plot .pj-mark{fill:var(--r-panel-bg);stroke:var(--r-series-1);stroke-width:2}
.rs-scope .rs-line-plot text.pj-mlab{font-family:var(--r-font-num);font-weight:700;fill:var(--r-ink)}
/* projection layers appear after the measured line has drawn in */
.rs-scope .rs-line-plot .pj-late{transition:opacity 400ms ease-out 550ms}
.rs-scope .rs-line-plot.is-armed .pj-late{opacity:0;transition:none}
.rs-scope .rs-proj-note{font-size:var(--r-size-micro);color:var(--r-ink-soft);margin:.6em 0 0;max-width:none}
.rs-scope .rs-line-plot .rs-bar-tip .s{display:block;color:color-mix(in srgb,var(--r-paper) 72%,var(--r-ink));margin-top:.1em}


/* ===== library/blocks/chart-share/share.css ===== */
/* chart-share (block 13, part-to-whole). Reads --r-* tokens only.
   LOCKED 2026-09-16: B13 variant=B (Donut + total) untuned | hole=58 labels=legend show=both total=on gap=2 start=0
   ms=550   (owner reply: "...B13-chart-share.html B")
   Resulting chart: donut (hole 58%) with the total in the centre, legend beside it (below on narrow) showing label,
   value and share; 2px surface gaps; slices start at 12 o'clock and sweep in on scroll-in (550 ms, numbers count up).
   Hover/tap a slice or legend row: slice lifts, others dim, .rs-bar-tip card (label, value + unit, share, contents).

   Colour: slices --r-series-1..4 in fixed order (largest first); "Other" = --r-ink-faint, always last. Validated
   (dataviz validator, light, #FFFFFF): #B25309 #0B7FA6 #6B8E23 #8E4FA8 #8A8F98 pass lightness, CVD (worst ΔE 14.3),
   normal vision (worst 17.8), 3:1 contrast, wrap-around pairs included; chroma FAIL on the grey Other is intended.
   2–5 slices; a 5th slice must be "Other".

   Markup contract (renderer):
   <figure class="rs-figure rs-panel rs-piechart" data-rs-block data-unit-one="station" data-unit-many="stations" data-dec="0" …>
     <figcaption class="rs-fig-head">…</figcaption>
     <div class="rs-pie">
       <div class="rs-pie-plot" role="img" aria-label="Donut chart. South 8 stations (25%), …">
         <svg viewBox="-110 -110 220 220" aria-hidden="true"></svg>
         <div class="rs-pie-total" aria-hidden="true"><b>32</b><span>stations</span></div>
       </div>
       <ol class="rs-pie-legend">
         <li class="rs-pie-item" style="--rs-c:var(--r-series-1)" data-v="8" data-label="South" [data-detail="East 3 · …"]>
           <span class="rs-pie-sw"></span><span class="rs-pie-lab">South</span><span class="rs-pie-val">8</span><span class="rs-pie-pct">25%</span></li>
       </ol>
     </div>
     <div class="rs-fig-foot">…</div>
   </figure>
   Slices are drawn by share.js from the legend rows, so the chart needs JS (PNG export loads it). */

.rs-scope .rs-pie{display:grid;grid-template-columns:minmax(0,15em) minmax(0,1fr);gap:1.4em 2.4em;align-items:center}
.rs-scope .rs-pie-plot{position:relative;width:100%;max-width:15em;aspect-ratio:1;margin-inline:auto}
.rs-scope .rs-pie-plot svg{display:block;width:100%;height:100%;overflow:visible}
.rs-scope .rs-pie-plot path{stroke:var(--r-panel-bg);stroke-linejoin:round;transition:opacity .15s ease,transform .15s ease;cursor:default}
.rs-scope .rs-pie.has-active path:not(.is-on){opacity:.35}

.rs-scope .rs-pie-total{position:absolute;inset:0;display:grid;place-content:center;text-align:center;pointer-events:none;line-height:1.1;
  padding:0 21%;box-sizing:border-box;overflow:hidden}   /* 21% each side = the 58%-hole boundary: text can never touch the ring */
.rs-scope .rs-pie-total b{display:block;font:var(--r-num-weight) calc(var(--r-h3) * 1.35 * var(--rs-fit, 1))/1.05 var(--r-font-num);font-variant-numeric:tabular-nums;color:var(--r-ink);overflow-wrap:break-word}
.rs-scope .rs-pie-total span{font-size:calc(var(--r-size-micro) * max(var(--rs-fit, 1), .78));color:var(--r-ink-soft);margin-top:.3em}

.rs-scope .rs-pie-legend{list-style:none;margin:0;padding:0;max-width:none;font-size:var(--r-size-small)}
.rs-scope .rs-pie-item{display:grid;grid-template-columns:.8em minmax(0,1fr) auto auto;align-items:center;gap:.7em;margin:0;padding:.5em .4em;border-top:1px solid var(--r-rule);cursor:default}
.rs-scope .rs-pie-item:first-child{border-top:0}
.rs-scope .rs-pie-item.is-on{background:var(--r-data-track)}
.rs-scope .rs-pie-sw{width:.8em;height:.8em;border-radius:calc(var(--r-radius) * .2);background:var(--rs-c)}
.rs-scope .rs-pie-lab{color:var(--r-ink);line-height:1.3;min-width:0}
.rs-scope .rs-pie-val,.rs-scope .rs-pie-pct{font-family:var(--r-font-num);font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}
.rs-scope .rs-pie-val{font-weight:700;color:var(--r-ink);min-width:2ch}
.rs-scope .rs-pie-pct{color:var(--r-ink-soft);min-width:5ch}

@container rs (max-width:560px){
  .rs-scope .rs-pie{grid-template-columns:minmax(0,1fr);gap:1.1em}
  .rs-scope .rs-pie-plot{max-width:13em;margin:0 auto}
}

/* hover card: .rs-bar-tip look, anchored inside the hovered slice */
.rs-scope .rs-pie-tip-anchor{position:absolute;width:0;height:0;z-index:20}
.rs-scope .rs-pie-tip-anchor .rs-bar-tip{left:0;width:max-content}
.rs-scope .rs-pie-tip-anchor.is-below .rs-bar-tip{bottom:auto;top:calc(100% + 6px)}
.rs-scope .rs-pie-tip-anchor.is-below .rs-bar-tip::after{top:auto;bottom:100%;border-top-color:transparent;border-bottom-color:var(--r-ink)}
.rs-scope .rs-pie-tip-anchor .rs-bar-tip .d{display:block;margin-top:.35em;color:color-mix(in srgb,var(--r-paper) 72%,var(--r-ink))}


/* ===== library/blocks/chart-takeaways/takeaways.css ===== */
/* chart-takeaways (core block 5): 2–4 stat sentences read off the chart above.
   LOCKED 2026-09-15: B5 variant=A (Under the chart) tuned=[title,fn] | place=out title=shows bullet=square fn=off
   Upstream: B3 accent bold figures, F2 quiet-text Cite. Owner rule: NO footnote badges on takeaways.

   Markup contract (renderer), placed right after the chart figure:
   <div class="rs-tk">
     <div class="rs-tk-title">What the data shows</div>
     <ul class="rs-tk-list"><li><span class="rs-fig">69%</span> of students use AI to search for information. {Cite}</li></ul>
   </div> */

.rs-scope .rs-tk{margin-top:1.2em}
.rs-scope .rs-tk-title{font:700 var(--r-size-micro)/1.2 var(--r-font-body);letter-spacing:var(--r-eyebrow-tracking);text-transform:uppercase;color:var(--r-ink-soft);margin-bottom:.6em}
.rs-scope .rs-tk-list{list-style:none;margin:0;padding:0;max-width:660px}
.rs-scope .rs-tk-list li{position:relative;margin:0 0 .55em;padding-left:1.25em;line-height:1.5}
.rs-scope .rs-tk-list li:last-child{margin-bottom:0}
.rs-scope .rs-tk-list li::before{content:"";position:absolute;left:.1em;top:.66em;width:.36em;height:.36em;background:var(--r-ink)}
.rs-scope .rs-tk .rs-btn{margin-left:.35em;vertical-align:.08em;--_bg:transparent;--_bd:transparent;--_ink:var(--r-ink-faint);padding:.2em .15em}
.rs-scope .rs-tk .rs-btn:hover{--_ink:var(--r-accent)}


/* ===== library/blocks/geo-map/geo-map.css ===== */
/* ============================================================================
   geo-map (on-demand block 19, built 2026-09-17): choropleth over a country map.
   The renderer embeds the country's region outlines as SVG paths (one map file
   per country, chosen by the site config, so other countries = another file).

   Markup contract (renderer):
   <figure class="rs-figure rs-panel rs-geomap" id="{id}" data-rs-block
           data-rs-png="charts/{id}.png" data-rs-alt data-rs-w data-rs-h>
     <figcaption class="rs-fig-head">…title / subtitle / unit…</figcaption>
     <div class="rs-map-wrap">
       <svg class="rs-map" viewBox="0 0 680 H" role="img" aria-label="…">
         <path class="rs-map-region rs-map-s3" data-region="Vesturland" data-v="5.1" d="…">
           <title>Vesturland: 5.1</title></path>…
       </svg>
       <div class="rs-map-tip" hidden></div>
     </div>
     <div class="rs-map-legend" aria-hidden="true">
       <span class="rs-map-sw rs-map-s1"></span><span class="rs-map-lab">0–2</span>…
     </div>
     <div class="rs-fig-foot">…source / brand / Embed / Download PNG…</div>
   </figure>
   + optional takeaways (rs-tk) after the figure.

   Colors: single-hue ramp of --r-series-1 over --r-paper (4 steps + no-data grey),
   so every host skin re-colors the map through its tokens.
   ============================================================================ */

.rs-scope .rs-geomap .rs-map-wrap{position:relative;margin:0 auto;max-width:680px}
.rs-scope .rs-geomap .rs-map{display:block;width:100%;height:auto}

.rs-scope .rs-map-region{
  stroke:var(--r-paper);
  stroke-width:1.1;
  stroke-linejoin:round;
  transition:fill-opacity .15s;
  cursor:default;
}
.rs-scope .rs-map-s1{fill:color-mix(in srgb, var(--r-series-1) 22%, var(--r-paper))}
.rs-scope .rs-map-s2{fill:color-mix(in srgb, var(--r-series-1) 45%, var(--r-paper))}
.rs-scope .rs-map-s3{fill:color-mix(in srgb, var(--r-series-1) 68%, var(--r-paper))}
.rs-scope .rs-map-s4{fill:color-mix(in srgb, var(--r-series-1) 100%, var(--r-paper))}
.rs-scope .rs-map-nodata{fill:var(--r-data-track)}
.rs-scope .rs-map-region:hover{fill-opacity:.82;stroke:var(--r-ink);stroke-width:1.4}

/* hover tooltip (same visual language as the bar hover card) */
.rs-scope .rs-map-tip{
  position:absolute;pointer-events:none;hidden;
  background:var(--r-ink);color:var(--r-paper);
  font:600 var(--r-size-micro)/1.35 var(--r-font-body);
  padding:.5em .7em;border-radius:var(--r-btn-radius);
  box-shadow:var(--r-panel-shadow);white-space:nowrap;z-index:2;
}
.rs-scope .rs-map-tip b{font-size:var(--r-size-small)}

/* legend: 4 steps of the ramp, left-to-right */
.rs-scope .rs-map-legend{
  display:flex;align-items:center;justify-content:center;gap:.45em;
  margin:.9em 0 0;font-size:var(--r-size-micro);color:var(--r-ink-soft);
}
.rs-scope .rs-map-sw{width:1.5em;height:.9em;border-radius:2px;border:1px solid var(--r-rule)}
.rs-scope .rs-map-sw.rs-map-s1{border-color:transparent}
.rs-scope .rs-map-sw.rs-map-nodata{background:var(--r-data-track)}
.rs-scope .rs-map-legend .rs-map-never{margin-left:.9em;display:inline-flex;align-items:center;gap:.45em}

@media (prefers-reduced-motion: no-preference){
  .rs-scope .rs-geomap .rs-map-region{opacity:0;transform:translateY(3px);animation:rs-map-in .5s ease-out forwards}
  .rs-scope .rs-geomap[data-rs-static] .rs-map-region,
  .rs-scope .rs-geomap .rs-map:nth-of-type(2) .rs-map-region{opacity:1;transform:none;animation:none}
  .rs-scope .rs-geomap .rs-map-region:nth-child(1){animation-delay:.05s}
  .rs-scope .rs-geomap .rs-map-region:nth-child(2){animation-delay:.1s}
  .rs-scope .rs-geomap .rs-map-region:nth-child(3){animation-delay:.15s}
  .rs-scope .rs-geomap .rs-map-region:nth-child(4){animation-delay:.2s}
  .rs-scope .rs-geomap .rs-map-region:nth-child(5){animation-delay:.25s}
  .rs-scope .rs-geomap .rs-map-region:nth-child(6){animation-delay:.3s}
  .rs-scope .rs-geomap .rs-map-region:nth-child(7){animation-delay:.35s}
  .rs-scope .rs-geomap .rs-map-region:nth-child(8){animation-delay:.4s}
}
@keyframes rs-map-in{to{opacity:1;transform:none}}

/* owner 2026-09-18: compact height-capped map card - center the map inside */
.rs-scope .rs-geomap .rs-map-wrap{display:flex;justify-content:center}
.rs-scope .rs-geomap .rs-map-legend{justify-content:center}

/* owner 2026-09-18: table-card-scale maps - map left, legend stacked right */
.rs-scope .rs-geomap .rs-map-row{display:flex;align-items:center;gap:28px}
.rs-scope .rs-geomap .rs-map-col{flex:0 0 auto}
.rs-scope .rs-geomap .rs-map-side{flex:1 1 auto}
.rs-scope .rs-geomap .rs-map-legend-v{flex-direction:column;align-items:flex-start;gap:10px}
.rs-scope .rs-geomap .rs-map-legend-v .rs-map-sw{width:26px;height:14px}
@media (max-width:640px){
  .rs-scope .rs-geomap .rs-map-row{flex-direction:column;align-items:flex-start}
  .rs-scope .rs-geomap .rs-map-legend-v{flex-direction:row;flex-wrap:wrap}
}

/* owner 2026-09-18: paired legend items, sized by --rs-map-sw-* vars (tuned via tools/map_lab.py) */
.rs-scope .rs-geomap .rs-map-legend, .rs-scope .rs-geomap .rs-map-legend-v{gap:var(--rs-map-gap, 24px)}
.rs-scope .rs-geomap .rs-map-li{display:inline-flex;align-items:center;gap:10px}
.rs-scope .rs-geomap .rs-map-sw{width:var(--rs-map-sw-w, 26px);height:var(--rs-map-sw-h, 14px)}
.rs-scope .rs-geomap .rs-map-legend-v{flex-direction:column;align-items:flex-start}
.rs-scope .rs-geomap .rs-map-row{display:flex;align-items:center}
.rs-scope .rs-geomap .rs-map-col{flex:0 0 auto}
.rs-scope .rs-geomap .rs-map-side{flex:1 1 auto}
@media (max-width:640px){
  .rs-scope .rs-geomap .rs-map-row{flex-direction:column;align-items:flex-start}
  .rs-scope .rs-geomap .rs-map-legend-v{flex-direction:row;flex-wrap:wrap}
}

/* owner 2026-09-18: district labels + larger legend typography */
.rs-scope .rs-geomap .rs-map-label{
  font-weight:600;fill:var(--r-ink);text-anchor:middle;pointer-events:none;
  paint-order:stroke;stroke:var(--r-paper);stroke-width:2.5px;stroke-linejoin:round;
}
.rs-scope .rs-geomap .rs-map-label-v{fill:var(--r-ink-soft);font-weight:400;stroke-width:2px}
.rs-scope .rs-geomap .rs-map-label-nd{fill:var(--r-ink-faint);font-weight:400}
.rs-scope .rs-geomap .rs-map-lab{font-size:14px;color:var(--r-ink)}
.rs-scope .rs-geomap .rs-map-legend-v .rs-map-li{gap:12px}
.rs-scope .rs-geomap .rs-map-legend-v{align-items:flex-start}

/* owner 2026-09-18: legend typography scaled up to match the map */
.rs-scope .rs-geomap .rs-map-legend{font-size:15px;color:var(--r-ink)}
.rs-scope .rs-geomap .rs-map-li{gap:14px}

/* owner 2026-09-18: legend centered in its column, larger labels */
.rs-scope .rs-geomap .rs-map-side{display:flex;align-items:center;justify-content:center}
.rs-scope .rs-geomap .rs-map-legend-v .rs-map-lab,
.rs-scope .rs-geomap .rs-map-lab{font-size:15px}

/* owner 2026-09-18: legend swatches carry the map's step colours (the fill rules
   above only paint SVG paths - HTML spans need background) */
.rs-scope .rs-geomap .rs-map-legend .rs-map-sw.rs-map-s1{background:color-mix(in srgb, var(--r-series-1) 22%, var(--r-paper))}
.rs-scope .rs-geomap .rs-map-legend .rs-map-sw.rs-map-s2{background:color-mix(in srgb, var(--r-series-1) 45%, var(--r-paper))}
.rs-scope .rs-geomap .rs-map-legend .rs-map-sw.rs-map-s3{background:color-mix(in srgb, var(--r-series-1) 68%, var(--r-paper))}
.rs-scope .rs-geomap .rs-map-legend .rs-map-sw.rs-map-s4{background:var(--r-series-1)}
.rs-scope .rs-geomap .rs-map-legend .rs-map-sw.rs-map-nodata{background:var(--r-rule)}

/* owner 2026-09-18: map and legend share the card width evenly - no left-sticking */
.rs-scope .rs-geomap .rs-map-row{justify-content:space-evenly;padding:0 var(--rs-map-row-pad, 8px)}
.rs-scope .rs-geomap .rs-map-side{flex:0 0 auto;display:flex;align-items:center;justify-content:center}

/* callout leader line: small states labelled beside the map (US Albers map, 2026-09-24) */
.rs-scope .rs-map-leader{stroke:var(--r-ink-faint);stroke-width:.8;fill:none;pointer-events:none}
/* labels on the darkest two steps: light text, no halo (2026-09-24) */
.rs-scope .rs-geomap .rs-map-label.is-dark{fill:var(--r-paper);stroke:var(--r-series-1);stroke-width:1.5px}
/* legend below the map: whole items wrap, labels never break (2026-09-24) */
.rs-scope .rs-geomap .rs-map-legend:not(.rs-map-legend-v){display:flex;flex-wrap:wrap;column-gap:28px;row-gap:10px}
.rs-scope .rs-geomap .rs-map-li{white-space:nowrap}
/* phones: map labels shrink below reading size - hide them; tap/hover card carries the values */
@container rs (max-width:560px){
  .rs-scope .rs-geomap .rs-map-label, .rs-scope .rs-geomap .rs-map-leader{display:none}
}


/* ===== library/blocks/data-table/table.css ===== */
/* data-table (core block 6). Reads --r-* tokens only. Frame = figure-shell (title, source, Embed only).
   LOCKED 2026-09-15: B6 variant=C (Ranked with bars) untuned | rows=rules long=more rank=on bars=on sort=on
   density=comfy mobile=stack
   + owner note: "Show all N rows" button full width and easy to see; collapsed = 10 rows desktop, 5 rows mobile.

   Markup contract (renderer):
   <figure class="rs-figure rs-panel" data-rs-block data-rs-png=… data-rs-alt=… data-rs-w=… data-rs-h=…>
     <figcaption class="rs-fig-head">…</figcaption>
     <div class="rs-table-wrap">
       <table class="rs-table">
         <thead><tr><th class="rk" aria-sort="none"><button type="button">#</button></th>
           <th aria-sort="none"><button type="button">Country</button></th>
           <th class="n" aria-sort="descending"><button type="button">Ownership</button></th> …</tr></thead>
         <tbody><tr><td class="rk" data-sort="1">1</td><td class="c">UAE</td>
           <td class="n" data-th="Ownership" data-sort="31.0">31.0%<span class="bar" style="--v:100"></span></td> …</tr></tbody>
       </table>
     </div>
     <button class="rs-table-more" type="button" data-more="Show all 30 rows" data-less="Show fewer rows"><span>Show all 30 rows</span></button>
       (only when the table has more rows than the collapsed count)
     <div class="rs-fig-foot">…</div>
   </figure>
   Inline bar only on the table's main value column (--v = value as % of the column max). */

.rs-scope .rs-table-wrap{position:relative;max-width:none;overflow-x:auto;-webkit-overflow-scrolling:touch}   /* wide tables scroll inside the card instead of clipping */
.rs-scope .rs-table{width:100%;border-collapse:collapse;font-size:var(--r-size-small);font-variant-numeric:tabular-nums lining-nums}
.rs-scope .rs-table th{text-align:left;font-size:var(--r-size-micro);font-weight:700;color:var(--r-ink-soft);
  text-transform:uppercase;letter-spacing:var(--r-eyebrow-tracking);padding:.5em .8em .6em 0;border-bottom:1.5px solid var(--r-ink);white-space:nowrap;vertical-align:bottom}
.rs-scope .rs-table td{padding:.62em .8em .62em 0;vertical-align:middle}
.rs-scope .rs-table th:last-child,.rs-scope .rs-table td:last-child{padding-right:0}
.rs-scope .rs-table .n{text-align:right;font-family:var(--r-font-num);font-weight:600;white-space:nowrap}
.rs-scope .rs-table .rk{width:2.2em;color:var(--r-ink-faint);font-weight:600}
.rs-scope .rs-table tbody tr + tr td{border-top:1px solid var(--r-rule)}
.rs-scope .rs-table tbody tr:hover td{background:color-mix(in srgb,var(--r-accent) 6%,var(--r-card))}

/* inline bar next to the main value */
.rs-scope .rs-table .bar{display:inline-block;width:5em;height:.5em;margin-left:.7em;vertical-align:.08em;border-radius:4px;background:var(--r-data-track);position:relative;overflow:hidden}
.rs-scope .rs-table .bar::before{content:"";position:absolute;inset:0 auto 0 0;width:calc(var(--v) * 1%);background:var(--r-series-1);border-radius:4px}

/* sortable headers */
.rs-scope .rs-table th .rs-unit{text-transform:none;letter-spacing:0}
.rs-scope .rs-table th button{all:unset;cursor:pointer;display:inline-flex;align-items:center;gap:.3em}
.rs-scope .rs-table th button::after{content:"↕";font-size:.95em;color:var(--r-ink-faint)}
.rs-scope .rs-table th[aria-sort="descending"] button::after{content:"↓";color:var(--r-ink)}
.rs-scope .rs-table th[aria-sort="ascending"] button::after{content:"↑";color:var(--r-ink)}
.rs-scope .rs-table th button:focus-visible{outline:2px solid var(--r-accent);outline-offset:2px}

/* collapsed: 10 rows (desktop); .is-short (9-13 rows) collapses on mobile only, .is-open (<= 8) never */
.rs-scope .rs-table-wrap:not(.is-open):not(.is-short) tbody tr:nth-child(n+11){display:none}

/* Show all: full-width, easy to see */
.rs-scope .rs-table-more{all:unset;box-sizing:border-box;display:flex;align-items:center;justify-content:center;gap:.5em;width:100%;margin-top:.9em;
  padding:.8em 1em;border:1.5px solid var(--r-ink);border-radius:var(--r-btn-radius);cursor:pointer;
  font:700 var(--r-size-small)/1 var(--r-font-body);color:var(--r-ink);background:var(--r-card)}
.rs-scope .rs-table-more::after{content:"";width:.45em;height:.45em;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:translateY(-.15em) rotate(45deg)}
.rs-scope .rs-table-wrap.is-open + .rs-table-more::after{transform:translateY(.1em) rotate(-135deg)}
.rs-scope .rs-table-more:hover{background:var(--r-ink);color:var(--r-paper)}
.rs-scope .rs-table-more:focus-visible{outline:2px solid var(--r-accent);outline-offset:2px}

/* 9–13 rows: nothing to expand on desktop (renderer adds .is-short to the wrap) */
@container rs (min-width:561px){ .rs-scope .rs-table-wrap.is-short + .rs-table-more{display:none} }

/* mobile: stacked rows, collapsed = 5 rows */
@container rs (max-width:560px){
  .rs-scope .rs-table-wrap:not(.is-open) tbody tr:nth-child(n+6){display:none}
  .rs-scope .rs-table .bar{width:3em}
  .rs-scope .rs-table thead{display:none}
  .rs-scope .rs-table tr{display:grid;grid-template-columns:auto 1fr;gap:.15em .8em;padding:.6em 0}
  .rs-scope .rs-table tbody tr + tr{border-top:1px solid var(--r-rule)}
  .rs-scope .rs-table td{padding:0;border:0 !important;background:none !important}
  .rs-scope .rs-table td.rk{grid-row:1}
  .rs-scope .rs-table td:not(.rk){grid-column:-2}
  .rs-scope .rs-table-wrap.is-norank .rs-table tr{grid-template-columns:1fr}
  .rs-scope .rs-table td.c{font-weight:700}
  .rs-scope .rs-table td.n{text-align:left;font-weight:500}
  .rs-scope .rs-table td[data-th]::before{content:attr(data-th) ": ";color:var(--r-ink-soft);font-family:var(--r-font-body);font-weight:400}
}


/* ===== library/blocks/faq/faq.css ===== */
/* ---- faq (B17, LOCKED 2026-09-24: accordion, chevron, numbered, first open, one open at a time) ----
   <section class="rs-faq" data-faq-layout="accordion|cards|split" data-faq-ico="plus|chevron|none" data-faq-num="off|on" aria-labelledby="rs-faq-h"><h2 id="rs-faq-h">{heading}</h2>
     <div class="rs-faq-list">
       <details class="rs-faq-item" [open]><summary class="rs-faq-q"><h3>{question}</h3><span class="rs-faq-ico" aria-hidden="true"></span></summary>
         <div class="rs-faq-a"><p>{answer with footnotes}</p></div></details> …</div></section>
   Every answer is in the HTML (closed <details> is still crawlable text). One question = one H3.
   Tokens only; layout by @container. */
.rs-scope .rs-faq h2{margin-bottom:.6em}
.rs-scope .rs-faq-list{counter-reset:faq}
.rs-scope .rs-faq-item{margin:0}
.rs-scope .rs-faq-q{list-style:none;cursor:pointer;display:flex;align-items:flex-start;gap:.8em}
.rs-scope .rs-faq-q::-webkit-details-marker{display:none}
.rs-scope .rs-faq-q h3{margin:0;flex:1 1 auto;font:var(--r-weight-head) calc(var(--r-body) * 1.05)/1.35 var(--r-font-head);letter-spacing:var(--r-tracking-head);color:var(--r-ink)}
.rs-scope .rs-faq-a p{margin:.5em 0 0;max-width:var(--r-measure);color:var(--r-ink)}
.rs-scope .rs-faq-q:focus-visible{outline:2px solid var(--r-accent);outline-offset:3px}
/* numbering (tuner) */
.rs-scope .rs-faq[data-faq-num="on"] .rs-faq-item{counter-increment:faq}
.rs-scope .rs-faq[data-faq-num="on"] .rs-faq-q h3::before{content:counter(faq) ". ";color:var(--r-accent-ink)}
/* plus / chevron icon */
.rs-scope .rs-faq-ico{flex:0 0 auto;width:1.1em;height:1.1em;margin-top:.15em;position:relative;color:var(--r-ink)}
.rs-scope .rs-faq[data-faq-ico="plus"] .rs-faq-ico::before,.rs-scope .rs-faq[data-faq-ico="plus"] .rs-faq-ico::after{content:"";position:absolute;left:50%;top:50%;width:.8em;height:2px;background:currentColor;transform:translate(-50%,-50%);transition:transform .2s}
.rs-scope .rs-faq[data-faq-ico="plus"] .rs-faq-ico::after{transform:translate(-50%,-50%) rotate(90deg)}
.rs-scope .rs-faq[data-faq-ico="plus"] details[open] .rs-faq-ico::after{transform:translate(-50%,-50%) rotate(0)}
.rs-scope .rs-faq[data-faq-ico="chevron"] .rs-faq-ico::before{content:"";position:absolute;left:25%;top:15%;width:.45em;height:.45em;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);transition:transform .2s}
.rs-scope .rs-faq[data-faq-ico="chevron"] details[open] .rs-faq-ico::before{transform:translateY(.25em) rotate(-135deg)}
.rs-scope .rs-faq[data-faq-ico="none"] .rs-faq-ico{display:none}

/* A · accordion: ruled rows, answers open on click */
.rs-scope .rs-faq[data-faq-layout="accordion"] .rs-faq-item{border-top:1px solid var(--r-rule)}
.rs-scope .rs-faq[data-faq-layout="accordion"] .rs-faq-item:last-child{border-bottom:1px solid var(--r-rule)}
.rs-scope .rs-faq[data-faq-layout="accordion"] .rs-faq-q{padding:.95em 0}
.rs-scope .rs-faq[data-faq-layout="accordion"] .rs-faq-a{padding:0 2em 1.1em 0}
.rs-scope .rs-faq[data-faq-layout="accordion"] .rs-faq-a p{margin-top:0}
.rs-scope .rs-faq[data-faq-layout="accordion"] .rs-faq-q:hover h3{text-decoration:underline;text-decoration-color:var(--r-accent);text-underline-offset:3px}

/* B · open cards: every Q&A visible, one white panel per question */
.rs-scope .rs-faq[data-faq-layout="cards"] .rs-faq-list{display:grid;gap:12px}
.rs-scope .rs-faq[data-faq-layout="cards"] .rs-faq-item{background:var(--r-panel-bg);box-shadow:var(--r-panel-shadow);padding:16px 20px;border-left:3px solid var(--r-accent)}
.rs-scope .rs-faq[data-faq-layout="cards"] .rs-faq-q{cursor:default;pointer-events:none}
.rs-scope .rs-faq[data-faq-layout="cards"] .rs-faq-ico{display:none}

/* C · split: question left, answer right on wide screens, all open */
.rs-scope .rs-faq[data-faq-layout="split"] .rs-faq-item{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,3fr);column-gap:28px;border-top:1px solid var(--r-rule);padding:1em 0}
.rs-scope .rs-faq[data-faq-layout="split"] .rs-faq-item:last-child{border-bottom:1px solid var(--r-rule)}
.rs-scope .rs-faq[data-faq-layout="split"] .rs-faq-q{cursor:default;pointer-events:none}
.rs-scope .rs-faq[data-faq-layout="split"] .rs-faq-ico{display:none}
.rs-scope .rs-faq[data-faq-layout="split"] .rs-faq-a p{margin-top:0}
@container rs (max-width:560px){
  .rs-scope .rs-faq[data-faq-layout="split"] .rs-faq-item{grid-template-columns:1fr}
  .rs-scope .rs-faq[data-faq-layout="split"] .rs-faq-a p{margin-top:.5em}
  .rs-scope .rs-faq[data-faq-layout="accordion"] .rs-faq-a{padding-right:0}
}


/* ===== library/blocks/methodology/methodology.css ===== */
/* methodology (core block 8): how the numbers were made.
   LOCKED 2026-09-15: B8 variant=A (Prose) tuned=[box,cov] | title=method layout=prose box=card cov=on labels=bold

   Markup contract (renderer):
   <section class="rs-md" aria-labelledby="md-h">
     <h2 id="md-h">Methodology</h2>
     <div class="rs-md-cov"><ul><li>Period <b>2024</b></li><li><b>30</b> countries</li></ul>
                            <ul><li><b>4</b> sources</li><li>Updated <b>May 18, 2025</b></li></ul></div>
     <div class="rs-md-body rs-panel">
       <p class="rs-md-item"><b class="rs-md-lab">Definition.</b> …</p>
       <p class="rs-md-item"><b class="rs-md-lab">Data sources.</b> … {footnotes}</p>
       <p class="rs-md-item"><b class="rs-md-lab">Calculations.</b> …</p>
       <p class="rs-md-item"><b class="rs-md-lab">Limitations.</b> …</p>
     </div>
   </section> */

.rs-scope .rs-md{margin-top:var(--r-space)}

/* coverage strip: items flow and wrap inside the container (long entries must never run wide) */
.rs-scope .rs-md-cov{display:flex;flex-wrap:wrap;gap:.4em 1em;margin:0 0 1.1em;font-size:var(--r-size-small);color:var(--r-ink-soft)}
.rs-scope .rs-md-cov ul{display:flex;flex-wrap:wrap;row-gap:.3em;list-style:none;padding:0;margin:0;max-width:none;min-width:0}
.rs-scope .rs-md-cov li{margin:0;padding:0 .8em;border-left:1px solid var(--r-rule);text-wrap:pretty}
.rs-scope .rs-md-cov li:first-child{padding-left:0;border-left:0}
.rs-scope .rs-md-cov b{color:var(--r-ink)}
@container rs (min-width:620px){
  .rs-scope .rs-md-cov{gap:.4em 0}
  .rs-scope .rs-md-cov ul + ul li:first-child{padding-left:.8em;border-left:1px solid var(--r-rule)}
}

/* white card with paragraphs, bold lead-ins */
.rs-scope .rs-md-body{background:var(--r-panel-bg);box-shadow:var(--r-panel-shadow);border-radius:var(--r-panel-radius);padding:var(--r-panel-pad)}
.rs-scope .rs-md-item{margin:0 0 1em;max-width:660px}
.rs-scope .rs-md-item:last-child{margin-bottom:0}
.rs-scope .rs-md-lab{font-weight:700;color:var(--r-ink)}

/* fix 2026-09-17: items wrap at every width (replaces the old 420px-only workaround) */


/* ===== library/blocks/related-research/related.css ===== */
/* related-research: links to the most relevant sibling research pages of the same site (bottom of the page).
   LOCKED 2026-09-16: B24 variant=A (Cards) untuned | layout=cards count=6 cols=2 cat=on stat=on go=on sub=on
   Owner: "for each site, we will be making 10-50 research pages. we must interlink them in this block.
   most relevant ones must be linked to."
   Relevance (renderer): shared tags x2, +3 same category; top 6; never the page itself; pages with listed: false skipped.

   <section class="rs-rel" aria-labelledby="rs-rel-h"><h2 id="rs-rel-h">Related research</h2>
     <p class="rs-rel-sub">{site related_intro}</p>
     <ol class="rs-rel-list"><li class="rs-rel-item"><a class="rs-rel-link" href="{url}">
       <span class="rs-rel-cat">{category}</span><span class="rs-rel-title">{H1}</span>
       <span class="rs-rel-stat"><b>{num}</b> {label}</span><span class="rs-rel-go">Read the research →</span></a></li></ol>
   </section>   Whole card is one plain link (crawlable). */
.rs-scope .rs-rel h2{margin-bottom:.2em}
.rs-scope .rs-rel-sub{font-size:var(--r-size-small);color:var(--r-ink-soft);margin:0 0 1em}
.rs-scope .rs-rel-list{list-style:none;margin:0;padding:0;max-width:none;display:grid;gap:14px;grid-template-columns:repeat(2,minmax(0,1fr))}
.rs-scope .rs-rel-item{margin:0}
.rs-scope .rs-rel-link{display:flex;flex-direction:column;gap:.3em;height:100%;box-sizing:border-box;text-decoration:none;color:var(--r-ink);
  background:var(--r-panel-bg);box-shadow:var(--r-panel-shadow);padding:16px 18px;border-top:3px solid transparent;transition:border-color .15s}
.rs-scope .rs-rel-link:hover{border-top-color:var(--r-accent)}
.rs-scope .rs-rel-link:focus-visible{outline:2px solid var(--r-accent);outline-offset:3px}
.rs-scope .rs-rel-cat{font-size:var(--r-size-micro);font-weight:700;letter-spacing:var(--r-eyebrow-tracking);text-transform:uppercase;color:var(--r-accent-ink)}
.rs-scope .rs-rel-title{font:var(--r-weight-head) calc(var(--r-body) * 1.02)/1.3 var(--r-font-head);letter-spacing:var(--r-tracking-head)}
.rs-scope .rs-rel-link:hover .rs-rel-title,.rs-scope .rs-rel-link:focus-visible .rs-rel-title{text-decoration:underline;text-decoration-color:var(--r-accent);text-underline-offset:3px}
.rs-scope .rs-rel-stat{font-size:var(--r-size-small);color:var(--r-ink-soft)}
.rs-scope .rs-rel-stat b{font-family:var(--r-font-num);font-weight:700;color:var(--r-num-color);font-variant-numeric:tabular-nums}
.rs-scope .rs-rel-go{margin-top:auto;padding-top:.35em;font-size:var(--r-size-micro);font-weight:700;color:var(--r-ink)}
@container rs (max-width:560px){ .rs-scope .rs-rel-list{grid-template-columns:1fr} }


/* ===== library/blocks/references/references.css ===== */
/* references (core block 7): the numbered source list footnote badges point to.
   LOCKED 2026-09-15: B7 variant=A (Full citation) untuned | style=full num=plain rules=off accessed=on title=sources
   Upstream: F3 (one number per source, "Back to text", flash on jump).

   Markup contract (renderer):
   <section class="rs-refs" aria-labelledby="rf-h">
     <h2 id="rf-h">Sources</h2>
     <ol class="rs-refs-list">
       <li class="rs-ref" id="rs-ref-1">Author. “Title.” Publisher, 17 June 2025. <a href="{url}">domain.com</a>. Accessed 10 Nov. 2025.
         <a class="rs-fn-back" href="#rs-fn-1" data-rs-back="1">Back to text</a></li>
     </ol>
   </section>
   Entry = Author (or organisation). “Title.” Publisher, publication date. linked domain. Accessed date. */

.rs-scope .rs-refs{margin-top:var(--r-space)}
.rs-scope .rs-refs h2{margin-top:0}
.rs-scope .rs-refs-list{list-style:none;margin:0;padding:0;max-width:none;counter-reset:rf}
.rs-scope .rs-ref{counter-increment:rf;position:relative;margin:0;padding:.55em .4em .55em 2.3em;border-radius:6px;font-size:var(--r-size-small);line-height:1.5;color:var(--r-ink-soft)}
.rs-scope .rs-ref::before{content:counter(rf);position:absolute;left:.4em;top:.55em;font-weight:700;color:var(--r-ink);font-variant-numeric:tabular-nums}
.rs-scope .rs-ref a{color:var(--r-ink);text-decoration-color:var(--r-accent);text-decoration-thickness:1.5px;overflow-wrap:anywhere}
.rs-scope .rs-ref .rs-fn-back{margin-left:.5em}


/* ===== library/blocks/author-box/author.css ===== */
/* author-box (core block 9): who made and who checked the research.
   LOCKED 2026-09-15: B9 variant=A (Card with reviewer row) tuned=[photo] | title=author box=card rev=row
   links=on ed=on photo=52 | note: author and reviewer photos the same size as the reviewer one (48px)
   Data from per-site config. Real photos (owner B1). Feeds Person / reviewedBy JSON-LD.

   Markup contract (renderer):
   <section class="rs-ab" aria-labelledby="ab-h">
     <h2 id="ab-h">About the author</h2>
     <div class="rs-ab-body">
       <div class="rs-ab-person">
         <img class="rs-ab-photo" src="{photo}" alt="{name}" width="48" height="48">
         <div class="rs-ab-name"><a href="{url}">{name}</a></div>
         <div class="rs-ab-role">{role}</div>
         <div><p class="rs-ab-bio">{bio}</p><div class="rs-ab-links"><a>All research by {first}</a><a>LinkedIn</a></div></div>
       </div>
       <div class="rs-ab-person rs-ab-rev">
         <img class="rs-ab-photo" …><div class="rs-ab-kicker">Reviewed by</div>
         <div class="rs-ab-name"><a>{reviewer}</a></div><div class="rs-ab-role">{reviewer role}</div>
       </div>
       <p class="rs-ab-ed">Every figure on this page links to its source. <a href="{how_we_research}">How we research</a></p>
     </div>
   </section> */

.rs-scope .rs-ab{margin-top:var(--r-space)}
.rs-scope .rs-ab h2{font-size:var(--r-h3)}
.rs-scope .rs-ab-body{display:grid;gap:1.1em;background:var(--r-panel-bg);box-shadow:var(--r-panel-shadow);border-radius:var(--r-panel-radius);padding:var(--r-panel-pad)}
.rs-scope .rs-ab-person{display:grid;grid-template-columns:48px 1fr;gap:.2em 1em;align-items:start;align-content:start}
.rs-scope .rs-ab-person > :not(.rs-ab-photo){grid-column:2}
.rs-scope .rs-ab-photo{width:48px;height:48px;border-radius:50%;object-fit:cover;grid-row:span 3;background:color-mix(in srgb,var(--r-ink) 8%,var(--r-paper))}
.rs-scope .rs-ab-name{font:var(--r-weight-head) calc(var(--r-body) * 1.02)/1.25 var(--r-font-head);color:var(--r-ink)}
.rs-scope .rs-ab-name a{color:inherit;text-decoration:none}
.rs-scope .rs-ab-name a:hover{text-decoration:underline;text-decoration-color:var(--r-accent)}
.rs-scope .rs-ab-role{font-size:var(--r-size-small);color:var(--r-ink-soft)}
.rs-scope .rs-ab-bio{font-size:var(--r-size-small);line-height:1.55;margin:.35em 0 0;max-width:none}
.rs-scope .rs-ab-links{display:flex;flex-wrap:wrap;gap:.3em 1em;margin-top:.45em;font-size:var(--r-size-micro);font-weight:700}
.rs-scope .rs-ab-links a{color:var(--r-ink);text-decoration-color:var(--r-accent)}
.rs-scope .rs-ab-rev{padding-top:1em;border-top:1px solid var(--r-rule)}
.rs-scope .rs-ab-kicker{font-size:var(--r-size-micro);font-weight:700;letter-spacing:var(--r-eyebrow-tracking);text-transform:uppercase;color:var(--r-ink-soft)}
.rs-scope .rs-ab-ed{font-size:var(--r-size-micro);color:var(--r-ink-soft);margin:0;max-width:none}
.rs-scope .rs-ab-ed a{color:var(--r-ink);font-weight:700;text-decoration-color:var(--r-accent)}

@container rs (max-width:560px){
  .rs-scope .rs-ab-photo{grid-row:span 2}
  .rs-scope .rs-ab-person > div:not(.rs-ab-name):not(.rs-ab-role):not(.rs-ab-kicker){grid-column:1 / -1}
}
