/* =============================================================================
   article_v2.css  —  OpenAccessPub Article Page Visual Modernization
   2026 Frontiers / MDPI scholarly standard
   -----------------------------------------------------------------------------
   STAGING ONLY. Loaded ONLY on the redesigned preview page whose <body>/main
   wrapper carries class "article-v2".

   SCOPING RULE: EVERY selector is namespaced under `.article-v2` so nothing
   can leak onto legacy article pages or any other route. Do not remove the
   `.article-v2` prefix from any rule.

   STACK: Bootstrap 5 is already loaded. This sheet COMPLEMENTS Bootstrap —
   it does not redefine the grid, utilities, or component internals. Where it
   touches Bootstrap components (.card, .table, .nav-pills, .breadcrumb) it
   only adds visual polish under the .article-v2 scope.

   PALETTE: CSS custom properties below. OAP blue accent = #007BFF.
   FONTS: system font stack only — NO @import of remote fonts.

   TABLE OF CONTENTS
     0.  Design tokens (CSS variables) + base resets
     3.4 Typography (base 17–18px, line-height ~1.6, H1/H2/H3)
     3.5 Reading-progress bar (thin, top)
     3.3 Breadcrumb + back-to-top
     3.1 Two-pane sticky layout (TOC | main | tools rail)
     3.2 Scrollspy active-TOC highlight
     2.1 Trust-badge chips strip
     2.2 Article-info card
     2.3 Publication-timeline card (Received → Accepted → Published)
     2.5 Statement cards (Funding / COI / Data / Ethics / Acknowledgements)
     1.7 Table polish (zebra, sticky header, responsive scroll)
     4.6 Figure lightbox affordances
     4.4 Metrics stat card
     4.5 Quiet journal CTA card
     5.1 Mobile-first (single column, TOC drawer, sticky bottom action bar)
     5.2 WCAG AA (focus rings, contrast, reduced-motion, print)
   ========================================================================== */


/* =============================================================================
   0.  DESIGN TOKENS  (scoped to .article-v2 so they cannot affect :root global)
   ========================================================================== */
.article-v2 {
  /* --- Brand / accent --- */
  --av-accent:            #007BFF;   /* OAP blue */
  --av-accent-rgb:        0, 123, 255;
  --av-accent-hover:      #0062cc;   /* darker — passes 4.5:1 on white */
  --av-accent-soft:       #e7f1ff;   /* tints, chip/timeline backgrounds */
  --av-accent-soft-2:     #cfe2ff;

  /* --- Neutrals / ink --- */
  --av-ink:               #16202c;   /* body text  ~ 15:1 on white */
  --av-ink-soft:          #41505f;   /* secondary text ~ 8:1 */
  --av-ink-muted:         #5d6b78;   /* captions/meta — still >= 4.5:1 */
  --av-bg:                #ffffff;
  --av-bg-subtle:         #f6f8fa;   /* card/section wash */
  --av-bg-sunken:         #eef1f4;   /* zebra / sunken wells */
  --av-border:            #dde3ea;
  --av-border-strong:     #c4ccd6;

  /* --- Semantic statement-card accents (all AA on their soft bg) --- */
  --av-fund:              #2e7d32;   /* funding — green */
  --av-fund-soft:         #e8f5e9;
  --av-coi:               #b26a00;   /* competing interests — amber */
  --av-coi-soft:          #fff4e2;
  --av-data:              #006d8f;   /* data availability — teal */
  --av-data-soft:         #e2f3f8;
  --av-ethics:            #6a3fb5;   /* ethics — violet */
  --av-ethics-soft:       #efe9fb;
  --av-ack:               #5d6b78;   /* acknowledgements — slate */
  --av-ack-soft:          #eef1f4;

  /* --- Timeline states --- */
  --av-tl-received:       #6c757d;
  --av-tl-accepted:       #007BFF;
  --av-tl-published:      #2e7d32;

  /* --- Typography scale --- */
  --av-font-sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue",
                  Arial, "Noto Sans", sans-serif, "Apple Color Emoji",
                  "Segoe UI Emoji";
  --av-font-serif: Georgia, Cambria, "Times New Roman", Times, serif;
  --av-fs-base:    1.0625rem;        /* 17px */
  --av-lh-base:    1.62;
  --av-measure:    720px;            /* readable main-column max-width (3.1) */

  /* --- Spacing / radius / shadow --- */
  --av-radius:      12px;
  --av-radius-sm:   8px;
  --av-radius-pill: 999px;
  --av-shadow-sm:   0 1px 2px rgba(16, 32, 44, .06),
                    0 1px 3px rgba(16, 32, 44, .08);
  --av-shadow-md:   0 4px 14px rgba(16, 32, 44, .10);
  --av-shadow-lg:   0 12px 40px rgba(16, 32, 44, .22);

  /* --- Sticky offsets (keep anchored jumps clear of the sticky header) --- */
  --av-header-h:        64px;        /* assumed site header height */
  --av-progress-h:      3px;         /* reading-progress bar (3.5) */
  --av-scroll-offset:   100px;       /* matches legacy inline scroll-margin-top */

  color: var(--av-ink);
  background-color: var(--av-bg);
  font-family: var(--av-font-sans);
  font-size: var(--av-fs-base);
  line-height: var(--av-lh-base);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

/* Inherit the base size without forcing it onto Bootstrap component internals */
.article-v2 *,
.article-v2 *::before,
.article-v2 *::after {
  box-sizing: border-box;
}

/* CRITICAL: preserve the legacy anchor-offset behaviour (scroll-margin-top:100px
   was inline on every panel). Apply it to all preserved fragment targets so
   deep-links to #idm…, #ridm…, #v-pills-*, #references, #cited-by, #citation_,
   #article, #tables-and-figures don't hide beneath the sticky header. */
.article-v2 [id] {
  scroll-margin-top: var(--av-scroll-offset);
}
.article-v2 .tab-pane,
.article-v2 [id^="idm"],
.article-v2 [id^="ridm"],
.article-v2 [id^="v-pills-"],
.article-v2 #references,
.article-v2 #cited-by,
.article-v2 #citation_,
.article-v2 #article,
.article-v2 #tables-and-figures {
  scroll-margin-top: var(--av-scroll-offset);
}


/* =============================================================================
   3.4  TYPOGRAPHY  —  base 17–18px, line-height ~1.6, distinct H1/H2/H3
   ========================================================================== */
.article-v2 .av-main,
.article-v2 .article,
.article-v2 .tab-content {
  font-size: var(--av-fs-base);
  line-height: var(--av-lh-base);
  color: var(--av-ink);
}

.article-v2 .av-main p,
.article-v2 .article p {
  margin: 0 0 1.15em;
  /* readable measure — paragraphs never exceed the column, hyphenate gracefully */
  overflow-wrap: break-word;
}

/* Headings: clear, distinct hierarchy. Serif H1 lends scholarly authority. */
.article-v2 h1,
.article-v2 .av-title {
  font-family: var(--av-font-serif);
  font-size: clamp(1.75rem, 1.2rem + 2.2vw, 2.4rem);
  line-height: 1.2;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--av-ink);
  margin: 0 0 .5em;
}

.article-v2 h2,
.article-v2 .av-main h2 {
  font-size: 1.55rem;
  line-height: 1.28;
  font-weight: 700;
  color: var(--av-ink);
  margin: 2.2rem 0 .75rem;
  padding-bottom: .35rem;
  border-bottom: 2px solid var(--av-border);
}

.article-v2 h3,
.article-v2 .av-main h3 {
  font-size: 1.22rem;
  line-height: 1.35;
  font-weight: 600;
  color: var(--av-ink-soft);
  margin: 1.75rem 0 .5rem;
}

.article-v2 h4,
.article-v2 .av-main h4 {
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--av-ink-soft);
  margin: 1.4rem 0 .4rem;
  text-transform: none;
}

/* Links inside readable content */
.article-v2 .av-main a,
.article-v2 .article a {
  color: var(--av-accent-hover);
  text-decoration: underline;
  text-underline-offset: 2px;
  text-decoration-thickness: 1px;
}
.article-v2 .av-main a:hover,
.article-v2 .article a:hover {
  color: var(--av-accent);
  text-decoration-thickness: 2px;
}

