/*
Theme Name: Martha Nelson Lab
Theme URI: https://marthanelsonlab.com/
Author: Unified Media LLC
Description: Block theme for the Nelson Lab at NIH. White ground, restrained editorial typography, and a viridis-derived accent palette. All design tokens are declared once, in theme.json; this file only consumes them.
Requires at least: 6.5
Tested up to: 7.0
Requires PHP: 7.4
Version: 2.78.2
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: martha-nelson-lab
Tags: one-column, block-patterns, full-site-editing, education, accessibility-ready
*/

/* ============================================================================
   1. GLOBAL
   Colors, fonts and spacing all come from theme.json as --wp--preset--* custom
   properties. Nothing in this file redeclares a token. The one exception is the
   choropleth ramp below, which is derived, colorblind-safe, and not something an
   editor should be changing from the Site Editor.
   ========================================================================= */

:root {
	/* Every color now lives in theme.json: the palette for anything an editor
	   might reasonably change, settings.custom for the derived values that should
	   not appear in a color picker - the choropleth ramp, control borders,
	   shadows. Nothing in this file states a color literally.
	   The glyph below is an asset rather than a token, so it stays here. */
	--nl-imgph:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 4h16v16H4z' fill='none' stroke='black' stroke-width='1.4'/%3E%3Ccircle cx='9' cy='9.5' r='1.6'/%3E%3Cpath d='M5.5 18l4.2-5 3 3.4 2.4-2.6 3.4 4.2z'/%3E%3C/svg%3E");
}

body { -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility; }
::selection { background:var(--wp--preset--color--accent-tint); color:var(--wp--preset--color--accent-dark); }

:where(a,button,input,select,textarea,summary,details,[tabindex]):focus-visible {
	outline:2px solid var(--wp--preset--color--accent); outline-offset:2px; border-radius:var(--wp--custom--radius-control);
}

.skip-link {
	position:absolute; left:-9999px; top:0; z-index:100000;
	background:var(--wp--preset--color--base); color:var(--wp--preset--color--accent-dark); padding:var(--wp--custom--space--md) var(--wp--custom--space--lg);
	border:2px solid var(--wp--preset--color--accent); border-radius:0 0 var(--wp--custom--radius) 0;
	font-weight:650; font-size:var(--wp--preset--font-size--small);
}
.skip-link:focus { left:0; }

/* ============================================================================
   2. HEADER
   ========================================================================= */
.nl-siteheader {
	position:sticky; top:0; z-index:40;
	background:var(--wp--custom--header-bg); backdrop-filter:saturate(170%) blur(8px);
	border-bottom:1px solid var(--wp--preset--color--rule);
	padding-block:var(--wp--custom--space--base);
}
.admin-bar .nl-siteheader { top:32px; }
/* 782, not 781, on purpose: this one matches WordPress's own rule for the admin
   bar growing to 46px, so the two have to switch at the same pixel. Layout
   rules of ours still use 781 to stay off that boundary. */
@media (max-width:782px){ .admin-bar .nl-siteheader { top:46px; } }

/* The bar. The current page carries a rule under the item rather than extra
   weight, so the row does not reflow as you move around the site. mnl_nav_current()
   in functions.php adds nl-current and nl-ancestor, because the menu is built from
   custom links and core only marks links it knows to be posts. */
.nl-siteheader .wp-block-navigation {
	gap:var(--wp--custom--space--lg);
	font-size:var(--wp--preset--font-size--compact); font-weight:500;
}
.nl-siteheader .wp-block-navigation__container > li > a {
	display:inline-block; padding-block:var(--wp--custom--space--xxs);
	border-bottom:2px solid transparent; transition:color .15s, border-color .15s;
}
.nl-siteheader .wp-block-navigation__container > li > a:hover { border-bottom-color:var(--wp--preset--color--accent-tint); }
.nl-siteheader .wp-block-navigation a.nl-current,
.nl-siteheader .wp-block-navigation a.nl-ancestor { color:var(--wp--preset--color--contrast); }
.nl-siteheader .wp-block-navigation__container > li > a.nl-current,
.nl-siteheader .wp-block-navigation__container > li > a.nl-ancestor { border-bottom-color:var(--wp--preset--color--accent); }

/* The dropdown sizes itself to its longest label rather than to a guessed width. */
.nl-siteheader .wp-block-navigation__submenu-container {
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius);
	box-shadow:var(--wp--custom--shadow--lg); padding:var(--wp--custom--space--xs) 0;
	min-width:14rem; align-items:flex-start;
}
/* The bar is justified right, which core passes down to the panel, so the
   alignment is set back here rather than left to inherit. */
.nl-siteheader .wp-block-navigation__submenu-container li { width:100%; }
.nl-siteheader .wp-block-navigation__submenu-container li > a {
	padding:var(--wp--custom--space--xs) var(--wp--custom--space--base);
	font-size:var(--wp--preset--font-size--small); line-height:1.4; white-space:nowrap;
	border-left:2px solid transparent; transition:background .15s, border-color .15s, color .15s;
	width:100%; text-align:left; justify-content:flex-start;
}
.nl-siteheader .wp-block-navigation__submenu-container li > a:hover,
.nl-siteheader .wp-block-navigation__submenu-container li > a:focus-visible,
.nl-siteheader .wp-block-navigation__submenu-container li > a.nl-current {
	background:var(--wp--preset--color--surface); border-left-color:var(--wp--preset--color--accent);
}

/* The overlay menu.
   Keyed on .is-menu-open at any width, not inside the phone breakpoint, because
   the panel can be open at any width: open it on a phone, then rotate or widen
   the window and it stays open. When these rules were inside the breakpoint the
   desktop dropdown styling came back at 782px and drew a bordered, shadowed box
   around the second level while the panel was still open.
   Two things had to be fixed before the panel worked at all. The header carries a
   backdrop blur, and backdrop-filter makes an element the containing block for
   fixed descendants, so the panel opened inside the 56px header instead of
   filling the viewport. And the bar's layout is justified right, which carried
   into the panel and pushed the links to the far edge.
   The selectors are long on purpose: core sets padding:0 and width on overlay
   items four classes deep, so anything shorter loses. */
.nl-siteheader:has(.is-menu-open) { backdrop-filter:none; }
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open {
	background:var(--wp--preset--color--base);
	padding:var(--wp--custom--space--lg) var(--wp--custom--space--sm) var(--wp--custom--space--xl);
}
.nl-siteheader .is-menu-open .wp-block-navigation__responsive-container-content,
.nl-siteheader .is-menu-open .wp-block-navigation__container { align-items:stretch; gap:0; }
/* Rows stretch to the panel rather than being set to 100% of it: the panel has
   padding, so a 100% row overflowed and put a scrollbar across the menu. Each
   item is a column so its submenu sits under the link and left aligned. */
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content,
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container {
	width:auto; align-self:stretch; box-sizing:border-box;
}
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
	flex-direction:column; align-items:flex-start; justify-content:flex-start;
}
/* Top level: one row per link, a rule between them, a target for a thumb. */
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content {
	display:block; padding:var(--wp--custom--space--xs);
	font-size:var(--wp--preset--font-size--lede); font-weight:600;
	border-bottom:1px solid var(--wp--preset--color--rule);
	border-radius:var(--wp--custom--radius-control);
}
/* Second level: a step in and a size down, no chrome and no rules of its own -
   with a divider on every row the panel read as thirteen equal things. */
.nl-siteheader .is-menu-open .wp-block-navigation__submenu-container {
	border:0; box-shadow:none; background:transparent;
	min-width:0; max-width:none; padding:0 0 0 var(--wp--custom--space--sm);
}
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container {
	padding-left:var(--wp--custom--space--sm);
}
.nl-siteheader .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
	padding:var(--wp--custom--space--xxs) var(--wp--custom--space--xs);
	font-size:var(--wp--preset--font-size--subhead); font-weight:450;
	color:var(--wp--preset--color--muted); border-bottom:0; white-space:normal;
}
/* Rollover, and where you are. The bar on the left is the marker here: the
   underline the desktop bar uses would be lost among the row dividers. */
.nl-siteheader .is-menu-open .wp-block-navigation-item__content:hover,
.nl-siteheader .is-menu-open .wp-block-navigation-item__content:focus-visible {
	background:var(--wp--preset--color--surface); color:var(--wp--preset--color--accent-dark);
}
.nl-siteheader .is-menu-open a.nl-current,
.nl-siteheader .is-menu-open a.nl-ancestor {
	color:var(--wp--preset--color--accent-dark);
	box-shadow:inset 3px 0 0 var(--wp--preset--color--accent);
}
.nl-siteheader .wp-block-navigation__responsive-container-open,
.nl-siteheader .wp-block-navigation__responsive-container-close { padding:var(--wp--custom--space--sm); }

/* Below 782px the bar would wrap under the site title, so the button takes over
   there rather than at WordPress's own 600px. Core shows the inline list and
   hides the button from 600px up, so both of those are undone in between, and
   the masthead is shorter to leave room for the panel. */
@media (max-width:781px) {
	.nl-siteheader { padding-block:var(--wp--custom--space--sm); }
	.nl-siteheader .wp-block-navigation__responsive-container-open:not(.always-shown) { display:flex; }
	.nl-siteheader .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) { display:none; }
	/* The desktop dropdown, when it is reachable at all at this width. */
	.nl-siteheader .wp-block-navigation__submenu-container li > a { white-space:normal; }
}

/* ============================================================================
   3. PAGE RHYTHM
   ========================================================================= */
/* The editor has no .nl-main - the canvas root is .editor-styles-wrapper, with a
   .wp-block-post-content inside it - so the rules that decide what a writer sees
   name both contexts. Twin selectors rather than a duplicate block: one set of
   declarations, so the editor cannot drift away from the page. Front-end chrome
   (the sticky header, footer spacing, min-height) is deliberately not repeated. */
.nl-main { min-height:50vh; }
.wp-site-blocks .nl-main { margin-top:var(--wp--custom--space--xxxl); }
/* The canvas is wider than the page's content column, so the root is capped at
   the same width and centred. Without it the left-pinned content sits against the
   far edge of the editor and reads nothing like the page. 1200px is the wideSize
   in theme.json, which is also what the template's main group uses. */
.editor-styles-wrapper .wp-block-post-content.is-root-container,
/* The title is not in the root container - the editor keeps it in a wrapper of
   its own - so it is capped and centred to the same width, or it starts at the
   canvas edge while the copy under it starts 100px in. */
.editor-styles-wrapper .editor-visual-editor__post-title-wrapper {
	max-width:1200px; margin-inline:auto;
	padding-inline:var(--wp--custom--space--base);
}

/* The editor centres constrained children, so the title needs the same left-hand
   pin the post-content children get; on the front end the template already does
   it. Without this the writer sees a centred title over left-aligned copy. */
.editor-styles-wrapper .wp-block-post-title { margin-left:0 !important; margin-right:auto !important; }
.nl-main .wp-block-post-title,
.nl-main .nl-areatitle,
.nl-main .nl-pagetitle,
.editor-styles-wrapper .wp-block-post-title { max-width:var(--wp--custom--measure-narrow); margin-bottom:var(--wp--custom--space--xl); text-wrap:balance; }
.nl-main .wp-block-post-title::after,
.nl-main .nl-areatitle::after,
.nl-main .nl-pagetitle::after,
.editor-styles-wrapper .wp-block-post-title::after {
	content:""; display:block; width:56px; height:4px; border-radius:var(--wp--custom--radius-control);
	/* The group colour where the title sits inside one - an area page, a paper -
	   and the accent everywhere else, which is what --g falls back to. */
	background:var(--g,var(--wp--preset--color--accent)); margin-top:var(--wp--custom--space--base);
}
.nl-main h2,
.editor-styles-wrapper h2 { margin-top:0; margin-bottom:var(--wp--custom--space--base); letter-spacing:-0.016em; }
/* ...but a section heading that follows content needs air. Only applies when
   something precedes it, so a heading opening a column stays flush. */