/* Inline citation cross-links [1]…[12] — keep them obvious but unobtrusive */
.article-v2 a[href^="#ridm"] {
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* Lists, blockquotes, figures, small print */
.article-v2 .av-main ul,
.article-v2 .av-main ol {
  margin: 0 0 1.15em;
  padding-left: 1.4em;
}
.article-v2 .av-main li { margin-bottom: .35em; }

.article-v2 blockquote {
  margin: 1.4em 0;
  padding: .25em 0 .25em 1.1em;
  border-left: 3px solid var(--av-accent-soft-2);
  color: var(--av-ink-soft);
  font-style: italic;
}

.article-v2 figcaption,
.article-v2 .figure-caption,
.article-v2 small,
.article-v2 .article_text_small {
  font-size: .8125rem;
  line-height: 1.5;
  color: var(--av-ink-muted);
}


/* =============================================================================
   3.5  READING-PROGRESS BAR  —  thin, fixed at very top
   -----------------------------------------------------------------------------
   Markup (suggested):
     <div class="av-progress" role="progressbar" aria-hidden="true">
       <div class="av-progress__fill" style="width:0%"></div>
     </div>
   JS sets the inline width of __fill from scroll position.
   ========================================================================== */
.article-v2 .av-progress {
  position: fixed;
  inset: 0 0 auto 0;             /* top:0; left/right:0 */
  height: var(--av-progress-h);
  background: transparent;
  z-index: 1080;                 /* above sticky header, below modals */
  pointer-events: none;
}
.article-v2 .av-progress__fill {
  height: 100%;
  width: 100%;                   /* full-width; JS scales it via transform */
  transform: scaleX(0);
  transform-origin: left center;
  background: linear-gradient(90deg, var(--av-accent), #4aa3ff);
  /* animate transform (GPU-composited) not width, to avoid layout thrash.
     JS sets `transform: scaleX(<0..1>)` from scroll progress. */
  transition: transform .08s linear;
  will-change: transform;
}


/* =============================================================================
   3.3  BREADCRUMB  +  BACK-TO-TOP
   ========================================================================== */

/* --- Breadcrumb (complements Bootstrap .breadcrumb) --- */
.article-v2 .breadcrumb,
.article-v2 .av-breadcrumb {
  font-size: .8125rem;
  background: transparent;
  padding: .25rem 0;
  margin-bottom: 1rem;
  color: var(--av-ink-muted);
}
.article-v2 .breadcrumb a,
.article-v2 .av-breadcrumb a {
  color: var(--av-ink-soft);
  text-decoration: none;
}
.article-v2 .breadcrumb a:hover,
.article-v2 .av-breadcrumb a:hover {
  color: var(--av-accent-hover);
  text-decoration: underline;
}
.article-v2 .breadcrumb-item + .breadcrumb-item::before {
  color: var(--av-border-strong);
}

/* --- Back-to-top floating button --- */
.article-v2 .av-back-to-top {
  position: fixed;
  right: 1.25rem;
  bottom: 1.25rem;
  z-index: 1040;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;                   /* >= 44px touch target (5.2) */
  height: 44px;
  border: 1px solid var(--av-border);
  border-radius: 50%;
  background: var(--av-bg);
  color: var(--av-accent-hover);
  box-shadow: var(--av-shadow-md);
  cursor: pointer;
  opacity: 0;
  visibility: hidden;
  transform: translateY(8px);
  transition: opacity .2s ease, transform .2s ease, visibility .2s ease;
}
.article-v2 .av-back-to-top.is-visible {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.article-v2 .av-back-to-top:hover {
  background: var(--av-accent);
  color: #fff;
  border-color: var(--av-accent);
}
.article-v2 .av-back-to-top svg { width: 20px; height: 20px; }


/* =============================================================================
   3.1  TWO-PANE STICKY LAYOUT  —  sticky TOC | readable main | sticky tools
   -----------------------------------------------------------------------------
   Suggested wrapper:
     <div class="av-layout">
       <aside class="av-toc">…primary v-pills nav / sidebar TOC…</aside>
       <main  class="av-main">…readable article column (max ~720px)…</main>
       <aside class="av-tools">…export / pdf / xml / share rail…</aside>
     </div>
   Uses CSS grid so it composes with the Bootstrap container without fighting
   the .row/.col system. Mobile collapse handled in 5.1.
   ========================================================================== */
.article-v2 .av-layout {
  display: grid;
  grid-template-columns: minmax(220px, 260px) minmax(0, 1fr) minmax(220px, 260px);
  gap: clamp(1.5rem, 2vw, 2.5rem);
  align-items: start;
  width: 100%;
  max-width: 1320px;
  margin-inline: auto;
  padding-inline: clamp(1rem, 2vw, 1.5rem);
}

/* Readable main column — capped measure, centered within its grid cell */
.article-v2 .av-main {
  min-width: 0;                  /* allow wide tables to scroll, not blow out grid */
  max-width: var(--av-measure);
  margin-inline: auto;
  width: 100%;
}

/* Readability fix: flowing article copy reads at the design base size inside the
   capped column. The legacy .article_text_small forced 13px, which in the wide
   column produced ~110 chars/line (cramped + sparse). Here body text reads at
   ~16px/1.62 → comfortable ~70-char measure. Scoped to the main reading column;
   table cells, figure/table captions, references and small UI bits keep their own
   (more specific) sizes. */
.article-v2 .av-main .content,
.article-v2 .av-main .content > p,
.article-v2 .av-main .content > div > p,
.article-v2 .av-main .content li,
.article-v2 .av-main .article_text {
  font-size: var(--av-fs-base);  /* 17px — doc 3.4 target (base 17-18px); ~62 chars at the 720px measure */
  line-height: 1.62;
}
.article-v2 .av-main .content > p,
.article-v2 .av-main .content li {
  margin: 0 0 1.05em;            /* even paragraph rhythm */
}
/* Keep small print compact even inside .av-main */
.article-v2 .av-main .av-table-wrap,
.article-v2 .av-main .av-table-wrap * ,
.article-v2 .av-main figure figcaption,
.article-v2 .av-main small {
  font-size: inherit;            /* defer to their own component rules below/above */
}

/* --- Sticky left TOC --- */
.article-v2 .av-toc {
  position: sticky;
  top: calc(var(--av-header-h) + var(--av-progress-h) + 12px);
  max-height: calc(100vh - var(--av-header-h) - 24px);
  overflow-y: auto;
  overscroll-behavior: contain;
  padding-right: .5rem;
  font-size: .875rem;
  scrollbar-width: thin;
}
.article-v2 .av-toc__title {
  font-size: .72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--av-ink-muted);
  margin: 0 0 .5rem;
}

/* TOC list — works with the existing #v-pills-tab nav or a plain <ul> */
.article-v2 .av-toc .nav,
.article-v2 .av-toc ul {
  list-style: none;
  margin: 0;
  padding: 0;
  border-left: 2px solid var(--av-border);
}
.article-v2 .av-toc .nav-link,
.article-v2 .av-toc a {
  display: block;
  padding: .35rem .75rem;
  margin-left: -2px;             /* sit the active border over the rail */
  border-left: 2px solid transparent;
  color: var(--av-ink-soft);
  text-decoration: none;
  border-radius: 0 var(--av-radius-sm) var(--av-radius-sm) 0;
  line-height: 1.35;
  transition: color .15s ease, background-color .15s ease,
              border-color .15s ease;
}
.article-v2 .av-toc .nav-link:hover,
.article-v2 .av-toc a:hover {
  color: var(--av-accent-hover);
  background: var(--av-accent-soft);
}
/* nested sub-items (collapsible groups reuse #idm… fragments) */
.article-v2 .av-toc ul ul a,
.article-v2 .av-toc .nav .nav a {
  padding-left: 1.5rem;
  font-size: .825rem;
  color: var(--av-ink-muted);
}

/* --- Sticky right tools rail --- */
.article-v2 .av-tools {
  position: sticky;
  top: calc(var(--av-header-h) + var(--av-progress-h) + 12px);
  max-height: calc(100vh - var(--av-header-h) - 24px);
  overflow-y: auto;
  overscroll-behavior: contain;
  display: flex;
  flex-direction: column;
  gap: 1rem;
}
.article-v2 .av-tools__group {
  background: var(--av-bg-subtle);
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius);
  padding: .85rem;
}
.article-v2 .av-tools__group h4 {
  font-size: .72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--av-ink-muted);
  margin: 0 0 .6rem;
}
.article-v2 .av-tools a.av-tool {
  display: flex;
  align-items: center;
  gap: .55rem;
  padding: .5rem .6rem;
  border-radius: var(--av-radius-sm);
  color: var(--av-ink);
  text-decoration: none;
  font-size: .875rem;
  font-weight: 500;
}
.article-v2 .av-tools a.av-tool:hover {
  background: var(--av-accent-soft);
  color: var(--av-accent-hover);
}
.article-v2 .av-tools a.av-tool svg {
  width: 18px; height: 18px; flex: none; color: var(--av-accent);
}


/* =============================================================================
   3.2  SCROLLSPY ACTIVE-TOC HIGHLIGHT
   -----------------------------------------------------------------------------
   Bootstrap scrollspy toggles `.active` on the matching .nav-link.
   We style both Bootstrap's class and a generic `.is-active` so either JS works.
   ========================================================================== */
.article-v2 .av-toc .nav-link.active,
.article-v2 .av-toc .nav-link.is-active,
.article-v2 .av-toc a.active,
.article-v2 .av-toc a.is-active {
  color: var(--av-accent-hover);
  font-weight: 600;
  background: var(--av-accent-soft);
  border-left-color: var(--av-accent);
}
.article-v2 .av-toc .nav-link.active:hover,
.article-v2 .av-toc a.active:hover {
  color: var(--av-accent);
}


/* =============================================================================
   2.1  TRUST-BADGE CHIPS STRIP
   -----------------------------------------------------------------------------
   Suggested markup:
     <ul class="av-trust-strip">
       <li class="av-chip"><svg…/> Open Access</li>
       <li class="av-chip av-chip--peer">Peer Reviewed</li>
       <li class="av-chip av-chip--cc">CC BY 4.0</li>
       <li class="av-chip">Crossref</li> …
     </ul>
   ========================================================================== */
.article-v2 .av-trust-strip {
  display: flex;
  flex-wrap: wrap;
  gap: .5rem;
  list-style: none;
  margin: 0 0 1.25rem;
  padding: 0;
}
.article-v2 .av-chip {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  padding: .3rem .7rem;
  font-size: .78rem;
  font-weight: 600;
  line-height: 1.2;
  color: var(--av-ink-soft);
  background: var(--av-bg-subtle);
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius-pill);
  white-space: nowrap;
}
.article-v2 .av-chip svg {
  width: 14px; height: 14px; flex: none;
}
/* Emphasis variants */
.article-v2 .av-chip--oa,
.article-v2 .av-chip--peer {
  color: var(--av-accent-hover);
  background: var(--av-accent-soft);
  border-color: var(--av-accent-soft-2);
}
.article-v2 .av-chip--cc {
  color: var(--av-fund);
  background: var(--av-fund-soft);
  border-color: #c4e3c6;
}
.article-v2 .av-chip svg { color: currentColor; }


/* =============================================================================
   2.2  ARTICLE-INFO CARD
   -----------------------------------------------------------------------------
   Holds DOI, journal/issue/volume, article type, license, citation line.
   NOTE (defect 1.3): the legacy "Author Contributions" <h5> at article_v2.xsl
   line 242 actually wraps Received/Accepted/Published + editor + license. That
   is a content/label fix in the XSL, not CSS — these styles render whatever
   heading the corrected markup supplies. Use .av-info-card for the metadata
   block and the timeline card (2.3) for the dates.
   ========================================================================== */
.article-v2 .av-info-card,
.article-v2 .av-main .card {
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius);
  background: var(--av-bg);
  box-shadow: var(--av-shadow-sm);
}
.article-v2 .av-info-card {
  padding: 1.1rem 1.25rem;
  margin-bottom: 1.5rem;
}
.article-v2 .av-info-card__grid {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: .45rem 1rem;
  font-size: .9rem;
}
.article-v2 .av-info-card__label {
  color: var(--av-ink-muted);
  font-weight: 600;
  text-transform: uppercase;
  font-size: .7rem;
  letter-spacing: .04em;
  padding-top: .15em;
}
.article-v2 .av-info-card__value {
  color: var(--av-ink);
  word-break: break-word;
}
.article-v2 .av-info-card__value a {           /* DOI link */
  color: var(--av-accent-hover);
  text-decoration: none;
  font-variant-numeric: tabular-nums;
}
.article-v2 .av-info-card__value a:hover { text-decoration: underline; }

/* Tidy the Bootstrap card title inside the readable column */
.article-v2 .av-main .card .card-title {
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--av-ink);
  margin-bottom: .75rem;
}


/* =============================================================================
   2.3  PUBLICATION-TIMELINE CARD  —  Received → Accepted → Published
   -----------------------------------------------------------------------------
   Suggested markup:
     <ol class="av-timeline">
       <li class="av-timeline__step av-timeline__step--received">
         <span class="av-timeline__dot"></span>
         <span class="av-timeline__label">Received</span>
         <time class="av-timeline__date">12 Jan 2016</time>
       </li>
       …Accepted…  …Published…
     </ol>
   ========================================================================== */
.article-v2 .av-timeline-card {
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius);
  background: var(--av-bg-subtle);
  padding: 1.1rem 1.25rem 1.25rem;
  margin-bottom: 1.5rem;
}
.article-v2 .av-timeline {
  list-style: none;
  margin: .25rem 0 0;
  padding: 0;
  display: grid;
  /* column count driven by --av-tl-cols (set inline to the actual step count) so 2- or
     3-step articles both lay out; using a var (not an inline grid-template-columns) lets
     the mobile media query below still stack the timeline to a single column. */
  grid-template-columns: repeat(var(--av-tl-cols, 3), 1fr);
  gap: 0;
  position: relative;
}
/* connector line behind the dots */
.article-v2 .av-timeline::before {
  content: "";
  position: absolute;
  top: 7px;
  left: 12.5%;
  right: 12.5%;
  height: 2px;
  background: var(--av-border-strong);
  z-index: 0;
}
.article-v2 .av-timeline__step {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  padding: 0 .25rem;
}
.article-v2 .av-timeline__dot {
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: var(--av-bg);
  border: 3px solid var(--av-tl-received);
  margin-bottom: .55rem;
}
.article-v2 .av-timeline__label {
  font-size: .7rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .05em;
  color: var(--av-ink-muted);
}
.article-v2 .av-timeline__date {
  font-size: .85rem;
  font-weight: 600;
  color: var(--av-ink);
  margin-top: .15rem;
}
/* per-step accent colours */
.article-v2 .av-timeline__step--received .av-timeline__dot { border-color: var(--av-tl-received); }
.article-v2 .av-timeline__step--accepted  .av-timeline__dot { border-color: var(--av-tl-accepted); }
.article-v2 .av-timeline__step--published .av-timeline__dot {
  border-color: var(--av-tl-published);
  background: var(--av-tl-published);
}
.article-v2 .av-timeline__step--published .av-timeline__label { color: var(--av-tl-published); }


/* =============================================================================
   2.5  STATEMENT CARDS
        Funding / Competing Interests / Data Availability / Ethics /
        Acknowledgements
   -----------------------------------------------------------------------------
   Suggested markup:
     <section class="av-statement av-statement--funding">
       <h3 class="av-statement__title"><svg…/> Funding</h3>
       <div class="av-statement__body">…</div>
     </section>
   A type modifier sets the left-accent + icon tint. Defaults are neutral.
   ========================================================================== */
.article-v2 .av-statement {
  position: relative;
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius-sm);
  background: var(--av-bg-subtle);
  padding: .9rem 1.1rem;
  margin: 1rem 0;
  /* Type is conveyed by the title icon tint (below) and a quiet soft wash,
     not a heavy colored slab on one edge. --av-stmt defaults to neutral and
     each modifier overrides it. */
  --av-stmt: var(--av-ack);
}
.article-v2 .av-statement__title {
  display: flex;
  align-items: center;
  gap: .5rem;
  font-size: 1rem;
  font-weight: 700;
  color: var(--av-ink);
  margin: 0 0 .35rem;
  /* QC: type is cued by the tinted icon + soft card wash; the extra title underline
     was a redundant third cue. !important overrides a legacy heading border-bottom that
     otherwise re-draws the underline on these <h3>s. */
  border: 0 !important;
  padding: 0 !important;
  box-shadow: none !important;
}
.article-v2 .av-statement__title svg { width: 18px; height: 18px; flex: none; }
.article-v2 .av-statement__body {
  font-size: .9rem;
  line-height: 1.55;
  color: var(--av-ink-soft);
}
.article-v2 .av-statement__body p:last-child { margin-bottom: 0; }

/* Type modifiers — soft wash + icon tint only (no colored side slab) */
.article-v2 .av-statement--funding   { --av-stmt: var(--av-fund);   background: var(--av-fund-soft); }
.article-v2 .av-statement--funding   .av-statement__title svg { color: var(--av-fund); }
.article-v2 .av-statement--coi       { --av-stmt: var(--av-coi);    background: var(--av-coi-soft); }
.article-v2 .av-statement--coi       .av-statement__title svg { color: var(--av-coi); }
.article-v2 .av-statement--data      { --av-stmt: var(--av-data);   background: var(--av-data-soft); }
.article-v2 .av-statement--data      .av-statement__title svg { color: var(--av-data); }
.article-v2 .av-statement--ethics    { --av-stmt: var(--av-ethics); background: var(--av-ethics-soft); }
.article-v2 .av-statement--ethics    .av-statement__title svg { color: var(--av-ethics); }
.article-v2 .av-statement--ack       { --av-stmt: var(--av-ack);    background: var(--av-ack-soft); }
.article-v2 .av-statement--ack       .av-statement__title svg { color: var(--av-ack); }


/* =============================================================================
   1.7  TABLE POLISH  —  zebra rows, sticky header, responsive horizontal scroll
   -----------------------------------------------------------------------------
   Wrap each table:  <div class="av-table-wrap"><table class="table">…</table></div>
   The wrap provides the responsive scroll; the table styles add zebra + sticky
   header. Scoped so it does not override Bootstrap's .table elsewhere.
   ========================================================================== */
.article-v2 .av-table-wrap {
  width: 100%;
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius-sm);
  margin: 1.25rem 0;
  /* subtle shadow hint that content scrolls horizontally */
  background:
    linear-gradient(90deg, var(--av-bg) 30%, rgba(255,255,255,0)) left / 24px 100% no-repeat,
    linear-gradient(270deg, var(--av-bg) 30%, rgba(255,255,255,0)) right / 24px 100% no-repeat,
    radial-gradient(farthest-side at 0 50%, rgba(16,32,44,.12), transparent) left / 12px 100% no-repeat,
    radial-gradient(farthest-side at 100% 50%, rgba(16,32,44,.12), transparent) right / 12px 100% no-repeat;
  background-attachment: local, local, scroll, scroll;
}
.article-v2 .av-table-wrap table,
.article-v2 .av-main table.table {
  width: 100%;
  margin: 0;
  border-collapse: separate;
  border-spacing: 0;
  font-size: .875rem;
  color: var(--av-ink);
}
.article-v2 .av-table-wrap th,
.article-v2 .av-main table.table th,
.article-v2 .av-table-wrap td,
.article-v2 .av-main table.table td {
  padding: .55rem .75rem;
  border-bottom: 1px solid var(--av-border);
  vertical-align: top;
  text-align: left;
}
/* Sticky header — stays put while the table body scrolls within the wrap */
.article-v2 .av-table-wrap thead th,
.article-v2 .av-main table.table thead th {
  position: sticky;
  top: 0;
  z-index: 2;
  background: var(--av-accent-soft);
  color: var(--av-ink);
  font-weight: 700;
  border-bottom: 2px solid var(--av-accent-soft-2);
  white-space: nowrap;
}
/* Zebra rows */
.article-v2 .av-table-wrap tbody tr:nth-child(odd) td,
.article-v2 .av-main table.table tbody tr:nth-child(odd) td {
  background: var(--av-bg-sunken);
}
.article-v2 .av-table-wrap tbody tr:hover td,
.article-v2 .av-main table.table tbody tr:hover td {
  background: var(--av-accent-soft);
}


/* =============================================================================
   4.6  FIGURE LIGHTBOX AFFORDANCES
   -----------------------------------------------------------------------------
   Suggested markup:
     <figure class="av-figure">
       <a class="av-figure__zoom" href="full.jpg" data-lightbox>
         <img src="thumb.jpg" alt="…">
         <span class="av-figure__cue" aria-hidden="true"><svg…/></span>
       </a>
       <figcaption class="figure-caption">Figure 1. …</figcaption>
     </figure>
   ========================================================================== */
.article-v2 .av-figure {
  margin: 1.5rem 0;
  text-align: center;
}
.article-v2 .av-figure__zoom {
  position: relative;
  display: inline-block;
  max-width: 100%;
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius-sm);
  overflow: hidden;
  cursor: zoom-in;
  background: var(--av-bg);
}
.article-v2 .av-figure__zoom img {
  display: block;
  max-width: 100%;
  height: auto;
  transition: transform .3s ease;
}
.article-v2 .av-figure__zoom:hover img { transform: scale(1.02); }
/* magnifier cue badge */
.article-v2 .av-figure__cue {
  position: absolute;
  right: .5rem;
  bottom: .5rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: rgba(16, 32, 44, .72);
  color: #fff;
  opacity: 0;
  transform: translateY(4px);
  transition: opacity .2s ease, transform .2s ease;
}
.article-v2 .av-figure__zoom:hover .av-figure__cue,
.article-v2 .av-figure__zoom:focus-visible .av-figure__cue {
  opacity: 1;
  transform: translateY(0);
}
.article-v2 .av-figure__cue svg { width: 16px; height: 16px; }
.article-v2 .av-figure figcaption,
.article-v2 .av-figure .figure-caption {
  margin-top: .6rem;
  text-align: left;
}


/* =============================================================================
   4.4  METRICS STAT CARD  —  Views / Downloads / Citations
   ========================================================================== */
.article-v2 .av-metrics {
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius);
  background: var(--av-bg);
  box-shadow: var(--av-shadow-sm);
  padding: 1rem 1.1rem;
}
.article-v2 .av-metrics__title {
  font-size: .72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--av-ink-muted);
  margin: 0 0 .75rem;
}
.article-v2 .av-metrics__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(72px, 1fr));
  gap: .5rem;
}
.article-v2 .av-metric {
  text-align: center;
  padding: .5rem .25rem;
  border-radius: var(--av-radius-sm);
  background: var(--av-bg-subtle);
}
.article-v2 .av-metric__value {
  display: block;
  font-size: 1.4rem;
  font-weight: 700;
  line-height: 1.1;
  color: var(--av-accent-hover);
  font-variant-numeric: tabular-nums;
}
.article-v2 .av-metric__label {
  display: block;
  font-size: .7rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .03em;
  color: var(--av-ink-muted);
  margin-top: .2rem;
}


/* =============================================================================
   4.5  QUIET JOURNAL CTA CARD  —  "Submit to this journal" (low-key)
   ========================================================================== */
.article-v2 .av-cta {
  border: 1px solid var(--av-accent-soft-2);
  border-radius: var(--av-radius);
  background: linear-gradient(180deg, var(--av-accent-soft), var(--av-bg));
  padding: 1.1rem 1.2rem;
  text-align: center;
}
.article-v2 .av-cta__title {
  font-size: 1rem;
  font-weight: 700;
  color: var(--av-ink);
  margin: 0 0 .35rem;
}
.article-v2 .av-cta__text {
  font-size: .85rem;
  color: var(--av-ink-soft);
  margin: 0 0 .85rem;
}
.article-v2 .av-cta__btn {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  padding: .5rem 1.1rem;
  font-size: .875rem;
  font-weight: 600;
  color: #fff;
  background: var(--av-accent);
  border: 1px solid var(--av-accent);
  border-radius: var(--av-radius-pill);
  text-decoration: none;
  transition: background-color .15s ease;
}
.article-v2 .av-cta__btn:hover {
  background: var(--av-accent-hover);
  border-color: var(--av-accent-hover);
  color: #fff;
}


/* =============================================================================
   5.1  MOBILE-FIRST
        single column · collapsible TOC drawer · slim sticky bottom action bar
   -----------------------------------------------------------------------------
   The desktop layout above is the wide state. Below the lg breakpoint the
   three-pane grid collapses to one column, the TOC becomes an off-canvas
   drawer, and a slim sticky action bar appears at the bottom.
   ========================================================================== */

/* Drawer trigger + bottom bar are desktop-hidden by default */
.article-v2 .av-toc-toggle,
.article-v2 .av-bottombar,
.article-v2 .av-toc__backdrop {
  display: none;
}

@media (max-width: 991.98px) {
  /* Collapse to a single readable column */
  .article-v2 .av-layout {
    grid-template-columns: 1fr;
    gap: 1.25rem;
    max-width: 760px;
  }
  .article-v2 .av-main { max-width: 100%; }

  /* Tools rail moves inline, below content, not sticky */
  .article-v2 .av-tools {
    position: static;
    max-height: none;
    order: 3;
    flex-direction: column;
  }

  /* ---- TOC becomes an off-canvas drawer ---- */
  .article-v2 .av-toc-toggle {
    display: inline-flex;
    align-items: center;
    gap: .45rem;
    padding: .5rem .9rem;
    font-size: .85rem;
    font-weight: 600;
    color: var(--av-accent-hover);
    background: var(--av-accent-soft);
    border: 1px solid var(--av-accent-soft-2);
    border-radius: var(--av-radius-pill);
    cursor: pointer;
    margin-bottom: 1rem;
  }
  .article-v2 .av-toc {
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    width: min(82vw, 320px);
    max-height: 100vh;
    z-index: 1055;
    background: var(--av-bg);
    border-right: 1px solid var(--av-border);
    box-shadow: var(--av-shadow-lg);
    padding: 1.25rem 1rem;
    transform: translateX(-100%);
    transition: transform .25s ease;
    overflow-y: auto;
  }
  /* open state — JS adds .is-open to .article-v2 (or to .av-toc) */
  .article-v2.av-toc-open .av-toc,
  .article-v2 .av-toc.is-open {
    transform: translateX(0);
  }
  .article-v2.av-toc-open .av-toc__backdrop {
    display: block;
    position: fixed;
    inset: 0;
    z-index: 1050;
    background: rgba(16, 32, 44, .45);
  }

  /* ---- Slim sticky bottom action bar ---- */
  .article-v2 .av-bottombar {
    display: flex;
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1045;
    background: var(--av-bg);
    border-top: 1px solid var(--av-border);
    box-shadow: 0 -2px 10px rgba(16, 32, 44, .08);
    padding: .4rem max(.5rem, env(safe-area-inset-left))
             calc(.4rem + env(safe-area-inset-bottom))
             max(.5rem, env(safe-area-inset-right));
  }
  .article-v2 .av-bottombar__btn {
    flex: 1 1 0;
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2px;
    min-height: 48px;              /* comfortable touch target */
    padding: .25rem;
    font-size: .68rem;
    font-weight: 600;
    color: var(--av-ink-soft);
    background: transparent;
    border: 0;
    text-decoration: none;
    border-radius: var(--av-radius-sm);
  }
  .article-v2 .av-bottombar__btn svg { width: 20px; height: 20px; color: var(--av-accent); }
  .article-v2 .av-bottombar__btn:active { background: var(--av-accent-soft); }

  /* keep the floating back-to-top clear of the bottom bar */
  .article-v2 .av-back-to-top { bottom: calc(56px + 1rem); }

  /* slightly smaller headings on narrow screens */
  .article-v2 h2 { font-size: 1.35rem; }
  .article-v2 h3 { font-size: 1.12rem; }

  /* timeline stacks vertically when very narrow (see below) */
}