.nl-main * + h2,
.editor-styles-wrapper * + h2 { margin-top:var(--wp--custom--space--xxl); }
.nl-main h3,
.editor-styles-wrapper h3 { margin-top:var(--wp--custom--space--xl); margin-bottom:var(--wp--custom--space--sm); }
/* ...but that rhythm is for prose. A heading that opens a card starts flush, or the
   featured flag above it ends up further from its title than from the card edge. */
.nl-main .nl-pub-t, .nl-main .nl-tile-t, .nl-main .nl-newstitle { margin-top:0; }
.nl-main p,
.editor-styles-wrapper p { text-wrap:pretty; }

.nl-main .wp-block-separator,
.editor-styles-wrapper .wp-block-separator {
	/* Was margin:0, which only looked right because every page had a Spacer block
	   on either side of it. The section break owns its own air now. */
	margin:var(--wp--custom--space--xxl) 0; border:0; height:1px;
	background:var(--wp--preset--color--rule); opacity:1; max-width:100%;
}
.nl-main ul.wp-block-list,
.editor-styles-wrapper ul.wp-block-list { padding-left:var(--wp--custom--space--base); }
.nl-main ul.wp-block-list li,
.editor-styles-wrapper ul.wp-block-list li { margin-bottom:var(--wp--custom--space--sm); }

/* ------------------------------------------------------------------ page aside
   The site has three asides: the one beside a publication, the media note on the
   news page, and the reference column on Martha's page. They used to be a boxed
   panel, a bare paragraph and a bespoke label. One vocabulary now: a small caps
   label, small text, a hairline between sections, no container. */
.nl-side { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--muted); }
.nl-side h2, .nl-side h3 {
	font-family:var(--wp--preset--font-family--sans); font-size:var(--wp--preset--font-size--label);
	font-weight:700; letter-spacing:.09em; text-transform:uppercase;
	color:var(--wp--preset--color--faint); margin:0 0 var(--wp--custom--space--sm);
}
.nl-side > * + h2, .nl-side > * + h3 {
	margin-top:var(--wp--custom--space--lg); padding-top:var(--wp--custom--space--lg);
	border-top:1px solid var(--wp--preset--color--rule);
}
.nl-side p { margin:0 0 var(--wp--custom--space--sm); line-height:1.55; }
.nl-side p:last-child { margin-bottom:0; }
.nl-side ul.wp-block-list { list-style:none; margin:0; padding:0; }
.nl-side ul.wp-block-list li { margin:0 0 var(--wp--custom--space--xxs); }

.nl-main .wp-block-column > *,
.editor-styles-wrapper .wp-block-column > * { max-width:var(--wp--custom--measure); }
.nl-main .wp-block-column > .wp-block-group,
.editor-styles-wrapper .wp-block-column > .wp-block-group { max-width:none; }

/* ============================================================================
   4. FOOTER
   ========================================================================= */
/* Capped for readability, so the constrained layout would otherwise center it in
   the footer box. !important beats WordPress's own auto margins on that layout. */
.nl-sitefooter {
	border-top:1px solid var(--wp--preset--color--rule);
	padding-block:var(--wp--custom--space--xxxl);
}
.wp-site-blocks .nl-sitefooter { margin-top:var(--wp--custom--space--band); }
.nl-sitefooter .nl-copyright { margin-top:var(--wp--custom--space--xl); }
.nl-sitefooter .nl-disclaimer {
	max-width:var(--wp--custom--measure); margin-bottom:var(--wp--custom--space--lg); padding-left:var(--wp--custom--space--base);
	margin-left:0 !important; margin-right:auto !important;
	border-left:3px solid var(--wp--preset--color--violet);
}

@media (prefers-reduced-motion:reduce){
	*,*::before,*::after { animation-duration:.001ms !important; transition-duration:.001ms !important; }
	html { scroll-behavior:auto !important; }
}
@media print { .nl-siteheader, .nl-sitefooter { display:none !important; } }

/* ============================================================================
   5. COMPONENTS
   Markup for these comes from the nelson-lab-core plugin's blocks; the styling
   lives here so every color and typeface resolves to a single theme.json token.
   ========================================================================= */
.nl {
	color: var(--wp--preset--color--contrast);
	font-family: var(--wp--preset--font-family--sans);
	font-feature-settings:'kern' 1,'liga' 1,'calt' 1;
}

/* Pathogen groups carry a color that repeats everywhere they appear:
   card top rules, publication rails, area chips, section markers. */
.nl-g-flu { --g:var(--wp--preset--color--accent); --g-soft:var(--wp--preset--color--accent-soft); --g-dark:var(--wp--preset--color--accent-dark); }
.nl-g-cov { --g:var(--wp--preset--color--violet); --g-soft:var(--wp--preset--color--violet-soft); --g-dark:var(--wp--preset--color--violet-dark); }
.nl-g-x   { --g:var(--wp--preset--color--lime);   --g-soft:var(--wp--preset--color--lime-soft);   --g-dark:var(--wp--preset--color--lime-dark); }
/* The fallback for anything with no group of its own. In :where() so it carries
   no weight: an area page root is class="nl nl-areapage nl-g-cov", and a plain
   .nl rule of equal specificity declared after .nl-g-cov used to win, which
   turned the coronavirus and other-systems pages accent-teal from the root
   down - every descendant that inherited --g rather than setting it. */
:where(.nl) { --g:var(--wp--preset--color--accent); --g-soft:var(--wp--preset--color--accent-soft); --g-dark:var(--wp--preset--color--accent-dark); }

.nl-sr {
	position:absolute !important; width:1px; height:1px; overflow:hidden;
	clip:rect(0 0 0 0); clip-path:inset(50%); white-space:nowrap; margin:-1px; padding:0; border:0;
}
.nl *:focus-visible { outline:2px solid var(--wp--preset--color--accent); outline-offset:2px; border-radius:var(--wp--custom--radius-control); }

/* ---------------------------------------------------------------- type */
/* One lede rule. There were two, identical but for a margin, 74 lines apart. */
.nl-lede {
	font-family:var(--wp--preset--font-family--serif);
	font-size:var(--wp--preset--font-size--lede);
	line-height:1.6; color:var(--wp--preset--color--contrast-soft); max-width:var(--wp--custom--measure); margin:0 0 var(--wp--custom--space--xl);
	text-wrap:pretty;
}
.nl-h2 {
	font-family:var(--wp--preset--font-family--serif);
	font-size:var(--wp--preset--font-size--x-large);
	font-weight:650; letter-spacing:-0.014em; line-height:1.25;
	margin:var(--wp--custom--space--xxxl) 0 var(--wp--custom--space--base); padding-top:var(--wp--custom--space--base);
	border-top:2px solid var(--g);
	display:flex; align-items:baseline; gap:var(--wp--custom--space--sm);
}
/* Vertical padding on a pill is in rem, never em. See the note above .nl-tag:
   an em of the meta size is a fractional pixel, and a fractional pixel splits
   unevenly above and below the text. */
.nl-h2n {
	font-size:var(--wp--preset--font-size--meta); font-weight:500; line-height:1.5; color:var(--g-dark);
	background:var(--g-soft); border-radius:var(--wp--custom--radius-pill); padding:.25rem .65em .1875rem;
}
.nl-notice { padding:var(--wp--custom--space--lg); background:var(--wp--preset--color--surface); border:1px dashed var(--wp--custom--control--border); border-radius:var(--wp--custom--radius); color:var(--wp--preset--color--muted); }
.nl-empty { padding:var(--wp--custom--space--xxxl) 0; color:var(--wp--preset--color--muted); font-size:var(--wp--preset--font-size--medium); }

/* ---------------------------------------------------------------- tags
   Every pill on the site is the same object - one line of meta text in a
   rounded box - so they share a line height of 1.5 and the same whole-pixel
   padding: 4px above the text, 3px below. Two reasons for those numbers. The
   padding is in rem rather than em because .2em of the meta size is 2.496px,
   and a browser cannot draw half a pixel, so it rounded the space above and
   the space below in opposite directions. And the extra pixel on top is the
   optical correction: a line box centres the font's ascent and descent, which
   for Inter leaves about three quarters of a pixel more room under the
   baseline than over the capitals, so evenly padded text reads high.
   Horizontal padding stays in em, where a fraction of a pixel is invisible. */
.nl-tag {
	display:inline-flex; align-items:center; gap:.3em;
	font-size:var(--wp--preset--font-size--meta); line-height:1.5; font-weight:550;
	padding:.25rem .65em .1875rem; border-radius:var(--wp--custom--radius-pill);
	background:var(--g-soft); color:var(--g-dark);
	border:1px solid color-mix(in srgb, var(--g) 22%, transparent);
	/* The row wraps between pills, so a pill only breaks internally when it cannot
	   fit a line on its own. It used to be nowrap, which pushed the longest area
	   name past the right edge of a phone and scrolled the whole page sideways. */
	max-width:100%;
}
/* One featured list, so the star is redundant on every card in it. */
.nl-list-nofeat .nl-flag { display:none; }
.nl-tag-quiet { background:var(--wp--preset--color--surface); color:var(--wp--preset--color--muted); border-color:var(--wp--preset--color--rule); font-weight:450; }
.nl-meta-row { display:flex; gap:var(--wp--custom--space--xxs); flex-wrap:wrap; margin:var(--wp--custom--space--sm) 0 0; }

.nl-flag {
	display:inline-flex; align-items:center; gap:.35em;
	font-size:var(--wp--preset--font-size--label); font-weight:700; letter-spacing:.07em; text-transform:uppercase;
	color:var(--wp--preset--color--flag); margin:0 0 var(--wp--custom--space--xxxs); line-height:1.2;
}
.nl-flag span { color:var(--wp--preset--color--flag); font-size:var(--wp--preset--font-size--small); }

/* Research area header: the title on the left, the description on the right.
   The block renders the title so both can sit in one grid; the template's own
   title is removed in the theme's functions.php rather than hidden here. */
.nl-areahead {
	display:grid; grid-template-columns:1fr; gap:var(--wp--custom--space--xs) var(--wp--custom--space--xxxl);
	align-items:start; margin-bottom:var(--wp--custom--space--xxl);
}
.nl-areahead .nl-areatitle { margin-top:0; margin-bottom:0; }
.nl-areahead .nl-lede { margin:0; }
@media (min-width:900px) {
	.nl-areahead { grid-template-columns:minmax(0,7fr) minmax(0,9fr); }
}

/* Featured publications sit in a box rather than between two rules, so the
   heading inside it drops the rule it carries everywhere else. */
.nl-featured {
	margin:0 0 var(--wp--custom--space--xxl); padding:var(--wp--custom--space--lg) var(--wp--custom--space--lg) var(--wp--custom--space--lg);
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius);
}
.nl-featured .nl-h2 { margin:0; padding-top:0; border-top:0; }
/* Smaller than a section heading: on the publications page this box sits under a
   page title and a filter bar, and a full-size heading competed with both. */