@media (max-width: 575.98px) {
  .article-v2 { --av-fs-base: 1.05rem; }   /* keep ~17px floor on phones */

  /* Vertical timeline on the smallest screens */
  .article-v2 .av-timeline {
    grid-template-columns: 1fr;
    gap: 1rem;
  }
  .article-v2 .av-timeline::before {
    top: 8px;
    bottom: 8px;
    left: 7px;
    right: auto;
    width: 2px;
    height: auto;
  }
  .article-v2 .av-timeline__step {
    flex-direction: row;
    align-items: center;
    gap: .65rem;
    text-align: left;
    padding-left: 0;
  }
  .article-v2 .av-timeline__dot { margin-bottom: 0; }

  .article-v2 .av-trust-strip { gap: .4rem; }
  .article-v2 .av-info-card__grid { grid-template-columns: 1fr; gap: .15rem .5rem; }
  .article-v2 .av-info-card__label { padding-top: .5em; }
}


/* =============================================================================
   5.2  WCAG AA  —  visible focus rings · contrast · reduced motion · print
   -----------------------------------------------------------------------------
   Body/secondary text tokens above are all chosen >= 4.5:1 on their bg.
   Here we guarantee keyboard visibility and motion/print safety.
   ========================================================================== */

/* Visible focus ring on every interactive element (keyboard users) */
.article-v2 a:focus-visible,
.article-v2 button:focus-visible,
.article-v2 [tabindex]:focus-visible,
.article-v2 .nav-link:focus-visible,
.article-v2 .av-tool:focus-visible,
.article-v2 .av-chip:focus-visible,
.article-v2 .av-figure__zoom:focus-visible,
.article-v2 .av-cta__btn:focus-visible,
.article-v2 .av-bottombar__btn:focus-visible,
.article-v2 .av-toc-toggle:focus-visible,
.article-v2 .av-back-to-top:focus-visible {
  outline: 3px solid var(--av-accent);
  outline-offset: 2px;
  border-radius: var(--av-radius-sm);
}
/* Fallback for browsers without :focus-visible */
.article-v2 a:focus,
.article-v2 button:focus { outline-color: var(--av-accent); }

/* Skip-link (suggested first child of .article-v2) */
.article-v2 .av-skip-link {
  position: absolute;
  left: -999px;
  top: 0;
  z-index: 1100;
  padding: .6rem 1rem;
  background: var(--av-bg);
  color: var(--av-accent-hover);
  border: 2px solid var(--av-accent);
  border-radius: var(--av-radius-sm);
  font-weight: 600;
}
.article-v2 .av-skip-link:focus {
  left: 1rem;
  top: calc(var(--av-progress-h) + .5rem);
}

/* Screen-reader-only utility (scoped) */
.article-v2 .av-visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  overflow: hidden;
  white-space: nowrap;
}

/* Honour reduced-motion: kill transforms/animations/smooth-scroll */
@media (prefers-reduced-motion: reduce) {
  .article-v2 * {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
  .article-v2 .av-figure__zoom:hover img { transform: none; }
}

/* High-contrast / forced-colors: keep accents from disappearing */
@media (forced-colors: active) {
  .article-v2 .av-chip,
  .article-v2 .av-statement,
  .article-v2 .av-info-card,
  .article-v2 .av-table-wrap { border: 1px solid CanvasText; }
  .article-v2 .av-toc .nav-link.active,
  .article-v2 .av-toc a.active { border-left-color: Highlight; }
}

/* Print: drop chrome, expand content, show DOI/link URLs */
@media print {
  .article-v2 .av-progress,
  .article-v2 .av-back-to-top,
  .article-v2 .av-bottombar,
  .article-v2 .av-toc,
  .article-v2 .av-toc-toggle,
  .article-v2 .av-tools,
  .article-v2 .av-cta { display: none !important; }
  .article-v2 .av-layout { display: block; max-width: none; padding: 0; }
  .article-v2 .av-main { max-width: none; }
  .article-v2 .av-table-wrap { overflow: visible; box-shadow: none; }
  .article-v2 a[href^="http"]::after {
    content: " (" attr(href) ")";
    font-size: .8em;
    color: #444;
    word-break: break-all;
  }
}

/* =============================================================================
   3.1  STICKY SIDE RAILS (desktop) + 3.3 BREADCRUMB + 4.3 TOOLS RAIL + 4.5 CTA
   The page already renders a 3-column row (col-md-3 scrollspy nav | col-md-6 article
   | col-md-3 sidebar). Rather than restructure, we make the side rails sticky on wide
   screens. Mobile keeps the stacked single-column flow.
   ========================================================================== */
@media (min-width: 992px) {
  .article-v2 #v-pills-tab {
    position: sticky;
    top: 100px;
    max-height: calc(100vh - 108px);
    overflow-y: auto;
    overscroll-behavior: contain;
    align-self: flex-start;
    scrollbar-width: thin;
  }
  /* NOT sticky: a 420px+ tools rail as the FIRST of ~10 sidebar widgets pins and
     both OVERLAPS and HIDES the widgets below it — the Archives "Volume" dropdowns
     bled over Cite/Print in the live page. It scrolls with the page instead; the
     left TOC stays sticky for navigation and the mobile bottom bar covers quick
     tool access. */
  .article-v2 .av-tools-rail {
    position: static !important;
    top: auto !important;
  }
}
/* Breadcrumb (3.3) */
.article-v2 .av-breadcrumb {
  font-size: .8rem;
  color: var(--av-ink-muted);
  margin: 0 0 .6rem;
  line-height: 1.4;
}
.article-v2 .av-breadcrumb ol {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; align-items: center; gap: .15rem .4rem;
}
.article-v2 .av-breadcrumb li { display: inline-flex; align-items: center; gap: .4rem; }
.article-v2 .av-breadcrumb li + li::before { content: "\203A"; color: var(--av-ink-muted); opacity: .7; }
.article-v2 .av-breadcrumb a { color: var(--av-accent-hover); text-decoration: none; }
.article-v2 .av-breadcrumb a:hover { text-decoration: underline; }
.article-v2 .av-breadcrumb [aria-current="page"] { color: var(--av-ink-muted); }
/* Article-tools rail (4.3) */
.article-v2 .av-tool {
  display: flex; align-items: center; gap: .6rem;
  padding: .55rem .8rem;
  margin-bottom: .4rem;
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius-sm);
  background: var(--av-bg);
  color: var(--av-ink);
  font-size: .85rem; font-weight: 600;
  text-decoration: none; cursor: pointer; width: 100%; text-align: left;
}
.article-v2 .av-tool:hover { background: var(--av-accent-soft); border-color: var(--av-accent-soft-2); color: var(--av-accent-hover); }
.article-v2 .av-tool .fa { width: 16px; text-align: center; color: var(--av-accent-hover); }
.article-v2 .av-tool--share { color: var(--av-ink-soft); }
.article-v2 .av-tools-rail__share { display: flex; gap: .4rem; padding: .25rem .1rem 0; }
.article-v2 .av-tools-rail__share a { color: var(--av-ink-muted); font-size: 1.1rem; }
.article-v2 .av-tools-rail__share a:hover { color: var(--av-accent-hover); }
/* Journal CTA card (4.5) */
.article-v2 .av-cta { }
.article-v2 .av-cta .av-tool { font-weight: 600; }

/* =============================================================================
   GAP-CLOSE: 4.4 metrics stat card · 4.6 figure download + table viewer · 4.3 share row
   ========================================================================== */
/* 4.4 Metrics as a compact stat card */
.article-v2 .av-metrics-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: .5rem;
}
.article-v2 .av-stat {
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius-sm);
  background: var(--av-bg-subtle);
  padding: .55rem .6rem;
  text-align: center;
}
.article-v2 .av-stat__num {
  display: block;
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--av-ink);
  font-variant-numeric: tabular-nums;
  line-height: 1.1;
}
.article-v2 .av-stat__label {
  display: block;
  font-size: .68rem;
  text-transform: uppercase;
  letter-spacing: .03em;
  color: var(--av-ink-muted);
  margin-top: 2px;
}
.article-v2 .av-stat .fa { color: var(--av-accent-hover); margin-right: 3px; }

/* 4.6 Figure download affordance */
.article-v2 .av-fig-tools { margin: 4px 0 2px; font-size: .8rem; }
.article-v2 .av-fig-tools a { color: var(--av-accent-hover); text-decoration: none; }
.article-v2 .av-fig-tools a:hover { text-decoration: underline; }
.article-v2 .av-fig-tools .fa { margin-right: 4px; }

/* 4.6 Table viewer: tools bar + full-screen overlay */
.article-v2 .av-table-tools { display: flex; justify-content: flex-end; gap: .75rem; margin: 0 0 4px; font-size: .8rem; }
.article-v2 .av-table-tools button,
.article-v2 .av-table-tools a {
  border: none; background: transparent; cursor: pointer;
  color: var(--av-accent-hover); font: inherit; padding: 0; text-decoration: none;
}
.article-v2 .av-table-tools button:hover,
.article-v2 .av-table-tools a:hover { text-decoration: underline; }
.article-v2 .av-table-wrap.av-table-full {
  position: fixed; inset: 0; z-index: 2147483400;
  max-height: 100vh; margin: 0; border-radius: 0;
  background: var(--av-bg); padding: 48px 16px 16px; overflow: auto;
}
.article-v2 .av-table-full__close {
  position: fixed; top: 10px; right: 16px; z-index: 2147483401;
  border: 1px solid var(--av-border); background: var(--av-bg);
  border-radius: var(--av-radius-sm); padding: 4px 12px; cursor: pointer; font: inherit;
}
.article-v2 .av-table-full__close[hidden] { display: none; }

/* 4.3 Share row inside the tools rail */
.article-v2 .av-share-row { display: flex; align-items: center; gap: .5rem; padding: .35rem .2rem .1rem; }
.article-v2 .av-share-row__label { font-size: .78rem; font-weight: 600; color: var(--av-ink-muted); }
.article-v2 .av-share-row a { color: var(--av-ink-muted); font-size: 1.05rem; line-height: 1; }
.article-v2 .av-share-row a:hover { color: var(--av-accent-hover); }


/* =============================================================================
   CLEAN-ACADEMIC REFACTOR  —  2026-06-27  (canary 391 only)
   -----------------------------------------------------------------------------
   Client rejected the prior look & feel ("too many colors / sizes / widgets,
   reads junior"). This block re-tunes the whole v2 layer to a restrained
   Frontiers/MDPI system: ONE brand accent (matched to the site masthead),
   dark headings, a tight 6-step type scale, flat hairline-bordered cards, and
   NO multi-color "rainbow" chrome. Appended last so it wins on order, and every
   heading/prose rule is specificity-bumped (.av-main / element class) to beat
   the legacy theme (main_site_2020.css + an inline <style>) which otherwise
   shrinks the H1 title to 22px and paints all headings blue. Everything stays
   scoped under .article-v2 → affects ONLY article 391. Fully reversible.
   ========================================================================== */

/* ---- (a) Re-tuned tokens: align accent to the site brand; flatten shadows --- */
.article-v2 {
  --av-accent:        #00639f;   /* match the site masthead blue (was #007BFF) */
  --av-accent-rgb:    0, 99, 159;
  --av-accent-hover:  #024c79;   /* darker — ~7:1 on white */
  --av-accent-soft:   #eaf2f8;   /* cool, quiet tint */
  --av-accent-soft-2: #cfe1ee;
  --av-ink:           #1a242e;   /* warm near-black for prose + headings */
  --av-ink-soft:      #3c4855;
  /* clean-academic cards read off hairline borders, not shadows */
  --av-shadow-sm:     none;
  /* one neutral timeline treatment — kills the green/amber/teal rainbow */
  --av-tl-received:   #aeb8c2;
  --av-tl-accepted:   #aeb8c2;
  --av-tl-published:  #00639f;
  /* Statement-card icons are <i class="fa" style="color:var(--av-coi|fund|data…)">.
     Redefining the semantic vars neutralises every icon to one quiet gray through
     the inline-style var reference — no !important needed. */
  --av-coi:    #5d6b78;
  --av-fund:   #5d6b78;
  --av-data:   #5d6b78;
  --av-ethics: #5d6b78;
  --av-ack:    #5d6b78;
}