.nl-h2-sm { font-size:var(--wp--preset--font-size--lede); }
.nl-main .nl-featbox { margin-top:var(--wp--custom--space--xl); }
.nl-main #nl-allhead { margin-top:0; }
.nl-featured .nl-list { margin-top:var(--wp--custom--space--sm); }

/* ---------------------------------------------------------------- publications */
.nl-list { margin-top:var(--wp--custom--space--base); }
.nl-yeargroup { margin-bottom:var(--wp--custom--space--xxl); }
.nl-yr {
	font-size:var(--wp--preset--font-size--meta); font-weight:700; letter-spacing:.1em; color:var(--wp--preset--color--faint);
	margin:0 0 var(--wp--custom--space--base); display:flex; align-items:center; gap:var(--wp--custom--space--base);
	font-variant-numeric:tabular-nums;
}
.nl-yr::after { content:""; flex:1; height:1px; background:var(--wp--preset--color--rule); }
.nl-yr span { color:var(--wp--preset--color--violet); font-size:var(--wp--preset--font-size--medium); font-weight:500; }

.nl-pub {
	display:flex; gap:var(--wp--custom--space--base); padding:var(--wp--custom--space--base) 0 var(--wp--custom--space--base);
	border-bottom:1px solid var(--wp--preset--color--rule);
}
.nl-yritems > .nl-pub:last-child { border-bottom:0; }
.nl-pub-rail { flex:none; width:3px; border-radius:var(--wp--custom--radius-control); background:var(--g); opacity:.55; align-self:stretch; }
/* Illustration mark. Decorative on purpose: it repeats what the citation already
   says, so it carries an empty alt and the subject stays in the data. */
.nl-pub-fig, .nl-areafig {
	flex:none; width:72px; height:72px; border-radius:var(--wp--custom--radius-control); object-fit:cover;
	/* One tone across the set: twenty-odd photographers, one contrast curve, so the
	   marks read as a family rather than as a row of unrelated pictures. Shared with
	   the research area list on the home page, which draws from the same library. */
	filter:saturate(.85) contrast(1.05);
}
.nl-pub-fig {
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--rule);
}
@media (max-width:600px) { .nl-pub-fig { width:56px; height:56px; } }
.nl-pub-body { min-width:0; flex:1; }

.nl-pub-t { font-family:var(--wp--preset--font-family--serif); font-size:var(--wp--preset--font-size--subhead); font-weight:600; line-height:1.4; margin:0 0 var(--wp--custom--space--xxs); letter-spacing:-0.006em; }
.nl-pub-t a { color:var(--wp--preset--color--contrast); text-decoration:none; background-image:linear-gradient(var(--g),var(--g));
	background-size:0 1.5px; background-repeat:no-repeat; background-position:0 100%; transition:background-size .18s; }

.nl-pub-au {
	font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--muted); line-height:1.55; margin:0 0 var(--wp--custom--space--xxs);
	display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.nl-pub-jr { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--faint); margin:0; }
.nl-journal { color:var(--wp--preset--color--muted); font-weight:600; font-style:italic; }
.nl-dot { margin:0 .4em; opacity:.55; }

.nl-pub-links { display:flex; gap:var(--wp--custom--space--base); row-gap:var(--wp--custom--space--xxs); flex-wrap:wrap; margin:var(--wp--custom--space--sm) 0 0; font-size:var(--wp--preset--font-size--meta); }
/* 2px of vertical padding takes these links to a 24px tall target, the minimum
   in WCAG 2.2. Section 508 points at 2.0, which has no target-size rule, so this
   is for thumbs and imprecise pointers rather than for compliance. */
.nl-pub-links a { color:var(--wp--preset--color--accent); text-decoration:none; font-weight:550; padding-block:2px; }
.nl-pub-links a::before { content:"↗"; margin-right:.25em; font-size:.85em; opacity:.7; }
.nl-pub-links a:hover { color:var(--wp--preset--color--accent-dark); text-decoration:underline; }

/* Abstract disclosure. The +/- glyph is driven off aria-expanded so the button's
   visual state and its accessible state can never disagree. The panel ships
   expanded and is collapsed by nl.js, so the text survives without JavaScript. */
/* ---------------------------------------------------------------- single publication
   The record gets a page of its own, so the type is set for reading rather than
   for scanning a list: the abstract runs at 1.06rem against the 0.82rem it had
   inside a citation. The margin holds what this paper is related to. */
.nl-single { display:grid; grid-template-columns:minmax(0,1fr) var(--wp--custom--aside); gap:var(--wp--custom--space--xxxl); align-items:start; }
.nl-single.is-solo { grid-template-columns:minmax(0,1fr); }
.nl-single-main { min-width:0; max-width:var(--wp--custom--measure); }
.nl-crumb { font-size:var(--wp--preset--font-size--meta); margin:0 0 var(--wp--custom--space--base); }
.nl-crumb-end { margin:var(--wp--custom--space--xxl) 0 0; padding-top:var(--wp--custom--space--base); border-top:1px solid var(--wp--preset--color--rule); }
.nl-crumb a { color:var(--wp--preset--color--muted); text-decoration:none; }
.nl-crumb a::before { content:"\2190\00a0"; }
.nl-crumb a:hover, .nl-crumb a:focus-visible { color:var(--wp--preset--color--accent-dark); text-decoration:underline; }
.nl-main .nl-single-t {
	font-family:var(--wp--preset--font-family--serif); font-size:var(--wp--preset--font-size--x-large);
	line-height:1.18; letter-spacing:-0.018em; margin:0 0 var(--wp--custom--space--base); text-wrap:pretty;
}
/* The byline and the journal line are one block of record detail, so they take
   one size: subhead, the step the scale already had between compact and medium.
   The authors were a step below it and the journal a step above, which read as
   two unrelated lines. */
.nl-single-au { font-size:var(--wp--preset--font-size--subhead); line-height:1.6; color:var(--wp--preset--color--muted); margin:0 0 var(--wp--custom--space--sm); }
.nl-single-jr {
	font-size: var(--wp--preset--font-size--subhead);
	margin: 0 0 var(--wp--custom--space--lg);
	line-height: 1.35;
}

/* Inline citation line: the dots sit in normal text flow, so the
   collapsed whitespace already spaces them - keep the margin small. */
.nl-single-jr .nl-dot {
	margin: 0 0.1em;
}
.nl-single-jr .nl-journal { font-weight:600; }
/* Area and network pills, in the record rather than the margin. They are links
   here, unlike the pills on a citation, so the underline is suppressed. */
.nl-single-tags { display:flex; flex-wrap:wrap; gap:var(--wp--custom--space--xxs); margin:0 0 var(--wp--custom--space--base); }
/* Identifiers on one line, each printed in full. The label does the work a
   heading used to, so there is no heading. */
.nl-single-ids { display:flex; flex-wrap:wrap; gap:var(--wp--custom--space--xs); align-items:baseline; margin:0 0 var(--wp--custom--space--xl); font-size:var(--wp--preset--font-size--compact); }
.nl-idlabel { color:var(--wp--preset--color--faint); }
/* The PDF link is an action, so it reads as one: the mark, then the words, in
   link colour, deepening together on hover. */
/* Not a flex box. The identifiers line aligns its items on the baseline, and a
   flex box hands up the baseline of its first child - here the icon, which has
   none, so the browser used its bottom edge and the words sat several pixels
   below DOI and PubMed ID. As plain inline text the words keep their own
   baseline and the icon is nudged onto it. */
.nl-pdf { white-space:nowrap; }
.nl-pdf .nl-ico { margin-right:.35em; vertical-align:-.14em; }

/* ---------------------------------------------------------------- link kinds
   Four behaviors, one block each. A component joins the selector list for the
   kind it wants rather than writing its own hover, which is how these drifted
   into eight slightly different underlines in the first place.

   title  - a headline that happens to be a link. Underline grows from nothing,
            color deepens to the pathogen color where one is in scope.
   body   - a link inside running text or a row of links. Accent, underline on
            hover, the ordinary web convention.
   pill   - a tag or chip. Never underlines; the shape carries the affordance.
   quiet  - navigation and metadata. Muted until hovered, never underlines.     */

.nl-pub-t a,
.nl-newstitle a,
.nl-aside-pubs a,
.nl-tile-t a,
.nl-mcard-name a,
.nl-alum-links a,
.nl-single-t a,
.nl-arealist a span {
	color:var(--wp--preset--color--contrast); text-decoration:none;
	background-image:linear-gradient(var(--g, var(--wp--preset--color--accent)), var(--g, var(--wp--preset--color--accent)));
	background-size:0 1.5px; background-repeat:no-repeat; background-position:0 100%;
	transition:background-size .18s;
}
.nl-pub-t a:hover, .nl-pub-t a:focus-visible,
.nl-newstitle a:hover, .nl-newstitle a:focus-visible,
.nl-aside-pubs a:hover, .nl-aside-pubs a:focus-visible,
.nl-tile-t a:hover, .nl-tile-t a:focus-visible,
.nl-single-t a:hover, .nl-single-t a:focus-visible,
.nl-alum-links a:hover, .nl-alum-links a:focus-visible,
.nl-mcard:hover .nl-mcard-name a, .nl-mcard-name a:focus-visible,
.nl-arealist a:hover span, .nl-arealist a:focus-visible span {
	color:var(--g-dark, var(--wp--preset--color--accent-dark)); background-size:100% 1.5px;
}

.nl-pub-links a,
.nl-side a,
.nl-crumb a,
.nl-single-ids a,
.nl-newspaper a,
.nl-sitefooter a { color:var(--wp--preset--color--accent); text-decoration:none; }
.nl-pub-links a:hover, .nl-pub-links a:focus-visible,
.nl-side a:hover, .nl-side a:focus-visible,
.nl-crumb a:hover, .nl-crumb a:focus-visible,
.nl-single-ids a:hover, .nl-single-ids a:focus-visible,
.nl-newspaper a:hover, .nl-newspaper a:focus-visible,
.nl-sitefooter a:hover, .nl-sitefooter a:focus-visible {
	color:var(--wp--preset--color--accent-dark); text-decoration:underline;
}

.nl-single-tags a { text-decoration:none; }
.nl-single-tags a:hover, .nl-single-tags a:focus-visible {
	border-color:var(--wp--preset--color--accent); background:var(--wp--preset--color--accent-soft);
	color:var(--wp--preset--color--accent-dark);
}

/* A research area pill is a filter control. It keeps its group colour on hover —
   deepened text, a solid border — rather than reverting to the generic accent,
   because the colour is what identifies the area. */
/* font:inherit is here to strip the browser's own button type, but it is a
   shorthand: it was also resetting the weight and the line height the pill sets
   two rules up, so the same pill rendered at 400/1.65 as a link and 550/1.5 as a
   button - a pixel and a half taller, and visibly lighter, in the same row. The
   two properties the pill owns are restated rather than inherited. */
a.nl-tag,
button.nl-tag { text-decoration:none; cursor:pointer; font:inherit; font-size:var(--wp--preset--font-size--meta); line-height:1.5; font-weight:550; transition:background .15s, border-color .15s, color .15s; }
a.nl-tag:hover, a.nl-tag:focus-visible,
button.nl-tag:hover, button.nl-tag:focus-visible {
	/* The pill already sits on its group's soft tint, so hover has to go a step
	   deeper than that to register. 22% of the group colour on white clears 4.5:1
	   against the dark text in all three groups; the border goes solid. */
	background:color-mix(in srgb, var(--g) 22%, var(--wp--preset--color--base)); border-color:var(--g); color:var(--g-dark);
}

.nl-siteheader .wp-block-navigation a { color:var(--wp--preset--color--muted); text-decoration:none; }
.nl-siteheader .wp-block-navigation a:hover,
.nl-siteheader .wp-block-navigation a:focus-visible { color:var(--wp--preset--color--accent-dark); }
/* Sizes, the current-page rule and the dropdown live in section 2. */

/* ---------------------------------------------------------------- home page
   Research areas as a list in a column beside the introduction: group heading,
   area names, nothing else. The cards with their descriptions and counts still
   run on the Research page, where there is room to read them. */
.nl-arealist { display:flex; flex-direction:column; gap:var(--wp--custom--space--lg); }
/* --g is the pathogen colour, set once on .nl-g-* near the top of this file and
   used by every component that carries a group. This rule had its own parallel
   set of variables, two of which were the wrong colour. */
.nl-agroup { padding-left:var(--wp--custom--space--md); border-left:3px solid var(--g, var(--wp--preset--color--rule)); }
.nl-main .nl-agrouplabel,
.editor-styles-wrapper .nl-agrouplabel {
	font-family:var(--wp--preset--font-family--sans); font-size:var(--wp--preset--font-size--label); font-weight:700;
	letter-spacing:.09em; text-transform:uppercase; color:var(--wp--preset--color--faint);
	margin:0 0 var(--wp--custom--space--sm);
}
.nl-arealist ul { list-style:none; margin:0; padding:0; }
.nl-arealist li + li { margin-top:var(--wp--custom--space--sm); }
/* Each area is a picture and a name on one line. The picture comes from the
   illustration library, cropped square there, so it only needs sizing here. */
.nl-arealist a {
	display:flex; align-items:center; gap:var(--wp--custom--space--md);
	font-family:var(--wp--preset--font-family--serif); font-size:var(--wp--preset--font-size--lede); line-height:1.3;
	text-decoration:none;
}

/* The hero image slot is an empty Group block, not an Image block. An Image
   block with no picture chosen is dropped entirely by core on render, which is
   why nothing appeared here before. A group survives being empty, so it can hold
   the space and draw a placeholder; add an Image block inside it and :empty stops
   matching, the dashes go, and the picture fills the frame. */
.nl-main .nl-heroph,
.editor-styles-wrapper .nl-heroph { margin:0 0 var(--wp--custom--space--xl); aspect-ratio:16 / 10; border-radius:var(--wp--custom--radius); overflow:hidden; }
.nl-heroph img { width:100%; height:100%; object-fit:cover; display:block; }
.nl-heroph > figure, .nl-heroph > .wp-block-image { margin:0; height:100%; }
.nl-heroph:empty {
	display:grid; place-items:center; color:var(--wp--preset--color--rule);
	background:var(--wp--preset--color--surface);
	border:1px dashed var(--wp--preset--color--rule);
}
.nl-heroph:empty::after {
	content:""; width:22%; max-width:110px; aspect-ratio:1 / 1; background:currentColor;
	-webkit-mask:var(--nl-imgph) center / contain no-repeat;
	        mask:var(--nl-imgph) center / contain no-repeat;
}
/* Two columns on the home page, areas on the right. */
.nl-home { gap:var(--wp--custom--space--xxxl); align-items:flex-start; }
/* The research areas heading sits beside the page title rather than under it, so
   it steps down a size: at the page-title size the two competed. */
.nl-main .nl-home h2,
.editor-styles-wrapper .nl-home h2 { font-size:var(--wp--preset--font-size--large); }
.nl-home .nl-lede { margin-bottom:var(--wp--custom--space--xl); }
.nl-main .nl-single-h,
.editor-styles-wrapper .nl-single-h {
	font-size:var(--wp--preset--font-size--label); font-weight:700; letter-spacing:.09em; text-transform:uppercase;
	color:var(--wp--preset--color--faint); margin:var(--wp--custom--space--xl) 0 var(--wp--custom--space--md); font-family:var(--wp--preset--font-family--sans);
}
/* Reads as the page heading, matching the Publications page, so a paper opens
   with the same title treatment as the list it came from. */
.nl-main .nl-pagetitle {
	font-family:var(--wp--preset--font-family--serif); font-size:var(--wp--preset--font-size--xx-large);
	font-weight:600; line-height:1.06; letter-spacing:-0.018em;
	color:var(--wp--preset--color--contrast); margin-top:0;
}
/* No measure of its own: .nl-single-main already holds the column to 66ch, and a
   second ch-based cap here would narrow the paragraph every time the type got
   smaller. */
.nl-single-abs p { font-size:var(--wp--preset--font-size--compact); line-height:1.7; margin:0 0 var(--wp--custom--space--base); text-wrap:pretty; }
.nl-single-abs p:last-child { margin-bottom:0; }
.nl-single-noabs { font-size:var(--wp--preset--font-size--medium); color:var(--wp--preset--color--muted); font-style:italic; margin:var(--wp--custom--space--lg) 0 0; }

.nl-single-aside { position:sticky; top:1.5rem; }
.nl-main .nl-aside-h,
.editor-styles-wrapper .nl-aside-h {
	font-size:var(--wp--preset--font-size--label); font-weight:700; letter-spacing:.09em; text-transform:uppercase;
	color:var(--wp--preset--color--faint); margin:0 0 var(--wp--custom--space--sm); font-family:var(--wp--preset--font-family--sans);
}
.nl-single-aside > .nl-aside-h ~ .nl-aside-h,
.nl-single-aside > * + .nl-aside-h { margin-top:var(--wp--custom--space--xl); }
.nl-aside-pubs { list-style:none; margin:0; padding:0; }
.nl-aside-pubs li { padding:var(--wp--custom--space--sm) 0; border-top:1px solid var(--wp--preset--color--rule); }
.nl-aside-pubs li:first-child { border-top:0; padding-top:0; }
.nl-aside-pubs a {
	display:block; font-family:var(--wp--preset--font-family--serif); font-size:var(--wp--preset--font-size--small);
	line-height:1.35; color:var(--wp--preset--color--contrast); text-decoration:none;
}
.nl-aside-yr { display:block; font-size:var(--wp--preset--font-size--label); color:var(--wp--preset--color--faint); margin-top:var(--wp--custom--space--xxxs); }
.nl-aside-plain { display:block; font-family:var(--wp--preset--font-family--serif); font-size:var(--wp--preset--font-size--small); line-height:1.35; }
/* PlumX sizes its own widget and ignores data-width, so this takes the width
   back. Everything needs !important because their root carries an inline
   min-width of 310px; the markup asks for data-hide-print, which drops the large
   plum print graphic and accounts for most of the rest.
   If PlumX ever changes these class names the overrides simply stop matching and
   the widget goes back to overflowing, which is visible rather than broken. */
.nl-metrics { margin-top:var(--wp--custom--space--xl); max-width:100%; overflow:hidden; }
.nl-metrics > div, .nl-metrics > a { max-width:100%; }
.nl-metrics img, .nl-metrics svg { max-width:100%; height:auto; }
.nl-metrics .PlumX-Details { min-width:0 !important; width:100% !important; }
.nl-metrics .PlumX-Details .ppd-container,
.nl-metrics .PlumX-Details .ppd-rows,
.nl-metrics .PlumX-Details .ppd-row { min-width:0 !important; width:100% !important; }
.nl-metrics .PlumX-Details .ppd-box {
	width:100% !important; min-width:0 !important; box-sizing:border-box !important;
}
.nl-metrics .PlumX-Details li { width:auto !important; min-width:0 !important; }
/* The widget colors its category headings for its own palette, which lands at
   1.7:1 on white for Mentions. The colored rule above each box keeps the coding. */
.nl-metrics .PlumX-Details .ppd-title { color:var(--wp--preset--color--muted) !important; }
/* Their type runs a couple of points larger than the rest of this column. */
.nl-metrics .PlumX-Details, .nl-metrics .PlumX-Details * {
	font-size:var(--wp--preset--font-size--meta) !important; line-height:1.45 !important;
}

.nl-list-plain .nl-pub:last-child { border-bottom:0; }

/* Hiding, not re-rendering: the reason filtering no longer flashes. */
.is-hidden { display:none !important; }
.nl-animate .nl-pub, .nl-animate .nl-newsitem { animation:nl-in .22s ease both; }
@keyframes nl-in { from { opacity:0; transform:translateY(3px); } to { opacity:1; transform:none; } }

/* ---------------------------------------------------------------- filters */
.nl-filters {
	background:var(--wp--preset--color--surface); border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius);
	padding:var(--wp--custom--space--base) var(--wp--custom--space--lg); margin:var(--wp--custom--space--xl) 0 var(--wp--custom--space--lg);
}

/* Every field shares the row rather than holding a fixed width, so Search keeps
   its place on the line instead of wrapping once a fifth menu appears. Search
   takes a double share; the checkbox takes only what it needs. */
.nl-frow { display:flex; gap:var(--wp--custom--space--md); flex-wrap:wrap; align-items:flex-end; }
.nl-field { margin:0; display:flex; flex-direction:column; flex:1 1 150px; min-width:0; }
.nl-field-grow { flex:2 1 200px; }
.nl-field-check { flex:0 0 auto; justify-content:flex-end; }
.nl-field select, .nl-field input[type=search], .nl-field .nl-combo { width:100%; }
.nl-field label { font-size:var(--wp--preset--font-size--label); color:var(--wp--preset--color--faint); font-weight:640; letter-spacing:.03em; margin-bottom:var(--wp--custom--space--xxs); }
.nl-filters select, .nl-filters input[type=search] {
	font:inherit; font-size:var(--wp--preset--font-size--small); padding:var(--wp--custom--space--xs) var(--wp--custom--space--sm);
	border:1px solid var(--wp--custom--control--border); border-radius:var(--wp--custom--radius-control); background:var(--wp--preset--color--base); color:var(--wp--preset--color--contrast);
	min-width:0; max-width:100%;
}
.nl-filters select:hover, .nl-filters input[type=search]:hover { border-color:var(--wp--custom--control--border-strong); }

/* Searchable country combobox. The real <select> stays in the DOM and keeps the
   value; this is the visible control layered on top, so the filter still works
   with JavaScript off. Follows the ARIA combobox-with-listbox pattern. */
.nl-combo { position:relative; display:flex; }
.nl-combo-input {
	font:inherit; font-size:var(--wp--preset--font-size--small); padding:var(--wp--custom--space--xs) var(--wp--custom--space--xl) var(--wp--custom--space--xs) var(--wp--custom--space--sm);
	border:1px solid var(--wp--custom--control--border); border-radius:var(--wp--custom--radius-control); background:var(--wp--preset--color--base);
	color:var(--wp--preset--color--contrast); min-width:0; width:100%; max-width:100%;
}
.nl-combo-input:hover { border-color:var(--wp--custom--control--border-strong); }
.nl-combo-input::placeholder { color:var(--wp--preset--color--muted); opacity:1; }
.nl-combo-toggle {
	position:absolute; right:1px; top:1px; bottom:1px; width:1.75rem;
	border:0; background:none; cursor:pointer; padding:0;
	display:grid; place-items:center; color:var(--wp--preset--color--muted);
}
.nl-combo-toggle::after {
	content:""; width:.42rem; height:.42rem; margin-top:-var(--wp--custom--space--xxxs);
	border-right:1.5px solid currentColor; border-bottom:1.5px solid currentColor;
	transform:rotate(45deg);
}
.nl-combo-input[aria-expanded="true"] + .nl-combo-toggle { color:var(--wp--preset--color--accent); }