/* ---- (b) Typography: restore hierarchy + tight scale (out-specify legacy) --- */
/* Title = the single largest element on the page (legacy forced it to 22px). */
.article-v2 .av-main h1.article-title,
.article-v2 #container h1.article-title,
.article-v2 h1.article-title,
.article-v2 .av-main .av-title {
  font-family: var(--av-font-sans);
  font-size: clamp(1.7rem, 1.25rem + 1.7vw, 2rem);  /* ~28–32px */
  line-height: 1.22;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--av-ink);
  margin: 0 0 .55rem;
}
/* Section headings — dark, 22px, quiet rule. :not(.card-title) leaves the
   info-card heading alone. */
.article-v2 .av-main h2:not(.card-title),
.article-v2 #container h2:not(.card-title) {
  font-size: 1.375rem;          /* 22px — below the title */
  line-height: 1.3;
  font-weight: 700;
  color: var(--av-ink);
  margin: 2rem 0 .6rem;
  padding-bottom: .3rem;
  border-bottom: 1px solid var(--av-border);
}
.article-v2 .av-main h3:not(.av-statement__title),
.article-v2 #container h3:not(.av-statement__title) {
  font-size: 1.125rem;          /* 18px */
  line-height: 1.4;
  font-weight: 600;
  color: var(--av-ink-soft);
  margin: 1.5rem 0 .4rem;
}
/* Prose: warm near-black; calm the teal author-affiliation lines to muted ink. */
.article-v2 .av-main .content > p,
.article-v2 .av-main .content li,
.article-v2 .av-main .article_text { color: var(--av-ink); }
.article-v2 #affiliations p,
.article-v2 .author_affil p,
.article-v2 p.author_affiliation { color: var(--av-ink-muted); }

/* ---- (c) Trust strip: ONE neutral chip style (no blue / green variants) ----- */
.article-v2 .av-chip,
.article-v2 .av-chip--oa,
.article-v2 .av-chip--peer,
.article-v2 .av-chip--cc {
  color: var(--av-ink-soft);
  background: var(--av-bg-subtle);
  border: 1px solid var(--av-border);
}
.article-v2 .av-chip svg { color: var(--av-accent); }   /* icon is the only accent */

/* ---- (d) Statement cards: uniform, quiet, single hairline left accent ------- */
.article-v2 .av-statement,
.article-v2 .av-statement--funding,
.article-v2 .av-statement--coi,
.article-v2 .av-statement--data,
.article-v2 .av-statement--ethics,
.article-v2 .av-statement--ack {
  background: var(--av-bg-subtle);
  border: 1px solid var(--av-border);   /* flat uniform box — no colored side-tab */
}
.article-v2 .av-statement--funding .av-statement__title svg,
.article-v2 .av-statement--coi     .av-statement__title svg,
.article-v2 .av-statement--data    .av-statement__title svg,
.article-v2 .av-statement--ethics  .av-statement__title svg,
.article-v2 .av-statement--ack     .av-statement__title svg { color: var(--av-ink-muted); }

/* ---- (e) Flat cards: borders, not shadows --------------------------------- */
.article-v2 .av-info-card,
.article-v2 .av-metrics,
.article-v2 .av-main .card { box-shadow: none; }

/* ---- (f) Timeline: neutral dots, accent only on "Published" ---------------- */
.article-v2 .av-timeline__step--published .av-timeline__label { color: var(--av-accent); }

/* ---- (g) Journal CTA: flat quiet card (drop the blue gradient) ------------- */
.article-v2 .av-cta {
  background: var(--av-bg-subtle);
  border: 1px solid var(--av-border);
}

/* ---- (h) Unify the legacy right sidebar into ONE consistent card system ----
   Right column = <aside class="col-md-3 content">. Each widget is
   <div class="widget …"><h4>Title</h4><div class="row">…</div></div>.
   Legacy paints the <h4> as a solid-blue full-bleed bar; here every widget
   becomes a flat bordered card with a quiet underlined text header so the
   stack reads as one intentional system instead of a pile. --------------- */
.article-v2 .col-md-3.content .widget {
  background: var(--av-bg);
  border: 1px solid var(--av-border);
  border-radius: var(--av-radius);
  padding: .35rem 1rem 1rem;
  margin-bottom: 1rem;
  font-size: .875rem;
}
.article-v2 .col-md-3.content .widget > h4 {
  font-size: 1rem;
  font-weight: 700;
  color: var(--av-ink);
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--av-border);
  border-radius: 0;
  margin: 0 -1rem .75rem;
  padding: .65rem 1rem .55rem;
  letter-spacing: 0;
  text-transform: none;
  line-height: 1.3;
}

/* ---- (i) De-dupe: hide the redundant small "Share" row; keep the one
   "Share this page" widget below it. -------------------------------------- */
.article-v2 .av-share-row { display: none; }

/* ---- (j) Beat legacy !important heading colors --------------------------------
   main_site_2020.css / sample.css force H1 & H2 to brand-blue and the sidebar
   <h4> to WHITE — all with !important. Without the white override the unified
   widget headers render invisible on the now-transparent card. Scoped !important
   is the only thing that can win here; it stays under .article-v2 (canary 391). */
.article-v2 .av-main h1.article-title,
.article-v2 #container h1.article-title { color: var(--av-ink) !important; }
.article-v2 .av-main h2:not(.card-title),
.article-v2 #container h2:not(.card-title) { color: var(--av-ink) !important; }
.article-v2 .av-main h3:not(.av-statement__title),
.article-v2 #container h3:not(.av-statement__title) { color: var(--av-ink-soft) !important; }
.article-v2 .col-md-3.content .widget > h4 { color: var(--av-ink) !important; }

/* ---- (k) TIGHTEN VERTICAL RHYTHM — kill the "extra space after each paragraph"
   (reported repeatedly). Root causes: legacy `h3.article_heading` carries
   margin:24px 0 36px, so abstract sub-sections (Objective/Method/Results/
   Conclusion) and section headings float far from their text; paragraph gaps
   were ~1.05em; and legacy leaves phantom empty <p></p> after tables/figures.
   !important is needed to beat the legacy heading margins. ------------------- */
.article-v2 .av-main h2:not(.card-title),
.article-v2 #container h2:not(.card-title) { margin: 1.5rem 0 .5rem !important; }
.article-v2 .av-main h3:not(.av-statement__title),
.article-v2 #container h3:not(.av-statement__title) { margin: 1.05rem 0 .3rem !important; }
.article-v2 .av-main h4,
.article-v2 #container .av-main h4 { margin: .9rem 0 .25rem !important; }
.article-v2 .av-main p,
.article-v2 .av-main .content > p,
.article-v2 .av-main .content li,
.article-v2 #container .content > p { margin-bottom: .8em !important; }
/* collapse phantom empty paragraphs (NOT empty divs — some are #idm scroll anchors) */
.article-v2 .av-main p:empty,
.article-v2 #container p:empty { display: none !important; }
/* trim the wrapper-div gap between abstract sub-sections */
.article-v2 .av-main .content.article_text_small { margin-bottom: .35rem; }

/* ---- (l) RESPONSIVE — stack the 3-pane layout below lg ----------------------
   The page uses Bootstrap `.col-md-*`, so the 3 columns stayed side-by-side from
   768–991px, squeezing the title into a ~150px column and overflowing the
   viewport by ~45px (sidebar metrics cards). The sticky 3-pane is desktop-only
   (>=992). Below that: ONE readable column. The inline left TOC is hidden because
   the sticky bottom bar's "Contents" button opens a drawer with the same links. */
@media (max-width: 991.98px) {
  .article-v2 .blog-item.col-md-3,
  .article-v2 .col-md-6,
  .article-v2 .col-md-3.content {
    flex: 0 0 100% !important;
    max-width: 100% !important;
    width: 100% !important;
    float: none !important;
  }
  /* TOC-hide moved to @media(max-width:768px) in block (u) — audit fix [3]:
     hiding it at <=991.98 created a 769-991px dead zone with NO in-page nav (the
     JS bottom bar/drawer only appear <=768px). The inline TOC now survives 769-991. */
  .article-v2 .col-md-3.content { margin-top: 1.75rem !important; }
  /* keep any wide media inside the column from re-introducing overflow */
  .article-v2 .av-main img,
  .article-v2 .av-main table { max-width: 100%; }
}

/* ---- (m) DE-NEST sidebar cards (impeccable: "nested cards are always wrong").
   The Article-Tools actions and the metrics cells were bordered mini-cards sitting
   inside their widget card. Flatten them to clean rows / cells separated by space,
   not boxes-within-boxes. --------------------------------------------------- */
.article-v2 .av-tool {
  border: 0;
  background: transparent;
  margin-bottom: .05rem;
  padding: .5rem .55rem;
}
.article-v2 .av-tool:hover {
  background: var(--av-accent-soft);
  border-color: transparent;
}
.article-v2 .av-metrics-grid { gap: .35rem .9rem; }
.article-v2 .av-stat {
  border: 0;
  background: transparent;
  padding: .3rem .25rem;
}
/* separate the two stat rows with a hairline, not 4 boxes */
.article-v2 .av-metrics-grid .av-stat:nth-child(n+3) { border-top: 1px solid var(--av-border); padding-top: .5rem; }

/* ---- (r) Altmetric: article 391's DOI 404s at api.altmetric.com (no mentions),
   yet the embed still renders an empty "Altmetric stats" card. Hide it for this
   canary. The data-driven reveal script in page_v2.xsl is unchanged, so any future
   rollout where a DOI DOES have data still works; !important also beats the
   script's display:'' so an empty card can never flash in. */
.article-v2 .oap-altmetric-widget { display: none !important; }

/* ---- (t) MOBILE LINK SPACING (client #1: "more space for hyperlinked content").
   main_site_2020.css (GLOBAL) turns EVERY <a> into a 44px touch target under
   @media(max-width:991px) — `a`, `p a`, `li a`, `.card a` all get min-height:44px
   + padding:12px 16px + display:inline-flex. That wrecks INLINE text links inside
   the article: the corresponding-author email rendered 69px tall, cited-by links
   114-136px, breadcrumb items 46px. We can't edit the global file (production), so
   OVERRIDE for 391: reset inline/text links in the reading column, breadcrumb and
   sidebar text lists back to normal inline flow. Genuine tap targets — the
   off-canvas drawer links, the sticky bottom action bar, and the .av-tool rail
   buttons — are NOT in these scopes and keep their 44px sizing. !important beats
   the legacy a:not(...)(0,3,1) rule. Scoped to .article-v2 → article 391 only. */
@media (max-width: 991px) {
  /* reading column (#container = .av-main) — every link here is inline text
     (refs, cited-by, DOI, citation exports, breadcrumb). The id (1,1,1) outranks
     the legacy `a:not(...)` (0,3,1) !important rule. */
  .article-v2 #container a {
    display: inline !important;
    min-height: 0 !important;
    padding: 0 !important;
    align-items: initial !important;
  }
  /* sidebar TEXT links (keyword chips, More-journals, Archives, Bibliography).
     EXCLUDE the tools-rail widget (its Share icons stay 44px tap targets) and the
     .av-tool action buttons (CTA). (0,5,1) beats the legacy rule. */
  .article-v2 .col-md-3.content .widget:not(.av-tools-rail) a:not(.av-tool) {
    display: inline !important;
    min-height: 0 !important;
    padding: 0 !important;
    align-items: initial !important;
  }
}

/* ============================================================================
   (u) MOBILE AUDIT FIXES — multi-agent responsive audit (2026-06-27).
   Each overrides a legacy main_site_2020.css @media(max-width:991px) rule;
   all scoped under .article-v2 → article 391 only. P1 first, then P2.
   ========================================================================== */

/* [1] P1 — Table "View full screen" was capped at 400px: the table-wrap carries
   an inline style="max-height:400px" that beat the no-!important fullscreen rule,
   so the overlay covered only the top 400px. Only bites while .av-table-full is on. */
.article-v2 .av-table-wrap.av-table-full {
  max-height: 100vh !important;
  height: 100vh;
  overflow: auto !important;
}

/* [6] P2 — long bare DOI URL in the Article-Information card could overflow at 320px. */
.article-v2 #container #citation,
.article-v2 .av-main .av-info-card__value,
.article-v2 .av-main .article_text_small {
  overflow-wrap: anywhere;
  word-break: break-word;
}