/* Sizes to its longest label instead of to the field, so an indented entry like
   "H5N1 and highly pathogenic avian influenza" does not force a sideways scroll. */
.nl-combo-list {
	position:absolute; z-index:30; top:calc(100% + 4px); left:0; min-width:100%;
	width:max-content; max-width:min(26rem, 88vw);
	max-height:17rem; overflow:hidden auto; margin:0; padding:var(--wp--custom--space--xxs) 0; list-style:none;
	background:var(--wp--preset--color--base); border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius);
	box-shadow:var(--wp--custom--shadow--md);
}
.nl-combo-list [role="option"] {
	padding:var(--wp--custom--space--xxs) var(--wp--custom--space--md); font-size:var(--wp--preset--font-size--small); cursor:pointer; white-space:nowrap;
	overflow:hidden; text-overflow:ellipsis;
	color:var(--wp--preset--color--contrast);
}
/* One tiering rule for every menu: a heading sits flush and everything belonging
   to it is indented. Top-level entries — All areas, Other disease systems,
   Global / multi-region — stay flush, which is what marks them as top level. */
.nl-combo-list [role="option"].is-nested { padding-left:var(--wp--custom--space--xl); }
.nl-combo-list [role="option"]:hover { background:var(--wp--preset--color--surface); }
.nl-combo-list [role="option"].is-active {
	background:var(--wp--preset--color--accent); color:var(--wp--preset--color--base);
}
.nl-combo-list [role="option"][aria-selected="true"] { font-weight:640; }
/* Shared by every menu: research areas, countries and publication type. */
.nl-combo-group {
	padding:var(--wp--custom--space--sm) var(--wp--custom--space--md) var(--wp--custom--space--xxxs); 	font-size:var(--wp--preset--font-size--label); letter-spacing:.06em; text-transform:uppercase;
	color:var(--wp--preset--color--faint);
}
.nl-combo-group + [role="option"] { padding-top:var(--wp--custom--space--xxs); }
.nl-combo-none { padding:var(--wp--custom--space--xs) var(--wp--custom--space--md); font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--muted); }
.nl-check {
	display:flex; align-items:center; gap:var(--wp--custom--space--xs); font-size:var(--wp--preset--font-size--small);
	color:var(--wp--preset--color--muted); cursor:pointer; padding:var(--wp--custom--space--xs) 0;
}
.nl-check input { width:1rem; height:1rem; accent-color:var(--wp--preset--color--accent); }

.nl-resultbar {
	display:flex; justify-content:space-between; align-items:center; gap:var(--wp--custom--space--base); flex-wrap:wrap;
	margin-top:var(--wp--custom--space--base); padding-top:var(--wp--custom--space--base); border-top:1px solid var(--wp--preset--color--rule);
}
.nl-count { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--muted); margin:0; }
.nl-count strong { color:var(--wp--preset--color--contrast); font-variant-numeric:tabular-nums; font-weight:500; font-size:var(--wp--preset--font-size--medium); }
/* Reads as an action rather than as prose, and only appears when a filter is
   actually on, so its presence is the signal that something is filtered. */
.nl-clear {
	display:inline-flex; align-items:center; gap:var(--wp--custom--space--xxs);
	font:inherit; font-size:var(--wp--preset--font-size--small); line-height:1.5; font-weight:600;
	/* .4375rem is 7px: the xs step is 7.2px, and the fifth of a pixel is what
	   made the label sit low. Whole pixels above and below, as on every pill. */
	padding:.5rem var(--wp--custom--space--base) .4375rem;
	color:var(--wp--preset--color--accent-dark);
	background:var(--wp--preset--color--accent-soft);
	border:1px solid var(--wp--preset--color--accent-tint);
	border-radius:var(--wp--custom--radius-pill);
	cursor:pointer; transition:background .15s, color .15s, border-color .15s;
}
.nl-clear::before { content:"\00d7"; font-size:1.15em; line-height:1; font-weight:400; }
.nl-clear:hover, .nl-clear:focus-visible {
	background:var(--wp--preset--color--accent-dark); color:var(--wp--preset--color--base);
	border-color:var(--wp--preset--color--accent-dark);
}
.nl-clear[hidden] { display:none; }
.nl-activechips { display:flex; gap:var(--wp--custom--space--xs); flex-wrap:wrap; flex:1; }
.nl-chipx {
	display:inline-flex; align-items:center; gap:var(--wp--custom--space--xxs); font-size:var(--wp--preset--font-size--meta); line-height:1.5; font-weight:550;
	background:var(--wp--preset--color--accent-soft); color:var(--wp--preset--color--accent-dark);
	border:1px solid var(--wp--preset--color--accent-tint); border-radius:var(--wp--custom--radius-pill); padding:.25rem .3em .1875rem .7em;
}
.nl-chipx button {
	background:none; border:0; cursor:pointer; color:var(--wp--preset--color--accent-dark);
	font-size:var(--wp--preset--font-size--medium); line-height:1; padding:0 .25em; border-radius:50%;
}
.nl-chipx button:hover { background:var(--wp--preset--color--accent-tint); }

/* ---------------------------------------------------------------- map */
.nl-maprow { display:grid; grid-template-columns:minmax(0,1fr) var(--wp--custom--aside); gap:var(--wp--custom--space--lg); align-items:start; margin-bottom:var(--wp--custom--space--base); }
.nl-mapbox { margin:0; border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius); overflow:hidden; background:var(--wp--preset--color--base); }
.nl-mapbox svg { display:block; width:100%; height:auto; }
.nl-mapbox path { stroke:var(--wp--preset--color--base); stroke-width:.5; fill:var(--wp--custom--map--0); transition:fill .18s ease, opacity .18s ease; }
.nl-mapbox path.d1{fill:var(--wp--custom--map--1)} .nl-mapbox path.d2{fill:var(--wp--custom--map--2)} .nl-mapbox path.d3{fill:var(--wp--custom--map--3)}
.nl-mapbox path.d4{fill:var(--wp--custom--map--4)} .nl-mapbox path.d5{fill:var(--wp--custom--map--5)}
.nl-mapbox path.hit { cursor:pointer; }
.nl-mapbox path.hit:hover { stroke:var(--wp--preset--color--contrast); stroke-width:1.2; }
/* Chrome draws its own focus ring around an SVG shape's bounding box, which on a
   country reads as a rectangle bolted to the map - and a mouse click focuses the
   shape, so it appeared on click and stayed until focus moved. Suppressed for
   every focus state; the stroke below is the indicator, and it follows the
   border of the country instead of boxing it in. */
.nl-mapbox path:focus { outline:none; }
.nl-mapbox path:focus-visible { stroke:var(--wp--preset--color--contrast); stroke-width:2; outline:none; }
.nl-mapbox path.sel { stroke:var(--wp--preset--color--contrast); stroke-width:1.8; }
/* Shaded only because it shares a paper with the picked region, so it recedes. */
.nl-mapbox path.co { opacity:.38; }
/* The region outline. A solid copy of each member country, filtered into a ring
   around the union of them all (see nl-ring in nl.js), sitting above the map. */
.nl-mapbox #nl-halo { pointer-events:none; }
.nl-mapbox #nl-halo path { fill:var(--wp--preset--color--violet); stroke:none; transition:none; }
/* The pointer label. Fixed rather than absolute because .nl-mapbox clips its
   overflow, and a country near the edge would otherwise lose its label. */
.nl-maptip {
	position:fixed; z-index:50; pointer-events:none; white-space:nowrap;
	background:var(--wp--preset--color--contrast-soft); color:var(--wp--preset--color--base);
	font-size:var(--wp--preset--font-size--meta); font-weight:500; line-height:1.35;
	padding:var(--wp--custom--space--xxs) var(--wp--custom--space--sm);
	border-radius:var(--wp--custom--radius-control); box-shadow:var(--wp--custom--shadow--md);
}
.nl-maptip[hidden] { display:none; }

.nl-mapside { display:flex; flex-direction:column; gap:var(--wp--custom--space--base); }
/* Region chips. One per region with a count, plus one for papers that report no
   single country. A chip with a count of zero is hidden by nl.js rather than
   shown at 0, so the list shrinks to whatever the current filters can reach. */
.nl-rchips[hidden] { display:none; }
.nl-rchipwrap { display:flex; flex-direction:column; gap:var(--wp--custom--space--xxs); }
.nl-rchip {
	display:grid; grid-template-columns:2.2em 1fr; align-items:baseline; gap:var(--wp--custom--space--xs);
	width:100%; text-align:left; font:inherit; cursor:pointer;
	border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius-control);
	background:var(--wp--preset--color--base); padding:var(--wp--custom--space--xxs) var(--wp--custom--space--sm);
	transition:border-color .15s, background .15s;
}
.nl-rchip[hidden] { display:none; }
.nl-rchip:hover { border-color:var(--wp--custom--control--border-strong); }
.nl-rchip[aria-pressed="true"] { border-color:var(--wp--preset--color--violet); background:var(--wp--preset--color--violet-soft); }
.nl-rnum { font-variant-numeric:tabular-nums; font-size:var(--wp--preset--font-size--subhead); font-weight:600; color:var(--wp--preset--color--violet); line-height:1.35; text-align:right; }
.nl-rlab { font-size:var(--wp--preset--font-size--meta); color:var(--wp--preset--color--contrast); font-weight:600; line-height:1.4; }

/* The circled i beside a label, and what it opens. Not a title attribute: those
   never appear on touch and read unevenly with a screen reader. */
.nl-tipwrap { position:relative; display:inline-flex; align-items:center; }
.nl-info {
	display:inline-flex; align-items:center; justify-content:center;
	width:1.5em; height:1.5em; padding:0; flex:0 0 auto;
	border:1px solid var(--wp--preset--color--accent); border-radius:var(--wp--custom--radius-pill);
	background:var(--wp--preset--color--accent-soft); color:var(--wp--preset--color--accent-dark);
	font:inherit; font-size:var(--wp--preset--font-size--label); font-weight:700; font-style:italic;
	line-height:1; cursor:help; transition:background .15s, color .15s;
}
.nl-info:hover, .nl-info[aria-expanded="true"] {
	background:var(--wp--preset--color--accent); color:var(--wp--preset--color--base);
}
/* Dark, like the label that follows the pointer on the map: on a white page with
   pale panels a white tooltip disappears into what it is sitting on. */
.nl-infotip {
	position:absolute; z-index:60; top:calc(100% + 8px); right:0; width:272px; max-width:74vw;
	background:var(--wp--preset--color--contrast-soft); color:var(--wp--preset--color--base);
	border-radius:var(--wp--custom--radius-control); box-shadow:var(--wp--custom--shadow--md);
	padding:var(--wp--custom--space--sm) var(--wp--custom--space--md);
	font-size:var(--wp--preset--font-size--meta); font-weight:400; line-height:1.5;
	letter-spacing:normal; text-transform:none; text-align:left;
}
.nl-infotip[hidden] { display:none; }

.nl-legend { font-size:var(--wp--preset--font-size--meta); color:var(--wp--preset--color--muted); }
.nl-legend-t {
	display:flex; align-items:center; gap:var(--wp--custom--space--xxs);
	margin:0 0 var(--wp--custom--space--xs); font-weight:600;
	color:var(--wp--preset--color--contrast); font-size:var(--wp--preset--font-size--meta);
}
.nl-scale { display:flex; height:10px; border-radius:var(--wp--custom--radius-control); overflow:hidden; border:1px solid var(--wp--preset--color--rule); }
.nl-scale i { flex:1; }
.nl-scale .m0{background:var(--wp--custom--map--0)} .nl-scale .m1{background:var(--wp--custom--map--1)} .nl-scale .m2{background:var(--wp--custom--map--2)}
.nl-scale .m3{background:var(--wp--custom--map--3)} .nl-scale .m4{background:var(--wp--custom--map--4)} .nl-scale .m5{background:var(--wp--custom--map--5)}
.nl-ends { display:flex; justify-content:space-between; font-size:var(--wp--preset--font-size--label); color:var(--wp--preset--color--faint); margin:var(--wp--custom--space--xxs) 0 0; }
.nl-tip { font-size:var(--wp--preset--font-size--meta); color:var(--wp--preset--color--muted); min-height:2.8em; margin:0;
	border-top:1px solid var(--wp--preset--color--rule); padding-top:var(--wp--custom--space--sm); }

.nl-tablefb { margin:0 0 var(--wp--custom--space--sm); }
.nl-tablefb summary { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--accent); cursor:pointer; padding:var(--wp--custom--space--xxs) 0; font-weight:550; }
.nl-tablewrap { max-height:320px; overflow:auto; border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius); margin-top:var(--wp--custom--space--sm); }
.nl-geotable { width:100%; border-collapse:collapse; font-size:var(--wp--preset--font-size--small); }
.nl-geotable th, .nl-geotable td { text-align:left; padding:var(--wp--custom--space--xs) var(--wp--custom--space--md); border-bottom:1px solid var(--wp--preset--color--rule); }
.nl-geotable th { color:var(--wp--preset--color--faint); font-weight:640; font-size:var(--wp--preset--font-size--label); text-transform:uppercase;
	letter-spacing:.06em; position:sticky; top:0; background:var(--wp--preset--color--surface); }
.nl-geotable td.n { text-align:right; font-variant-numeric:tabular-nums; font-size:var(--wp--preset--font-size--meta); }

/* ---------------------------------------------------------------- area cards */
.nl-areas { margin:var(--wp--custom--space--base) 0; }
.nl-pgroup { margin-bottom:var(--wp--custom--space--xxl); }
.nl-grouplabel {
	font-family:var(--wp--preset--font-family--sans); font-size:var(--wp--preset--font-size--label); letter-spacing:.11em; text-transform:uppercase; font-weight:700;
	color:var(--g-dark); margin:0 0 var(--wp--custom--space--base); display:flex; align-items:center; gap:var(--wp--custom--space--md);
}
.nl-grouplabel::before { content:""; width:26px; height:3px; border-radius:var(--wp--custom--radius-control); background:var(--g); }
.nl-grouplabel::after { content:""; flex:1; height:1px; background:var(--wp--preset--color--rule); }

.nl-cards { display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:var(--wp--custom--space--base); }
.nl-card {
	position:relative; border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius);
	padding:var(--wp--custom--space--lg) var(--wp--custom--space--lg) var(--wp--custom--space--base); background:var(--wp--preset--color--base); text-decoration:none; display:flex;
	flex-direction:column; overflow:hidden;
	transition:border-color .16s, box-shadow .16s, transform .16s;
}
.nl-card::before { content:""; position:absolute; inset:0 0 auto 0; height:3px; background:var(--g); }
.nl-card:hover { border-color:color-mix(in srgb, var(--g) 40%, var(--wp--preset--color--rule));
	box-shadow:var(--wp--custom--shadow--sm); transform:translateY(-2px); text-decoration:none; }
.nl-card h4 { font-family:var(--wp--preset--font-family--serif); font-size:var(--wp--preset--font-size--subhead); margin:0 0 var(--wp--custom--space--sm); color:var(--wp--preset--color--contrast); font-weight:640; line-height:1.32; letter-spacing:-0.008em; }
.nl-card p { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--muted); margin:0 0 var(--wp--custom--space--base); line-height:1.55; flex:1; }
.nl-cardmeta { font-size:var(--wp--preset--font-size--meta); color:var(--g-dark); font-weight:600; display:flex;
	align-items:center; justify-content:space-between; gap:var(--wp--custom--space--sm); }
.nl-arrow { transition:transform .16s; }
.nl-card:hover .nl-arrow { transform:translateX(3px); }

/* ---------------------------------------------------------------- area page */

/* ---------------------------------------------------------------- people */
.nl-peoplesection { margin-bottom:var(--wp--custom--space--xxxl); }
.nl-sectionnote { color:var(--wp--preset--color--muted); margin:calc(-1 * var(--wp--custom--space--sm)) 0 var(--wp--custom--space--lg); max-width:var(--wp--custom--measure); }

/* Current members: portrait over the words, four to a row on a full page. */
.nl-mcards {
	display:grid; grid-template-columns:repeat(4,minmax(0,1fr));
	gap:var(--wp--custom--space--xl) var(--wp--custom--space--lg);
	margin-bottom:var(--wp--custom--space--xl);
}
.nl-mcard { position:relative; display:flex; flex-direction:column; min-width:0; }
.nl-mportrait {
	aspect-ratio:1; width:100%; overflow:hidden; border-radius:var(--wp--custom--radius);
	border:1px solid var(--wp--preset--color--rule); background:var(--wp--preset--color--surface-2);
	margin-bottom:var(--wp--custom--space--md);
}
.nl-mportrait img, .nl-sil { width:100%; height:100%; object-fit:cover; display:block; }
.nl-sil-bg { fill:var(--wp--preset--color--surface-2); }
.nl-sil-fg { fill:var(--wp--preset--color--rule); }
.nl-mcard-body { min-width:0; }
.nl-mcard-name {
	font-family:var(--wp--preset--font-family--serif); font-size:var(--wp--preset--font-size--subhead);
	font-weight:600; line-height:1.25; letter-spacing:-0.008em; margin:0 0 var(--wp--custom--space--xxs);
}

/* One link, but the whole card is the target. */
.nl-mcard-name a::after { content:""; position:absolute; inset:0; border-radius:var(--wp--custom--radius); }
.nl-mcard:hover .nl-mportrait { border-color:var(--wp--preset--color--accent); }
.nl-mcard-name a:focus-visible::after { outline:2px solid var(--wp--preset--color--accent); outline-offset:3px; }
.nl-mcard-role { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--accent-dark); font-weight:600; margin:0 0 var(--wp--custom--space--xxs); }
.nl-mcard-focus { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--muted); margin:0; line-height:1.55; }

/* Alumni: a small portrait beside the words, no biography, at most two links. */
.nl-alums {
	list-style:none; margin:0; padding:0; display:grid;
	grid-template-columns:repeat(3,minmax(0,1fr));
	gap:var(--wp--custom--space--lg) var(--wp--custom--space--xl);
}
.nl-alum { min-width:0; display:flex; gap:var(--wp--custom--space--base); align-items:flex-start; }
.nl-alum-portrait {
	width:76px; aspect-ratio:1; flex:none; overflow:hidden; border-radius:var(--wp--custom--radius);
	border:1px solid var(--wp--preset--color--rule); background:var(--wp--preset--color--surface-2);
}
.nl-alum-portrait img, .nl-alum-portrait .nl-sil { width:100%; height:100%; object-fit:cover; display:block; }
.nl-alum-body { min-width:0; }
.nl-alum-name { font-weight:650; margin:0 0 var(--wp--custom--space--xxxs); line-height:1.3; }
.nl-alum-role { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--accent-dark); font-weight:600; margin:0 0 var(--wp--custom--space--xxxs); }
.nl-alum-affil { font-size:var(--wp--preset--font-size--meta); color:var(--wp--preset--color--faint); margin:0 0 var(--wp--custom--space--xxs); }
.nl-alum-links {
	font-size:var(--wp--preset--font-size--meta); margin:0; display:flex; flex-wrap:wrap;
	column-gap:var(--wp--custom--space--xxs); row-gap:0; align-items:baseline; line-height:1.3;
}
/* Joins the title kind above for the growing underline; these two lines say the
   rest: accent rather than text colour, and a 24px tall target. */
.nl-alum-links a { color:var(--wp--preset--color--accent); padding-block:2px; }

/* A member's own page: portrait first, one column, unlike the PI profile. */
.nl-mbio-head {
	display:flex; gap:var(--wp--custom--space--xl); align-items:flex-end;
	padding-bottom:var(--wp--custom--space--lg); margin-bottom:var(--wp--custom--space--xl);
	border-bottom:2px solid var(--wp--preset--color--contrast);
}
.nl-mbio-portrait {
	width:200px; aspect-ratio:1; flex:none; overflow:hidden; border-radius:var(--wp--custom--radius);
	border:1px solid var(--wp--preset--color--rule); background:var(--wp--preset--color--surface-2);
}
.nl-mbio-portrait img, .nl-mbio-portrait .nl-sil { width:100%; height:100%; object-fit:cover; display:block; }
.nl-mbio-id { min-width:0; }
.nl-mbio-name { font-size:var(--wp--preset--font-size--x-large); margin:0 0 var(--wp--custom--space--xs); line-height:1.15; }
.nl-mbio-role { font-size:var(--wp--preset--font-size--lede); color:var(--wp--preset--color--accent-dark); font-weight:600; margin:0 0 var(--wp--custom--space--xs); }
.nl-mbio-focus { color:var(--wp--preset--color--muted); margin:0; max-width:var(--wp--custom--measure); }
.nl-mbio-body { max-width:var(--wp--custom--measure); margin-bottom:var(--wp--custom--space--xl); }
.nl-mbio-body p { margin:0 0 var(--wp--custom--space--md); }
.nl-mbio-block { margin-bottom:var(--wp--custom--space--xl); max-width:var(--wp--custom--measure); }
.nl-mbio-block p { margin:0; color:var(--wp--preset--color--muted); }
/* The same eyebrow as .nl-aside-h on a paper page: one size and one tracking for
   this label wherever it appears. Written through .nl-main for the same reason
   that one is: the generic h2 rule is a class and an element, so a lone class
   here loses, and the uppercase tracking silently reverted to heading tracking. */
.nl-main .nl-mbio-h,
.editor-styles-wrapper .nl-mbio-h {
	font-size:var(--wp--preset--font-size--label); text-transform:uppercase; letter-spacing:.09em;
	font-weight:700; color:var(--wp--preset--color--faint); margin:0 0 var(--wp--custom--space--xs);
	font-family:var(--wp--preset--font-family--sans);
}
.nl-mbio-links { list-style:none; margin:0; padding:0; display:flex; flex-wrap:wrap; gap:var(--wp--custom--space--xs); }
.nl-mbio-links a {
	display:inline-block; font-size:var(--wp--preset--font-size--meta); line-height:1.5; color:var(--wp--preset--color--contrast);
	text-decoration:none; border:1px solid var(--wp--preset--color--contrast-soft);
	border-radius:var(--wp--custom--radius-pill); padding:.25rem .8em .1875rem; background:var(--wp--preset--color--base); font-weight:520;
}
.nl-mbio-links a:hover, .nl-mbio-links a:focus-visible { background:var(--wp--preset--color--surface); border-color:var(--wp--preset--color--contrast); }
.nl-mbio-back { margin:0; padding-top:var(--wp--custom--space--lg); border-top:1px solid var(--wp--preset--color--rule); }