@media (max-width: 768px) {
  /* [3] P1 — hide the inline TOC only here (the JS bottom bar/drawer take over
     <=768px). 769-991px now keeps the TOC stacked full-width (was a no-nav dead zone). */
  .article-v2 .blog-item.col-md-3 { display: none !important; }
}

@media (max-width: 991.98px) {
  /* [2] P1 — sidebar action buttons (.av-tool) were centred + run-together by the
     legacy a:not(){justify-content:center!important} rule. Restore left-aligned
     icon+label rows; keep the 44px tap target. (0,4,1)+!important beats (0,3,1). */
  .article-v2 .col-md-3.content .widget a.av-tool,
  .article-v2 .col-md-3.content .widget button.av-tool {
    display: flex !important;
    width: 100% !important;
    min-height: 44px;
    justify-content: flex-start !important;
    align-items: center !important;
    text-align: left !important;
    gap: .6rem;
    padding: .6rem .7rem !important;
  }
  .article-v2 .col-md-3.content .widget .av-tool .fa { width: 16px; text-align: center; flex: none; }

  /* [7] P2 — legacy p{font-size:16px!important} dropped body prose below the
     intended base; restore var(--av-fs-base). References (li.article_text) stay 14px. */
  .article-v2 #container .content > p,
  .article-v2 #container .content > div > p,
  .article-v2 #container .content li:not(.article_text) {
    font-size: var(--av-fs-base) !important;
    line-height: 1.6 !important;
  }
  /* [5] P2 — breadcrumb links were inflated to 16px; restore the 13px subordinate size. */
  .article-v2 #container nav.av-breadcrumb a { font-size: .8125rem !important; }
  /* [4] P2 — reference provider links (PubMed / Europe PMC / …) inflated to 16px; restore ~11.5px. */
  .article-v2 #container .oap-ref-inline a { font-size: .72rem !important; }
  .article-v2 #container .oap-ref-inline a .fa { font-size: .9em !important; }
}

/* ---- (v) MOBILE SIDEBAR ORDER — when the sidebar stacks under the article, lift
   the article-specific Article Tools + Metrics above the journal/site widgets
   (Bibliography, Archives, More journals, etc.). Flex `order`; desktop (>=992)
   keeps DOM order. :has() degrades gracefully (Metrics just stays in place) on the
   rare engine without it. Scoped to .article-v2 → article 391 only. */
@media (max-width: 991.98px) {
  .article-v2 .col-md-3.content { display: flex; flex-direction: column; }
  .article-v2 .col-md-3.content > .av-tools-rail { order: -2; }
  .article-v2 .col-md-3.content > .widget:has(.av-metrics-grid) { order: -1; }
}

/* ---- (n) Calm the Article-Information panel. Legacy `.card-body` was a loud
   pale-blue (#D9F1FF) wash that also forced a card-in-card (white info card on a
   blue panel). Neutralise the panel to white and de-nest the metadata grid so the
   whole block reads as ONE clean bordered card. ----------------------------- */
.article-v2 .av-main .card-body { background: var(--av-bg) !important; }
.article-v2 .av-info-card {
  border: 0;
  box-shadow: none;
  background: transparent;
  padding: 0;
}

/* ---- (o) BODY SUB-SECTION SPACING (the "too much gap, 5th report" — it is CSS,
   not the XML). Legacy `.content.article_text_small` carries padding:10px 0 and
   `.article_heading` carries padding:5px 0; stacked with heading margins + double
   bottom-margins they made ~58px gaps between sub-sections. Strip the padding and
   the redundant wrapper margin, tighten heading margins. ------------------- */
.article-v2 .av-main .content.article_text_small {
  padding-top: 0 !important;
  padding-bottom: 0 !important;
  margin-bottom: 0 !important;
}
.article-v2 .av-main h2.article_heading,
.article-v2 .av-main h3.article_heading {
  padding-top: 0 !important;
  padding-bottom: 0 !important;
}
.article-v2 .av-main h2.article_heading:not(.card-title) { margin: 1.1rem 0 .35rem !important; }
.article-v2 .av-main h3.article_heading:not(.av-statement__title) { margin: 1rem 0 .3rem !important; }

/* ---- (p) KEYWORDS chips — were heavy dark-gray (#6c757d) blocks of uneven width
   ("placed very worst"). Make them subtle, uniform tags that wrap cleanly. ---- */
.article-v2 .col-md-3.content .widget .badge {
  background: var(--av-accent-soft) !important;
  color: var(--av-accent-hover) !important;
  border: 1px solid var(--av-accent-soft-2);
  font-weight: 600;
  font-size: .78rem;
  line-height: 1.35;
  padding: .25rem .6rem !important;
  border-radius: var(--av-radius-pill);
  white-space: normal;
  max-width: 100%;
  margin: 0 .3rem .4rem 0;
  display: inline-block;
}

/* ---- (q) LEFT TOC NAV — the selected tab got Bootstrap's heavy SOLID-BLUE pill,
   flush to the edge and clipped at the top when the nav is sticky ("missing
   padding"). Tame it to a quiet accent tint + left indicator, add padding so
   nothing clips, and stop the active border being cut by overflow. --------- */
.article-v2 #v-pills-tab { overflow-x: visible; padding: 6px 0 6px 2px; }
.article-v2 #v-pills-tab .nav-link {
  padding: .4rem .7rem;
  margin-bottom: 1px;
  border-left: 2px solid transparent;
  border-radius: 0 var(--av-radius-sm) var(--av-radius-sm) 0;
  color: var(--av-ink-soft);
}
.article-v2 #v-pills-tab .nav-link:hover {
  background: var(--av-accent-soft);
  color: var(--av-accent-hover);
}
.article-v2 #v-pills-tab .nav-link.active,
.article-v2 #v-pills-tab .nav-link.is-current {
  background: var(--av-accent-soft) !important;
  color: var(--av-accent-hover) !important;
  border-left-color: var(--av-accent);
  font-weight: 600;
}

/* ##########################################################################
   391 BUGFIX BATCH (2026-06-29) — clusters re-applied cleanly after CSS restore
   Order per reconcile STEP5: C,E,F,G,H,B,D,A,I
   ########################################################################## */


/* ===== cluster C | bugs [4, 10] ===== */
/* ============================================================================
   (cluster C — Share section) Bugs #4 + #10
   Heading text (#4) is renamed in page_v2.xsl (static template text).
   #10: the visible "Share this page" widget (.social-sidebar > .social) renders
   each network as an SVG with a filled square background (path:first-child,
   inline fill="#007BFF"; legacy main_site_2020.css:3085 recolors it to #00639f)
   and a white glyph (the other path, inline fill="white"). Client wants plain,
   borderless, brand-colored glyphs sitting on the white space: make the bg
   square transparent and paint the glyph in --av-accent. SVG presentation
   attributes (fill="...") are the LOWEST-priority source, so any CSS `fill`
   wins — no !important needed for the glyph; the bg uses !important only to
   beat the legacy `.social-sidebar svg path:first-child{fill:#00639f}` rule.
   Scoped under .article-v2 → article 391 canary only. -------------------------- */
.article-v2 .social-sidebar .social svg path:first-child {
  fill: transparent !important;   /* kill the blue/brand square block */
}
.article-v2 .social-sidebar .social svg path {
  fill: var(--av-accent);         /* brand-colored glyph on the white space */
  transition: fill .15s ease;
}
.article-v2 .social-sidebar .social a {
  display: inline-block;
  line-height: 0;                 /* no box chrome around the glyph */
}
.article-v2 .social-sidebar .social a:hover svg path {
  fill: var(--av-accent-hover);   /* darker brand on hover */
}
/* keep the now-square-free glyphs comfortably sized & lift the legacy 36px cap */
.article-v2 .social-sidebar .social svg {
  width: 34px;
  height: auto;
  overflow: visible;
}


/* ===== cluster E | bugs [15] ===== */
/* =============================================================================
   BUG #15 (cluster E)  —  Figure caption spacing
   Rendered fig markup is a flat paragraph:
     <p><b>LABEL</b><small>TITLE</small><br><a class="fancybox-thumb"><img class="img_padding"></a>...</p>
   The XSLT serializer collapses the literal space between </b> and <small>, so
   the label ("Figure 5.") is glued to the title; and the title sits flush against
   the image. Target ONLY the figure caption <p> (data-driven: a <p> that directly
   contains <b> + <small> AND holds the figure image img.img_padding). Table
   captions also use <b><small> but are not wrapped in a <p>, so they are excluded.
   id-boost (#container) raises specificity to beat legacy main_site_2020.css.
   ========================================================================== */
.article-v2 #container p:has(> b + small):has(.img_padding) > b + small {
  margin-left: .35em;        /* gap after the "Figure N." label */
}
.article-v2 #container p:has(> b + small):has(.img_padding) > a.fancybox-thumb {
  display: inline-block;
  margin-top: .75rem;        /* vertical breathing room between caption title and image */
}


/* ===== cluster F | bugs [17, 18, 20] ===== */
/* =============================================================================
   CLUSTER F — FONT-FAMILY CONSISTENCY  (bugs #17, #18, #20)  — canary 391 only
   -----------------------------------------------------------------------------
   Global legacy theme injects `body{font-family:reboto !important}` (a misspelt,
   non-existent webfont) which !important-beats the v2 root font and forces every
   un-pinned descendant to the UA fallback. We re-assert the article body font
   (--av-font-sans, the system-ui sans stack already used by .av-main) on the
   sections that read in a different face, and tidy the Article-Information
   label/value spacing.

   NOTE on scope: the Publisher's-Note and "Article Details & Related Research"
   blocks (.oap-publisher-note / .oap-article-context) render OUTSIDE the
   .article-v2 wrapper (they are siblings, emitted by PHP views), so they cannot
   be reached by an .article-v2-scoped selector. They are targeted by their
   .oap-* class names instead. This is safe: article_v2.css is loaded ONLY on the
   v2 canary route, so these rules affect article 391 only and never leak to
   other articles. Appended last so it wins on cascade order.
   ========================================================================== */

/* ---- #17 + #18 : reading column, References, Article-Information --------------
   Pin the article body font onto the whole reading column and explicitly onto
   References + Article-Information so they stop inheriting the broken `reboto`
   fallback. !important is required only because legacy sets it via body{}. The id
   (#container) keeps specificity high enough to win in the reading column. */
.article-v2 #container.av-main,
.article-v2 #container.av-main p,
.article-v2 #container.av-main li,
.article-v2 #container.av-main div,
.article-v2 #container.av-main td,
.article-v2 #container.av-main th,
.article-v2 #container.av-main h1,
.article-v2 #container.av-main h2,
.article-v2 #container.av-main h3,
.article-v2 #container.av-main h4,
.article-v2 #container ol.references,
.article-v2 #container ol.references li.article_text,
.article-v2 #container ol.references li.article_text em,
.article-v2 #container .av-info-card,
.article-v2 #container .av-info-card__label,
.article-v2 #container .av-info-card__value,
.article-v2 #container #citation,
.article-v2 #container p.article_text_small,
.article-v2 #container div.article_text_small {
  font-family: var(--av-font-sans) !important;
}

/* #18 — even, tight label/value rhythm in the Article-Information metadata.
   The trailing metadata (Academic Editor / Plagiarism / Review by / Copyright /
   License / Corresponding author / Citation / DOI) are separate
   p.article_text_small / div blocks; legacy p margins made the gaps large and
   uneven. Normalise to one consistent rhythm and align the bold label flush with
   its value. Scoped to the info zone via :is() over the grid + the metadata
   paragraphs that follow it (NOT the flowing article body paragraphs). */
.article-v2 #container .av-info-card__grid {
  row-gap: .35rem;                       /* tighten the Journal/Volume/ISSN rows */
}
.article-v2 #container .card-body > div > p.article_text_small,
.article-v2 #container .card-body > p.article_text_small,
.article-v2 #container .card-body > div.article_text_small,
.article-v2 #container #citation {
  margin: 0 0 .35rem !important;         /* even spacing between label/value lines */
  line-height: 1.5;
  font-size: .9rem;
}
.article-v2 #container p.article_text_small > strong,
.article-v2 #container div.article_text_small > strong {
  font-weight: 700;
  color: var(--av-ink);                  /* label reads as the label, value calmer */
}
.article-v2 #container .card-body p.article_text_small + p.article_text_small {
  margin-top: 0 !important;              /* no compounding top+bottom gap */
}

/* ---- #20 : bottom sibling sections — unify font to the article body stack -----
   Override the inline `font-family:Arial,sans-serif` on these PHP-emitted blocks
   so they match the article body. Targeted by class (they sit outside
   .article-v2); only present on the canary page because this sheet is v2-only. */
.oap-publisher-note,
.oap-publisher-note h2,
.oap-publisher-note p,
.oap-article-context,
.oap-article-context h2,
.oap-article-context h3,
.oap-article-context p,
.oap-article-context a,
.oap-article-fact,
.oap-article-fact strong,
.oap-related-topic,
.oap-related-article,
.oap-related-article a,
.oap-related-article__meta,
.oap-related-article__authors,
.oap-article-cite-btn {
  font-family: var(--av-font-sans) !important;
}
/* ===================== end cluster F (font-family) ======================== */


/* ===== cluster G | bugs [7] ===== */
/* ==========================================================================
   BUG #7 (cluster G) — MOBILE Archives dropdown: caret overlaps "Volume N" text.
   On <=991px the legacy touch-fix (main_site_2020.css 3655-) forces every <a>
   to justify-content:center + 16px padding + 44px min-height. That re-centres
   the volume label so it collides with the Bootstrap caret which sample.css
   pins absolutely at right:0 / top:20px. Here we (a) put the label back on the
   left, (b) reserve right padding so the caret has its own lane, and (c)
   vertically centre the caret to the real (taller) box. Scoped to the archives
   menubar only; desktop untouched.
   ========================================================================== */
@media (max-width: 991px) {
  .article-v2 #sidebar .menubar a.dropdown-toggle {
    justify-content: flex-start !important;  /* undo legacy center -> label left */
    text-align: left !important;
    padding-right: 34px !important;          /* dedicated lane for the caret */
    position: relative !important;           /* keep as positioning context */
  }
  /* Re-anchor the Bootstrap caret to the vertical centre of the 44px+ box
     and give it a clear right gap so it never sits under the label text. */
  .article-v2 #sidebar .menubar a.dropdown-toggle::after {
    position: absolute !important;
    right: 12px !important;
    top: 50% !important;
    transform: translateY(-50%) !important;
    margin: 0 !important;
  }
  /* The empty .holder spacer can pick up the legacy flex/justify rules and add
     phantom width that nudges the label; neutralise it inside the menubar. */
  .article-v2 #sidebar .menubar a.dropdown-toggle .holder {
    display: none !important;
  }
}


/* ===== cluster H | bugs [19] ===== */
/* ===== Bug #19 (cluster H) — Cited-by "Citing Articles" orphan fix =====
   Keep the trailing word + external-link icon together so the last word
   (e.g. "trial") and its icon never get pushed to their own line.
   Generic / text-agnostic: hide the real inline FA icon and re-emit it as
   an ::after glyph bound to the preceding word with a non-breaking space. */
.article-v2 #cited-by .citing-works .references span.article_text > a {
  /* allow normal wrapping of the title text */
  white-space: normal;
}
.article-v2 #cited-by .citing-works .references span.article_text > a .fa-external-link {
  /* hide the standalone inline icon that creates the break opportunity */
  display: none !important;
}
.article-v2 #cited-by .citing-works .references span.article_text > a::after {
  /* NBSP (\00a0) + FontAwesome 4.7 external-link glyph (\f08e), unbreakable */
  content: "\00a0\f08e";
  font-family: "FontAwesome";
  font-weight: normal;
  font-style: normal;
  font-size: 0.8em;
  white-space: nowrap;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}


/* ===== cluster B | bugs [6, 9, 11] ===== */
/* ============================================================================
   CLUSTER B — RIGHT SIDEBAR WIDGET POLISH (bugs #6, #9, #11)  [append-only]
   Appended after block (q). Equal-specificity-but-later overrides of block (h)
   (.article-v2 .col-md-3.content .widget). Reuses --av-* tokens only.
   ========================================================================== */

/* ---- (B9) Remove the dated 4-sided rounded borders on every right-sidebar
   widget; switch to a borderless layout with a single crisp sharp-edged
   accent on the LEFT only. Same selector specificity as block (h) so this
   wins by source order. Covers .widget.categories AND .widget.blog_gallery
   (both live inside aside.col-md-3.content). ------------------------------- */
.article-v2 .col-md-3.content .widget {
  border: 0;
  border-left: 3px solid var(--av-accent);
  border-radius: 0;
  background: transparent;
  padding: .1rem 0 .9rem 1rem;
}
/* the widget <h4>/<h3> header divider stays, but pull it back into the new
   left-padded box (block (h) used -1rem side margins tuned to the old card). */
.article-v2 .col-md-3.content .widget > h4,
.article-v2 .col-md-3.content .widget > h3 {
  margin: 0 0 .65rem;
  padding: .15rem 0 .5rem;
  border-bottom: 1px solid var(--av-border);
  font-size: 1rem;
  font-weight: 700;
  color: var(--av-ink) !important;   /* beat legacy white-h4 !important */
  background: transparent;
  border-radius: 0;
  text-transform: none;
  letter-spacing: 0;
  line-height: 1.3;
}

/* ---- (B6) "View us here": the ResearchGate logo carries a hardcoded
   width="150" attribute that blows it out vs the compact metrics above.
   Constrain it to a sensible, proportionate size. -------------------------- */
.article-v2 .col-md-3.content .widget.blog_gallery .sidebar-gallery {
  list-style: none;
  margin: 0;
  padding: 0;
}
.article-v2 .col-md-3.content .widget.blog_gallery .sidebar-gallery img {
  width: auto !important;       /* drop the inline width="150" attribute */
  max-width: 110px;
  height: auto;
  display: block;
}

/* ---- (B11) "Claim to ORCID": replace the thin pale-green outline box (set via
   INLINE styles, so !important is required to win) with a solid, professional
   filled button. White text on --av-accent passes WCAG AA (>=4.5:1). An "iD"
   mark in the ORCID brand green sits inside on a white chip for recognition. */
.article-v2 .oap-orcid-claim a {
  display: inline-flex !important;
  align-items: center;
  gap: .5rem;
  border: 0 !important;
  border-radius: var(--av-radius-sm) !important;
  padding: .55rem .9rem !important;
  font-size: .8125rem !important;
  font-weight: 700 !important;
  line-height: 1.2 !important;
  color: #ffffff !important;
  background: var(--av-accent) !important;
  text-decoration: none !important;
  transition: background .15s ease;
}
.article-v2 .oap-orcid-claim a:hover,
.article-v2 .oap-orcid-claim a:focus {
  background: var(--av-accent-hover) !important;
  color: #ffffff !important;
}
.article-v2 .oap-orcid-claim a:focus-visible {
  outline: 2px solid var(--av-accent-hover);
  outline-offset: 2px;
}
/* "iD" brand mark — ORCID green chip, no glyph-font dependency */
.article-v2 .oap-orcid-claim a::before {
  content: "iD";
  flex: none;
  width: 1.05rem;
  height: 1.05rem;
  border-radius: 50%;
  background: #a6ce39;   /* ORCID brand green; no --av token fits this mark */
  color: #ffffff;
  font-size: .62rem;
  font-weight: 700;
  font-style: italic;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
}
/* ============================ end cluster B =============================== */


/* ===== cluster D | bugs [8, 14, 12, 13] ===== */
/* =============================================================================
   CLUSTER D — TABLES (bugs #8 distinct+sticky header/zebra, #14 square corners)
   Appended last; scoped under .article-v2 (canary 391 only). Reuses --av-* props.
   ========================================================================== */

/* #14 — tables must be SHARP-cornered for visual consistency with figures.
   The wrap previously rounded the table at --av-radius-sm (8px). Square it. */
.article-v2 .av-table-wrap { border-radius: 0 !important; }

/* #8 — sticky thead that is CLEARLY distinct from the zebra rows.
   Prior header (--av-accent-soft #eaf2f8) was almost identical to odd rows
   (--av-bg-sunken #eef1f4). Give it a solid accent fill + white text so it
   stands out, and re-assert position:sticky;top:0 inside the scrolling wrap. */
.article-v2 .av-table-wrap thead th,
.article-v2 .av-main table.table thead th {
  position: sticky;
  top: 0;
  z-index: 3;
  background: var(--av-accent) !important;   /* #00639f — clearly distinct from zebra */
  color: #fff !important;
  font-weight: 700;
  border-bottom: 2px solid var(--av-accent-hover) !important;
}
/* keep header links/sup legible on the dark accent fill */
.article-v2 .av-table-wrap thead th a,
.article-v2 .av-main table.table thead th a { color: #fff; }

/* #8 — re-assert zebra striping + a quiet hover, beating any legacy td bg.
   Odd rows tint; even rows stay white → obvious alternation under the dark header. */
.article-v2 .av-table-wrap tbody tr:nth-child(odd) td,
.article-v2 .av-main table.table tbody tr:nth-child(odd) td {
  background: var(--av-bg-sunken);
}
.article-v2 .av-table-wrap tbody tr:nth-child(even) td,
.article-v2 .av-main table.table tbody tr:nth-child(even) td {
  background: var(--av-bg);
}
.article-v2 .av-table-wrap tbody tr:hover td,
.article-v2 .av-main table.table tbody tr:hover td {
  background: var(--av-accent-soft);
}

/* #13 — in-cell footnote markers (the "*") rendered as anchors: keep the
   superscript subtle and obviously clickable, not styled like a citation. */
.article-v2 .av-table-wrap a.av-fn-ref,
.article-v2 .av-main table.table a.av-fn-ref {
  color: var(--av-accent-hover);
  text-decoration: none;
  font-weight: 700;
  cursor: pointer;
}
.article-v2 .av-table-wrap a.av-fn-ref:hover,
.article-v2 .av-main table.table a.av-fn-ref:hover { text-decoration: underline; }


/* ===== cluster A | bugs [1, 16] ===== */
/* ============================================================================
   (w) BUG #1 — JOURNAL MASTHEAD MOVED ABOVE THE LEFT "FULL TEXT ARTICLE" MENU
   ----------------------------------------------------------------------------
   The legacy <section class="top-banner"> is disabled in page_v2.xsl (it painted
   the dark new_banner2.png "cover" behind a white .article-left panel; with the
   fixed site header the dark band scrolled off, leaving a black void). The journal
   name/image/issue now render as .av-left-banner at the top of the left TOC column
   (.blog-item.col-md-3), in normal flow — no floating, nothing to vanish on scroll.
   ========================================================================== */
.article-v2 .av-left-banner {
  display: flex;
  align-items: center;
  gap: .6rem;
  padding: 0 0 .85rem;
  margin-bottom: .85rem;
  border-bottom: 1px solid var(--av-border);
}
.article-v2 .av-left-banner__img {
  width: 52px;
  height: 52px;
  flex: none;
  object-fit: cover;
  border-radius: 10px;
  border: 1px solid var(--av-border);
}
.article-v2 .av-left-banner__meta { min-width: 0; }
.article-v2 .av-left-banner__title {
  font-size: .95rem;
  font-weight: 700;
  line-height: 1.25;
  color: var(--av-ink);
}
.article-v2 .av-left-banner__issue {
  margin-top: .2rem;
  font-size: .72rem;
  line-height: 1.3;
  color: var(--av-ink-muted);
}
.article-v2 .av-left-banner__issue-label {
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  margin-right: .35rem;
}

/* ============================================================================
   (x) BUG #16 — LOWER ARTICLE TEXT RECLAIMS THE FREED WIDTH PAST THE SIDEBAR
   ----------------------------------------------------------------------------
   The reading column (.col-md-6, capped to 58.33% by the inline media rule in
   article_v2.xsl) sat between a floated left TOC (.col-md-3, 20%) and a SHORT
   right sidebar (aside.col-md-3.content, 25%). Because .row is a flex container,
   the article stayed pinned at 58% for its FULL height — so once the sidebar's
   content ended there was a giant white void down the right side.

   Fix (desktop >=992 only): drop the flex row to block flow and float ONLY the
   two rails; the article column becomes a normal-flow block that establishes its
   own BFC (overflow:hidden). A BFC block sits beside the floats while they exist
   and then EXPANDS to reclaim the full width once the (shorter) right rail ends —
   exactly the "reclaim freed width" behaviour requested. The reading measure cap
   is lifted so the prose fills the widened lower column. Mobile (<=991.98) is
   untouched (block (l) already stacks to one column). Scoped to .article-v2 →
   article 391 only; fully reversible (delete this block).
   ========================================================================== */
@media (min-width: 992px) {
  /* REVISED #16 (float-reclaim dropped: a float:right aside that is LAST in source
     fell below the article; verified broken at 1440px). Robust approach instead:
     keep the 3-col flex row, top-align it, WIDEN the reading column, and make the
     sidebar STICKY so it fills the right column on scroll instead of a blank void. */
  .article-v2 > .blog > .row { align-items: flex-start; flex-wrap: nowrap; }

  /* slim the two rails so the reading column gets the lion's share */
  .article-v2 .blog-item.col-md-3 {
    flex: 0 0 17% !important;
    max-width: 17% !important;
  }
  .article-v2 aside.col-md-3.content {
    flex: 0 0 22% !important;
    max-width: 22% !important;
    /* sticky: tools + metrics stay in view down the long article — the right
       column is filled by the sidebar rather than leaving a giant white void */
    position: sticky;
    top: 88px;
    align-self: flex-start;
  }
  /* reading column reclaims the freed width: drop the inline 58.33% cap and the
     720px text measure so the prose is no longer a squished narrow strip */
  .article-v2 #search_results_container.col-md-6 {
    flex: 1 1 0 !important;
    width: auto !important;
    min-width: 0 !important;
    max-width: none !important;
    padding-left: 1.75rem;
    padding-right: 1.75rem;
  }
  .article-v2 #search_results_container.col-md-6 .av-main,
  .article-v2 #container.av-main {
    max-width: none;
    margin-inline: 0;
  }
}