/* The same frame, for a hand-built page that needs one portrait.
 *
 * The frame sits on the image rather than the figure so that the figure can span
 * its column: WordPress centres a constrained layout's children with auto margins
 * marked !important, and a figure narrower than the column would be pushed to the
 * middle. Full width with a left-aligned image inside wins that argument without
 * joining it. */
.nl-soloportrait { margin:0 0 var(--wp--custom--space--lg); width:100%; max-width:none; }
.nl-soloportrait img, .nl-soloportrait .nl-sil {
	width:220px; max-width:100%; aspect-ratio:1; object-fit:cover; display:block;
	border-radius:var(--wp--custom--radius); border:1px solid var(--wp--preset--color--rule);
	background:var(--wp--preset--color--surface-2);
}

/* ---------------------------------------------------------------- news */
.nl-newsfilters { display:flex; gap:var(--wp--custom--space--xs); flex-wrap:wrap; margin-bottom:var(--wp--custom--space--xl); }
/* An unset filter is a plain outlined button - white, dark rule, dark label - so
   the bar reads as controls rather than as a row of tags. The area's colour only
   appears on the two states that mean something: deepening under the cursor, and
   filled on the one that is on. White on the solid fill clears 4.5:1 in all three
   groups (4.88 teal, 8.74 violet, 4.93 green), so the active state can be a fill
   rather than another tint. */
.nl-chipbtn {
	font:inherit; font-size:var(--wp--preset--font-size--meta); line-height:1.5; font-weight:550;
	display:inline-flex; align-items:center; gap:.4em; cursor:pointer;
	padding:.25rem .65em .1875rem; border-radius:var(--wp--custom--radius-pill);
	background:var(--wp--preset--color--base); color:var(--wp--preset--color--contrast);
	border:1px solid var(--wp--preset--color--contrast-soft);
	transition:background .15s, color .15s, border-color .15s;
}
.nl-chipbtn:hover, .nl-chipbtn:focus-visible {
	background:color-mix(in srgb, var(--g) 22%, var(--wp--preset--color--base));
	border-color:var(--g); color:var(--g-dark);
}
.nl-chipbtn[aria-pressed="true"] {
	background:var(--g); border-color:var(--g); color:var(--wp--preset--color--base); font-weight:620;
}
.nl-chipbtn[aria-pressed="true"]:hover, .nl-chipbtn[aria-pressed="true"]:focus-visible {
	background:var(--g-dark); border-color:var(--g-dark); color:var(--wp--preset--color--base);
}
/* Other is not a pathogen group, so its hover and active states stay neutral. */
.nl-chipbtn.is-other:hover, .nl-chipbtn.is-other:focus-visible {
	background:var(--wp--preset--color--surface); color:var(--wp--preset--color--contrast);
	border-color:var(--wp--preset--color--contrast-soft);
}
.nl-chipbtn.is-other[aria-pressed="true"] {
	background:var(--wp--preset--color--contrast-soft); color:var(--wp--preset--color--base);
	border-color:var(--wp--preset--color--contrast-soft);
}
.nl-chipn { font-variant-numeric:tabular-nums; font-size:var(--wp--preset--font-size--label); opacity:.75; }
/* The involvement row: the same control, held in ink rather than in a pathogen
   colour. Two coloured rows would read as one long row of tags instead of two
   questions, and the icon is the only thing telling the three apart. */
.nl-invfilters { margin-top:calc(var(--wp--custom--space--xl) * -1 + var(--wp--custom--space--xs)); }
.nl-chipbtn.is-inv[aria-pressed="true"] {
	background:var(--wp--preset--color--contrast); border-color:var(--wp--preset--color--contrast);
	color:var(--wp--preset--color--base);
}
.nl-chipbtn.is-inv:hover, .nl-chipbtn.is-inv:focus-visible {
	background:var(--wp--preset--color--surface); color:var(--wp--preset--color--contrast);
	border-color:var(--wp--preset--color--contrast);
}
.nl-chipbtn.is-inv[aria-pressed="true"]:hover, .nl-chipbtn.is-inv[aria-pressed="true"]:focus-visible {
	background:var(--wp--preset--color--contrast-soft); border-color:var(--wp--preset--color--contrast-soft);
	color:var(--wp--preset--color--base);
}
/* The tag under an item, and the icon inside either. */
.nl-tag-inv {
	background:var(--wp--preset--color--surface); color:var(--wp--preset--color--contrast-soft);
	border-color:var(--wp--preset--color--rule);
}
a.nl-tag-inv:hover, a.nl-tag-inv:focus-visible,
button.nl-tag-inv:hover, button.nl-tag-inv:focus-visible,
.nl-tag-inv:hover, .nl-tag-inv:focus-visible {
	background:var(--wp--preset--color--surface); color:var(--wp--preset--color--contrast);
	border-color:var(--wp--preset--color--contrast);
}
.nl-invicon { flex:none; margin-right:.15em; }
.nl-invrow { margin-top:var(--wp--custom--space--xxs); }
.nl-chipbtn[aria-pressed="true"] .nl-chipn { opacity:.9; }

.nl-newslist { list-style:none; margin:0; padding:0; }
.nl-newsitem { display:flex; gap:var(--wp--custom--space--xl); padding:var(--wp--custom--space--lg) 0; border-bottom:1px solid var(--wp--preset--color--rule); }
/* Picture first, then the words. The empty variant holds the same space so a
   missing image never pulls one headline out of line with the rest. */
.nl-newsthumb { flex:0 0 auto; display:block; width:240px; height:160px; object-fit:cover;
	border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius-control); background:var(--wp--preset--color--surface); }
.nl-newsthumb.is-empty { border-style:dashed; }
.nl-newsbody { min-width:0; flex:1 1 auto; }
.nl-newstitle { font-family:var(--wp--preset--font-family--serif); margin:0 0 var(--wp--custom--space--xs); font-size:var(--wp--preset--font-size--large); font-weight:600; line-height:1.3; letter-spacing:-0.012em; }
/* Outlet and date read as one citation, so they share the meta line and the date
   drops its old column. The mono face keeps it scannable down the page. */
.nl-newsdate { font-size:var(--wp--preset--font-size--meta);
	color:var(--wp--preset--color--faint); letter-spacing:.01em; }
.nl-newstitle a { color:var(--wp--preset--color--contrast); text-decoration:none;
	background-image:linear-gradient(var(--wp--preset--color--accent),var(--wp--preset--color--accent)); background-size:0 1.5px;
	background-repeat:no-repeat; background-position:0 100%; transition:background-size .18s; }
.nl-newsmeta { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--faint); margin:0; display:flex; gap:var(--wp--custom--space--md); flex-wrap:wrap; align-items:center; }
.nl-outlet { color:var(--wp--preset--color--muted); font-weight:600; }
/* One treatment for a small explanatory line under something heavier: the note
   under a news item, the note under a collaborator tile. See also .nl-tile-note,
   which joins this rule. Space above belongs to whatever sits above the note -
   in a tile that is the title's bottom margin - so the news note, which follows
   a meta row with no margin of its own, names the same value. */
.nl-newsnote,
.nl-tile-note {
	font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--muted);
	line-height:1.55; margin:0; max-width:var(--wp--custom--measure);
}
.nl-newsnote { margin-top:var(--wp--custom--space--sm); }
/* The paper a story is about, under the headline. Labeled rather than left as a
   bare link, because on a press page a link could be anything.
   No measure limit here, unlike the note above it: paper titles are long, and a
   62ch cap wrapped them at 513px inside a 933px column for no reason. The body
   column is the bound. */
.nl-newspaper { font-size:var(--wp--preset--font-size--small); margin:var(--wp--custom--space--sm) 0 0; line-height:1.5; }
.nl-newspaper-l {
	font-size:var(--wp--preset--font-size--label); font-weight:700; letter-spacing:.07em; text-transform:uppercase;
	color:var(--wp--preset--color--faint); margin-right:var(--wp--custom--space--xs);
}
.nl-newspaper a { color:var(--wp--preset--color--accent-dark); }

.nl-newshead { margin-bottom:0; }
/* Every page put a Spacer block between its introduction and the content below.
   The gap is a design decision, not content, so it lives here instead. */
.nl-main .wp-block-post-content > .nl-lede + *,
.nl-main .wp-block-post-content > .nl-newshead + *,
.editor-styles-wrapper .wp-block-post-content > .nl-lede + *,
.editor-styles-wrapper .wp-block-post-content > .nl-newshead + * { margin-top:var(--wp--custom--space--xxl); }

/* Page columns are a content column beside an aside, so the gutter has to read as
   a separation rather than as a word space. Set here rather than per page: it was
   an inline 3rem on one page and the 1.3rem block default everywhere else. */
.nl-main .wp-block-columns,
.editor-styles-wrapper .wp-block-columns { gap:var(--wp--custom--space--xxxl); }
.nl-newshead .nl-lede { margin-bottom:0; }

/* ---------------------------------------------------------------- style guide
   One private page, drawn with the same tokens as everything else. Deliberately
   plain: it should look like documentation, and anything elaborate here would be
   a second design system to keep in step with the first. */
.nl-sg-lead { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--muted); max-width:var(--wp--custom--measure); }
.nl-sg-h3 {
	font-size:var(--wp--preset--font-size--label); font-weight:700; letter-spacing:.09em; text-transform:uppercase;
	color:var(--wp--preset--color--faint); margin:var(--wp--custom--space--xl) 0 var(--wp--custom--space--sm);
}
.nl-sg-table { width:100%; border-collapse:collapse; font-size:var(--wp--preset--font-size--small); margin:var(--wp--custom--space--base) 0 var(--wp--custom--space--xxl); }
.nl-sg-table th { text-align:left; font-size:var(--wp--preset--font-size--label); text-transform:uppercase; letter-spacing:.07em; color:var(--wp--preset--color--faint); }
.nl-sg-table th, .nl-sg-table td { border-bottom:1px solid var(--wp--preset--color--rule); padding:var(--wp--custom--space--xs) var(--wp--custom--space--sm) var(--wp--custom--space--xs) 0; vertical-align:top; }
.nl-sg-note { color:var(--wp--preset--color--faint); font-size:var(--wp--preset--font-size--label); }
.nl-sg-used code { display:block; font-size:.9em; line-height:1.5; overflow-wrap:anywhere; }
.nl-sg-badge { font-variant-numeric:tabular-nums; font-weight:600; }
.nl-sg-ok { color:var(--wp--preset--color--lime-dark); }
.nl-sg-mid { color:var(--wp--preset--color--accent-dark); }
.nl-sg-no  { color:var(--wp--preset--color--flag); }
/* A background color that cannot carry text is not an error, so it is not red. */
.nl-sg-off { color:var(--wp--preset--color--faint); }
.nl-sg-swatch { display:block; width:52px; height:26px; border-radius:var(--wp--custom--radius-control); border:1px solid var(--wp--preset--color--rule); }
.nl-sg-ramp { display:flex; gap:var(--wp--custom--space--xxs); margin:var(--wp--custom--space--sm) 0 var(--wp--custom--space--xxl); }
.nl-sg-ramp span { flex:1; }
/* The label sits under the step, not on it: on the dark end of the ramp there is
   no text color that works on all six. */