/* ===== cluster I | bugs [2, 5] ===== */
/* =============================================================================
   (w) BUG #2 — METRICS POSITION (desktop + mobile). Lift the article-specific
   Metrics widget up directly beneath Article Tools so the sidebar reads
   Article Tools -> Metrics -> (Share / journal / site widgets). Block (v) only
   ordered the stack inside @media(max-width:991.98px); on desktop the sidebar was
   normal block flow and Metrics fell to the bottom. Make the sidebar a flex column
   at ALL widths and assign explicit order. Data-driven (:has(.av-metrics-grid),
   .av-tools-rail) — no article-specific values. :has() degrades gracefully (stack
   stays in DOM order) on engines without it. Scoped to .article-v2 -> article 391.

   Cluster C note: Share currently sits INSIDE .av-tools-rail. If cluster C extracts
   Share into its own sibling widget, give that widget order:3 to keep
   Article Tools(1) -> Metrics(2) -> Share(3) -> rest(4). ===================== */
.article-v2 aside.col-md-3.content {
  display: flex;
  flex-direction: column;
}
.article-v2 aside.col-md-3.content > .widget { order: 4; }            /* default: journal/site widgets after */
.article-v2 aside.col-md-3.content > .av-tools-rail { order: 1; }     /* Article Tools (currently also holds Share) */
.article-v2 aside.col-md-3.content > .widget:has(.av-metrics-grid) { order: 2; }  /* Metrics directly under Article Tools */

/* ##########################################################################
   391 BUGFIX — corrective pass (z): three items the parallel batch missed live
   (each verified at 1440px via Playwright before adding this block).
   ########################################################################## */

/* ---- #8  TABLE HEADER: the JATS tables here have NO <thead> (the header is the
   first <tbody> row, all <td>), so Spec D's `thead th` rules matched nothing.
   Promote the first row to a distinct, sticky header. ----------------------- */
.article-v2 .av-table-wrap { overflow: auto; }
.article-v2 .av-table-wrap table tr:first-child td,
.article-v2 .av-main table.table tr:first-child td {
  position: sticky;
  top: 0;
  z-index: 3;
  background: var(--av-accent) !important;
  color: #fff !important;
  font-weight: 700;
  border-color: rgba(255,255,255,.28) !important;
}
.article-v2 .av-table-wrap table tr:first-child td a,
.article-v2 .av-main table.table tr:first-child td a { color: #fff !important; }

/* ---- #15 FIGURE CAPTION: space after the "Figure N." label and a gap before
   the figure image. (Spec E's :has() selector did not match the live markup.)
   Live markup: <p><b>Figure N.</b><small>Title</small><br> ... <img.img_padding>) */
.article-v2 #container p:has(> small):has(img.img_padding) > b { margin-right: .45em; }
.article-v2 #container p:has(> small):has(img.img_padding) img.img_padding { margin-top: .6rem; }

/* ---- #20 BOTTOM SECTIONS: .oap-publisher-note / .oap-article-context render
   OUTSIDE .article-v2, so the v2 font rules never reached them and they
   inherited the global `body{font-family:reboto!important}` typo. Override
   directly — article_v2.css only loads on the v2 (391) page, so this stays
   scoped to the canary. ----------------------------------------------------- */
.oap-publisher-note, .oap-article-context {
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif !important;
}
.oap-publisher-note *, .oap-article-context * { font-family: inherit !important; }

/* ##########################################################################
   391 BUGFIX ROUND 2 (2026-06-29) — client column-D feedback (block aa)
   #2  Metrics between Article Tools and Share (Share split into .av-share-widget
       in page_v2.xsl; ordered after Metrics here)
   #5  Article Integrity body text was white-on-white -> dark ink
   #18 Article Information region: uniform font-family / heading size / colors
   #21 relocated journal masthead: breathing room in the narrow left column
   #22 breadcrumb / article top cleared from under the fixed site header
   ########################################################################## */

/* ---- #2: Article Tools (order 1) -> Metrics (2) -> Share (3) -> rest (4) --- */
.article-v2 aside.col-md-3.content > .av-share-widget { order: 3 !important; }

/* ---- #5: sidebar widget body text was painted white by legacy (invisible) -- */
.article-v2 .col-md-3.content .widget .sidebar-gallery li,
.article-v2 .col-md-3.content .widget .sidebar-gallery li strong,
.article-v2 .col-md-3.content .widget .sidebar-gallery li a:not([class]) {
  color: var(--av-ink) !important;
}

/* ---- #18: harmonise the Article Information region (timeline + meta + the
   COI/Funding/Data statement cards). Statement titles were 19.52px vs the
   16.8px card title; the timeline fell back to Cambria serif. Unify all. ----- */
.article-v2 .av-main .card .card-title,
.article-v2 .av-main .av-statement__title {
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important;
  font-size: 1.05rem !important;
  font-weight: 700 !important;
  color: var(--av-ink) !important;
  line-height: 1.3 !important;
}
.article-v2 .av-main .av-timeline,
.article-v2 .av-main .av-timeline *,
.article-v2 .av-main .av-statement,
.article-v2 .av-main .av-statement__body,
.article-v2 .av-main .av-statement__body p,
.article-v2 .av-main .av-info-card,
.article-v2 .av-main .av-info-card * {
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important;
}
.article-v2 .av-main .av-statement__body,
.article-v2 .av-main .av-statement__body p {
  font-size: .9rem !important;
  color: var(--av-ink-muted) !important;
}

/* ---- #21: relocated journal masthead — padding + breathing room ----------- */
.article-v2 .av-left-banner {
  padding: .9rem .55rem 1rem !important;
  gap: .7rem !important;
}

/* ---- #22: clear the breadcrumb / article top from under the fixed header --- */
.article-v2 > .blog { margin-top: 1.5rem; }

/* ##########################################################################
   391 BUGFIX R2b — #16 client D-note: the left nav/masthead scrolled away on
   scroll, leaving a void down the LEFT side. Make the left TOC column sticky on
   desktop so the journal banner + "Full Text Article" nav stay in view (mirrors
   the sticky right rail). top:88px (not the note's 20px) so it clears the 71px
   fixed site header.
   ########################################################################## */
@media (min-width: 992px) {
  .article-v2 .blog-item.col-md-3 {
    position: sticky;
    top: 88px;
    align-self: flex-start;
  }
}

/* ##########################################################################
   391 BUGFIX R2c (2026-06-29) — client RED-flagged column-D feedback
   #9  sidebar accent read as one continuous bar (widgets were flush, 0 gap) ->
       add gaps so each widget's 3px left accent is its own segment
   #18 Copyright/License text too large (17px) + COI/Funding/Data boxes over-padded
   #21 masthead "Current Issue" crammed inline + uppercase -> own line, sentence case
   #22 breathing room above the "Article Tools" widget
   ########################################################################## */

/* #9 — segment the per-widget accent with clean gaps (was 0 gap, flush) */
.article-v2 aside.col-md-3.content { gap: 1.15rem; }
.article-v2 aside.col-md-3.content > .widget { margin-bottom: 0 !important; }

/* #18a — Copyright / License lines were 17px legacy; match the body small size + font */
.article-v2 .av-main .article_text_small {
  font-size: .9rem !important;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important;
}
/* #18b — tighten the Competing Interests / Funding / Data Availability boxes */
.article-v2 .av-main .av-statement { padding: .55rem .8rem !important; margin: .55rem 0 !important; }
.article-v2 .av-main .av-statement__title { margin-bottom: .2rem !important; }
.article-v2 .av-main .av-statement__body { line-height: 1.4 !important; }

/* #21 — masthead: "Current Issue" on its own line, sentence case, not crammed */
.article-v2 .av-left-banner__issue-label {
  display: block !important;
  text-transform: none !important;
  letter-spacing: 0 !important;
  margin-right: 0 !important;
}
.article-v2 .av-left-banner__issue-no { display: block; }

/* #22 — breathing room above the Article Tools widget (top of the right sidebar) */
.article-v2 aside.col-md-3.content > .av-tools-rail { margin-top: 1.25rem !important; }

/* #18a-fix — Copyright/License sit in the Article Information card as p.card-text +
   an unclassed wrapper div (NOT .article_text_small), so the prior rule missed them.
   Scope to that card's card-body, excluding the av-info-card grid (so its label/value
   sizing is preserved). Brings the 17px copyright/license text down to the body size. */
.article-v2 .av-main .card:has(.av-info-card) .card-body > div:not(.av-info-card),
.article-v2 .av-main .card:has(.av-info-card) .card-body > div:not(.av-info-card) * {
  font-size: .9rem !important;
}

/* #23 — restore the missing Table-1 (Study Schedule) study-period arrows. image1.jpg is
   the original horizontal double-arrow asset (also used by the table legend). The cell
   arrow is centered in the merged colspan cell; the legend arrow renders inline before
   its text (the fn template now applies-templates instead of value-of, so the
   inline-graphic is no longer dropped). */
.article-v2 .av-main td .av-sched-arrow { display:block; margin:0 auto; height:20px; width:auto; }
.article-v2 .av-main .av-inline-graphic { height:1.05em; width:auto; vertical-align:-.18em; margin-right:.35rem; }

/* ##########################################################################
   391 BUGFIX R2e (2026-06-29) — client column-D
   #22 (Partial): both sticky sidebars pinned at top:88px, but the fixed top chrome
       is 115px (.inner-header 71 + .inner-menu 44) -> the sidebar tops clipped under
       the .inner-menu bar during scroll. Clear the full fixed header (120px).
   #24: the link tools (Download PDF / Full-text HTML / Download XML) lost the hover
       block because legacy `#sidebar a:hover` (id specificity 1,1,1) beat `.av-tool:hover`
       (0,2,1); the <button> tools (Cite/Print) kept it. Force the same hover on all 5.
   ########################################################################## */
@media (min-width: 992px) {
  .article-v2 .blog-item.col-md-3,
  .article-v2 aside.col-md-3.content { top: 120px !important; }
}
.article-v2 .col-md-3.content #sidebar a.av-tool:hover,
.article-v2 .col-md-3.content #sidebar button.av-tool:hover {
  background: var(--av-accent-soft) !important;
  border-color: var(--av-accent-soft-2) !important;
  color: var(--av-accent-hover) !important;
}


/* ============================ end article_v2.css ========================== */