.nl-sg-ramp i { display:block; height:var(--wp--custom--space--xxl); border-radius:var(--wp--custom--radius-control); }
.nl-sg-ramp em { display:block; font-style:normal; font-size:var(--wp--preset--font-size--label); color:var(--wp--preset--color--faint); margin-top:var(--wp--custom--space--xxxs); }
.nl-sg-space > div { display:flex; align-items:center; gap:var(--wp--custom--space--sm); margin-bottom:var(--wp--custom--space--xxs); font-size:var(--wp--preset--font-size--small); }
.nl-sg-space code { min-width:4.5rem; }
.nl-sg-bar { height:12px; background:var(--wp--preset--color--accent-tint); border-radius:2px; }
.nl-sg-radii { display:flex; gap:var(--wp--custom--space--sm); flex-wrap:wrap; margin:var(--wp--custom--space--sm) 0; }
.nl-sg-r { padding:var(--wp--custom--space--sm) var(--wp--custom--space--base); background:var(--wp--preset--color--surface); border:1px solid var(--wp--preset--color--rule); font-size:var(--wp--preset--font-size--label); }
.nl-sg-list { font-size:var(--wp--preset--font-size--small); color:var(--wp--preset--color--muted); }
.nl-sg-kinds { display:grid; grid-template-columns:8rem 1fr; gap:var(--wp--custom--space--sm) var(--wp--custom--space--base); align-items:baseline; margin:var(--wp--custom--space--base) 0 var(--wp--custom--space--xxl); }
.nl-sg-kinds dt { font-size:var(--wp--preset--font-size--label); text-transform:uppercase; letter-spacing:.07em; color:var(--wp--preset--color--faint); }
.nl-sg-kinds dd { margin:0; }
.nl-sg-controls { display:flex; gap:var(--wp--custom--space--sm); flex-wrap:wrap; align-items:center; margin:var(--wp--custom--space--sm) 0; }
.nl-sg-illus { display:grid; grid-template-columns:repeat(auto-fill,minmax(96px,1fr)); gap:var(--wp--custom--space--base); margin:var(--wp--custom--space--base) 0; }
.nl-sg-illus figure { margin:0; }
.nl-sg-illus figcaption { font-size:var(--wp--preset--font-size--label); color:var(--wp--preset--color--faint); margin-top:var(--wp--custom--space--xxxs); word-break:break-word; }

/* ---------------------------------------------------------------- responsive
   Three breakpoints, and no others:
     600px  - WordPress opens the navigation as an overlay below this width.
     782px  - WordPress stacks columns below this width (and moves the admin bar).
              Rules written against it use 781px, the width just under the switch.
     900px  - ours: the map and the research area header need two columns' worth
              of room, which they still have when the page columns have stacked.
   Anything narrower is handled by the 600px block. Add a fourth only with a
   reason, or the layout starts changing at widths nothing else responds to. */
/* The map row has its own breakpoint, and here is the reason. The map is 1000
   by 480, so its height is a little under half the width it is given; the panel
   beside it is a fixed 240px of counts, legend and one line of text. Below about
   1200px the map is shorter than that panel, which looks like a mistake. So the
   panel moves under the map first, as one row of chips, well before the page
   columns stack at 900px. */
@media (max-width:1200px) {
	.nl-maprow { grid-template-columns:1fr; }
	.nl-mapside { flex-direction:row; flex-wrap:wrap; align-items:flex-start; }
	.nl-rchips { flex:1 1 240px; }
	.nl-rchipwrap { flex-direction:row; flex-wrap:wrap; gap:var(--wp--custom--space--xs); }
	.nl-rchipwrap .nl-rchip { width:auto; grid-template-columns:auto auto; gap:var(--wp--custom--space--xs); }
	.nl-legend { flex:1 1 180px; }
	.nl-tip { flex:1 1 100%; }
}

@media (max-width:900px) {
	.nl-mcards { grid-template-columns:repeat(2,minmax(0,1fr)); }
	.nl-alums { grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:600px) {
	.nl-mcards { grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--wp--custom--space--lg) var(--wp--custom--space--md); }
	.nl-alums { grid-template-columns:1fr; }
	.nl-mbio-head { flex-direction:column; align-items:flex-start; gap:var(--wp--custom--space--lg); }
	.nl-mbio-portrait { width:150px; }
	.nl-single { grid-template-columns:minmax(0,1fr); gap:var(--wp--custom--space--xxl); }
	.nl-single-aside { position:static; }
	.nl-newsitem { flex-direction:column; gap:var(--wp--custom--space--md); }
	.nl-newsthumb { width:100%; height:200px; }
	.nl-newstitle { font-size:var(--wp--preset--font-size--subhead); }
	.nl-pub { gap:var(--wp--custom--space--md); }
	.nl-single-tags, .nl-meta-row { gap:var(--wp--custom--space--xxs); }
}
@media (prefers-reduced-motion:reduce) {
	.nl *, .nl *::before, .nl *::after {
		animation-duration:.001ms !important; animation-iteration-count:1 !important;
		transition-duration:.001ms !important;
	}
	.nl-card:hover { transform:none; }
}
@media (forced-colors:active) {
	.nl-tag, .nl-card, .nl-rchip, .nl-chipbtn { border:1px solid CanvasText; }
	.nl-mapbox path.sel, .nl-mapbox path.hit:focus-visible { stroke:Highlight; stroke-width:2; }
	.nl-mapbox #nl-halo path { fill:Highlight; }
	.nl-mapbox path.co { opacity:1; }
}
@media print {
	.nl-filters, .nl-maprow, .nl-tablefb, .nl-newsfilters { display:none !important; }
	.nl-pub, .nl-newsitem { break-inside:avoid; }
}

/* ---------------------------------------------------------------- tiles
   Shared by the two sections of the Collaborations page: software/tool tiles
   written as native blocks, and the collaborator tiles from the plugin. The
   image slot is forced square with aspect-ratio so a half-filled grid still
   lines up, and the placeholder occupies that square rather than collapsing. */
.nl-tiles {
	list-style:none; margin:var(--wp--custom--space--lg) 0 0; padding:0;
	display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:var(--wp--custom--space--base);
}
.nl-tile {
	display:flex; flex-direction:column; overflow:hidden; background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--rule); border-radius:var(--wp--custom--radius);
}
.nl-tile-img {
	aspect-ratio:1 / 1; width:100%; position:relative;
	background:var(--wp--preset--color--surface); border-bottom:1px solid var(--wp--preset--color--rule);
	display:grid; place-items:center;
}
.nl-tile-img img { width:100%; height:100%; object-fit:cover; display:block; }
.nl-tile-ph { display:grid; place-items:center; color:var(--wp--preset--color--rule); }
.nl-tile-ph svg { width:34%; max-width:64px; height:auto; }
/* Native-block tiles use an empty group as the image slot. Draw the same
   placeholder while it is :empty, so dropping in an Image block clears it. */
.nl-tile-img:empty { color:var(--wp--preset--color--rule); }
.nl-tile-img:empty::after {
	content:""; width:34%; max-width:64px; aspect-ratio:1 / 1; background:currentColor;
	-webkit-mask:var(--nl-imgph) center / contain no-repeat;
	        mask:var(--nl-imgph) center / contain no-repeat;
}
.nl-tile-body { padding:var(--wp--custom--space--base) var(--wp--custom--space--base) var(--wp--custom--space--base); }
.nl-tile-t {
	font-family:var(--wp--preset--font-family--serif); font-size:var(--wp--preset--font-size--medium); font-weight:600;
	line-height:1.35; margin:0 0 var(--wp--custom--space--xxs); letter-spacing:-0.008em;
}
.nl-tile-t a { color:var(--wp--preset--color--contrast); text-decoration:none; }
.nl-tile-meta {
	font-size:var(--wp--preset--font-size--label);
	color:var(--wp--preset--color--faint); margin:0 0 var(--wp--custom--space--xs); letter-spacing:.01em;
}

/* Tool and software tiles read as a row: a square mark on the left, the name and
   note on the right. The left panel stretches to the full card height so a row of
   cards lines up, and the image is contained rather than cropped, since these are
   logos and screenshots. Three to a line on a desktop comes from the block's own
   grid: a 340px minimum column, which falls to two and then one on its own. */
.nl-tilegrid .nl-tile { flex-direction:row; align-items:stretch; }
.nl-tilegrid .nl-tile-img {
	flex:0 0 112px; width:112px; min-height:112px; align-self:stretch; aspect-ratio:auto;
	padding:var(--wp--custom--space--sm); border-bottom:0; border-right:1px solid var(--wp--preset--color--rule);
	/* These marks ship on white, so the tinted slot the collaborator tiles use
	   would read as a pale square sitting inside a paler one. */
	background:var(--wp--preset--color--base);
}
.nl-tilegrid .nl-tile-img img { width:100%; height:100%; object-fit:contain; }
.nl-tilegrid .nl-tile-body { flex:1 1 auto; min-width:0; }

/* An unfilled slot: dashed, quieter, and clearly not a real entry. */
.nl-tile.is-placeholder { border-style:dashed; background:transparent; }
.nl-tile.is-placeholder .nl-tile-img { background:transparent; border-bottom-style:dashed; }
.nl-tile.is-placeholder .nl-tile-t { color:var(--wp--preset--color--faint); font-style:italic; }

/* ============================================================================
   6. MEASURE
   The content column runs the full 1200px so headings, body copy and the wide
   components all share one left edge. Readable line length is imposed here.
   WordPress emits "margin-left:auto !important" on constrained-layout children,
   so these overrides must carry the same weight to left-align the text.
   ========================================================================= */
.editor-styles-wrapper .wp-block-post-content > p,
.editor-styles-wrapper .wp-block-post-content > ul,
.editor-styles-wrapper .wp-block-post-content > ol,
.editor-styles-wrapper .wp-block-post-content > h2,
.editor-styles-wrapper .wp-block-post-content > h3,
.editor-styles-wrapper .wp-block-post-content > h4,
.editor-styles-wrapper .wp-block-post-content > .wp-block-buttons,
.nl-main .wp-block-post-content > p,
.nl-main .wp-block-post-content > ul,
.nl-main .wp-block-post-content > ol,
.nl-main .wp-block-post-content > h2,
.nl-main .wp-block-post-content > h3,
.nl-main .wp-block-post-content > h4,
.nl-main .wp-block-post-content > .wp-block-buttons {
	max-width:var(--wp--custom--measure);
	margin-left: 0 !important;
	margin-right: auto !important;
}
.nl-main .wp-block-post-content > .nl-lede,
.editor-styles-wrapper .wp-block-post-content > .nl-lede { max-width:var(--wp--custom--measure); }
.editor-styles-wrapper .wp-block-post-content > .wp-block-separator,
.editor-styles-wrapper .wp-block-post-content > .wp-block-columns,
.editor-styles-wrapper .wp-block-post-content > .nl,
.editor-styles-wrapper .wp-block-post-content > .alignwide,
.nl-main .wp-block-post-content > .wp-block-separator,
.nl-main .wp-block-post-content > .wp-block-columns,
.nl-main .wp-block-post-content > .nl,
.nl-main .wp-block-post-content > .alignwide {
	max-width: 100%;
	margin-left: 0 !important;
	margin-right: 0 !important;
}
