/*
Theme Name: BobNiemeyer
Theme URI: https://example.com
Author: Denis G
Author URI: contact@denisgo.com
Description: Campaign site theme for Bob Niemeyer.
Version: 0.1.69
Requires at least: 6.4
Requires PHP: 8.0
License: GNU General Public License v2 or later
License URI: LICENSE
Text Domain: bobniemeyer
*/

/* ==========================================================================
   Layout
   Fix: WordPress's default root spacing (a 24px margin-block-start between
   the header/main/footer template parts) left a strip of the page's white
   background showing between the header and whatever full-bleed color
   starts the page content, breaking the seamless edge-to-edge transition
   the original site has. That core rule uses :where(), which carries zero
   specificity, so a plain selector here is enough to override it.
   ========================================================================== */

.wp-site-blocks > * {
	margin-block-start: 0;
}

/* Sticky footer: on short pages (e.g. the stub Articles/Phoenix Project
   pages), <main> grows to fill any leftover space below the content so
   the footer always sits at the bottom of the viewport instead of
   floating up right under a couple of lines of text. On tall pages,
   <main> is already taller than the leftover space has room for, so
   this has no effect — the footer just follows normally at the true end
   of the content, and the page scrolls as usual. dvh (falls back to vh
   where unsupported) accounts for mobile browser chrome showing/hiding
   as the user scrolls, which vh alone doesn't. */
.wp-site-blocks {
	display: flex;
	flex-direction: column;
	min-height: 100vh;
	min-height: 100dvh;
}

.wp-site-blocks > main {
	flex: 1 0 auto;
}

/* For logged-in admins, <html> already has margin-top:32px (46px on
   narrow viewports) added by core for the toolbar — 100vh doesn't know
   about that, so without this the sticky-footer math is off by exactly
   that amount and the page gets a few pixels of pointless scroll. Same
   breakpoint core itself uses for the toolbar's responsive height. */
.admin-bar .wp-site-blocks {
	min-height: calc(100vh - 32px);
	min-height: calc(100dvh - 32px);
}

@media (max-width: 782px) {
	.admin-bar .wp-site-blocks {
		min-height: calc(100vh - 46px);
		min-height: calc(100dvh - 46px);
	}
}

/* Always reserve space for the vertical scrollbar, even on short pages
   (e.g. the stub Articles/Phoenix Project pages) that don't need to
   scroll. Without this, the page is centered slightly differently
   depending on whether a given page happens to be tall enough to scroll,
   causing a small horizontal shift/jump when navigating between pages.

   overflow-x:hidden guards against horizontal scroll/whitespace from
   anything that's off-screen but still technically laid out — the
   Phoenix Project dropdown was the offender (see its own fix further
   down: it's fixed-width and hidden until hover, but that hidden box
   still counted toward the page's scrollable width at any viewport
   narrower than its parent nav item's position plus its own width).
   overflow-x is only set on html, not body: body also picking up an
   explicit overflow value (even just on this one axis) breaks the
   header's position:sticky in Chrome — the moment body has *any*
   declared overflow, Chrome starts treating it as the sticky element's
   containing block instead of the viewport, and a sticky element with
   no scrollable ancestor of its own just scrolls away with the page. */
html {
	overflow-x: hidden;
	overflow-y: scroll;
}

/* ==========================================================================
   Editor-only: Title field label
   Now that the page-title-bar block mirrors the post title visually, the
   block editor shows the real title text twice in a row: the plain
   native Title field (WordPress's own always-present field for editing
   post_title, normally styled as a large heading), then the styled
   green title bar block right below it. Rather than adding a *third*,
   separate read-only copy, the native field itself is restyled down to
   a compact "Page Title: " row — same field, same cursor, still the one
   and only place you type the title, just visually smaller and labeled.
   The label is a ::before on the wrapper (a plain static string, fine
   to stay uppercase); the input's own text keeps its typed casing —
   only the label should shout, not the user's actual title. Both are
   flex items sharing one row so they sit side by side above the
   underline. Never touches the front end (these classes don't exist
   outside the block editor's iframe).
   ========================================================================== */

.edit-post-visual-editor__post-title-wrapper {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.4em;
	max-width: var(--wp--style--global--content-size);
	margin-left: auto;
	margin-right: auto;
	padding-bottom: 0.5rem;
	border-bottom: 1px solid #ddd;
}

.edit-post-visual-editor__post-title-wrapper::before {
	content: "Page Title:";
	flex: 0 0 auto;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: #757575;
}

.edit-post-visual-editor__post-title-wrapper .editor-post-title__input {
	flex: 1 1 auto;
	min-width: 0;
	margin: 0 !important;
	padding: 0 !important;
	font-size: 0.75rem !important;
	font-weight: 700 !important;
	letter-spacing: 0.08em !important;
	text-transform: none !important;
	color: var(--wp--preset--color--dark-green) !important;
}

/* ==========================================================================
   Header
   Fix: the original site painted the header with a fixed-width raster
   image (background-size:auto; no-repeat; centered) that only covered
   ~1900px. Any viewport wider than that showed a hard seam where the
   image ended. A CSS gradient has no fixed width, so it always covers
   the full header with no seam, at any viewport size or zoom level.
   ========================================================================== */

/*
 * Mobile/desktop split at 480px: wide enough to cover every current
 * mainstream phone in portrait — iPhone SE/12–16 (375–430px CSS width)
 * and Samsung Galaxy S/A-series (360–480px) — while a rotated phone in
 * landscape (~650px+) or a tablet gets the desktop header, which has
 * plenty of room for the nav either way.
 */

/* The template-part block wraps header.html in its own <header>, sized to
   exactly the header's own content height. Sticky positioning is bounded by
   an element's containing block, so putting it on .site-header (nested one
   level inside that wrapper) only holds up to the wrapper's own height —
   past that it detaches and scrolls away. Putting it on the wrapper itself
   works because the wrapper's parent (.wp-site-blocks) spans the whole page. */
/* The header's own height shrinks as --header-progress animates on scroll.
   Left on, the browser's scroll-anchoring feature tries to compensate for
   that layout shift by nudging the scroll position back to keep the page
   visually stable — which fights small scroll movements (e.g. a single
   wheel tick) right as the animation starts. Disabling it document-wide
   is the reliable fix; scoping overflow-anchor to just the header isn't
   enough, since the anchor node the browser picks to compensate around
   can be any element below it whose position shifted. */
html {
	overflow-anchor: none;
}

header.wp-block-template-part {
	position: sticky;
	top: 0;
	z-index: 100;
}

/* WordPress pushes the whole page down by the admin toolbar's height for
   logged-in users (32px, 46px on narrow viewports) so it doesn't cover
   the top of the page — but that only affects normal document flow. Our
   sticky header still pins to the literal top of the viewport, which is
   underneath the toolbar (it's fixed, with a very high z-index), so once
   scrolled the compact header's top ~32px ends up hidden behind it. Pin
   below the toolbar instead, matching the same breakpoint WordPress uses
   for its own responsive toolbar height. */
.admin-bar header.wp-block-template-part {
	top: 32px;
}

/* At this same breakpoint, though, WordPress core itself switches
   #wpadminbar from position:fixed to position:absolute — it stops
   tracking the viewport and scrolls away with the page like any other
   content. Reserving 46px for it here (as if it were still pinned)
   left a 46px gap above the sticky header once scrolled past that
   point, since by then the toolbar has already scrolled out of view
   and nothing actually occupies that space any more. Below 782px the
   toolbar can never be onscreen at the same time as a scrolled sticky
   header, so there's nothing to clear — same top:0 as the no-admin-bar
   case. */
@media (max-width: 782px) {
	.admin-bar header.wp-block-template-part {
		top: 0;
	}
}

/* A soft gradient fade under the header at all times — including at the
   very top of the page, before any scroll — so the header always reads as
   a distinct layer above the content rather than blending into whatever
   color starts the page below it (most noticeably the home hero, which
   uses this same green). Scrolling adds a firmer box-shadow on top of
   this once the header goes compact (see .site-header below). */
header.wp-block-template-part::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: -100px;
	height: 100px;
	background: linear-gradient(to bottom, rgba(0, 0, 0, 0.18), transparent);
	pointer-events: none;
}

.site-header {
	--header-progress: 0;
	background: var(--wp--preset--gradient--header-green);
	box-shadow: 0 2px 10px rgba(0, 0, 0, calc(var(--header-progress) * 0.25));
}

/* WP core duplicates some of the <nav>'s own classes (including
   "wp-block-navigation") onto its child <ul class="wp-block-navigation__
   container">, so a plain ".wp-block-navigation" selector matches both
   and doubles the padding. "nav.wp-block-navigation" targets only the
   actual <nav> element. */
.site-header nav.wp-block-navigation {
	/* Header height is now just this fixed padding plus whatever the nav
	   content needs — 15px stays constant whether the header is full or
	   compact, and whether the links fit on one line or wrap to a second.
	   The logo and font-size still animate with --header-progress below;
	   only the padding no longer does. padding-inline keeps the logo and
	   buttons off the viewport edge at every width, not just mobile —
	   the header is alignfull, so without it there's nothing else
	   guaranteeing that space once the viewport gets narrower than the
	   1200px contentSize it's constrained to. */
	padding-block: 15px;
	padding-inline: 30px;
}

.site-header .wp-block-navigation__container {
	padding-block: 0;
}

.site-header .wp-block-navigation__container {
	/* The logo (replacing "Home") and the rest of the links are one flex
	   group, centered as a unit on the viewport. When they all fit on one
	   line the whole row is centered; once there's no more room, items
	   wrap in DOM order — so the logo (first) is never displaced and
	   always anchors the left of the first line, while the right-most
	   links are the ones pushed to a second line. */
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	column-gap: 60px;
	row-gap: 14px;
}

.site-header .wp-block-navigation a,
.site-header .wp-block-navigation .wp-block-navigation-item {
	color: #fff;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	letter-spacing: 0.02em;
	text-transform: uppercase;
	/* Desktop: full size at the top of the page, shrinking to the compact
	   size in step with --header-progress, same as the logo and padding. */
	font-size: calc(1.25rem - 0.4375rem * var(--header-progress, 0));
}

.site-header .wp-block-navigation a:hover {
	color: var(--wp--preset--color--accent-yellow);
}

/* Current-page highlighting: the top-level button for the page you're on
   (or, for Phoenix Project, any of its child pages — see the
   "current-menu-ancestor" class added by core's own navigation-submenu
   renderer once one of its children is marked current below) turns the
   same yellow used on hover. Classes are added in PHP (see functions.php)
   since these are plain "custom" links with no linked post ID for core's
   own current-page detection to key off of. */
.site-header .wp-block-navigation .wp-block-navigation-item.current-menu-item,
.site-header .wp-block-navigation .wp-block-navigation-item.current-menu-item > a,
.site-header .wp-block-navigation .wp-block-navigation-item.current-menu-ancestor,
.site-header .wp-block-navigation .wp-block-navigation-item.current-menu-ancestor > a,
.site-header .wp-block-navigation .wp-block-navigation-item.current-menu-ancestor > button {
	color: var(--wp--preset--color--accent-yellow);
}

.site-header .wp-block-navigation__submenu-icon {
	display: none;
}

/* The Phoenix Project submenu (Preamble, Declaration, Articles 1-7),
   styled to match the original: a solid dark green panel (not the
   default white), soft shadow, fixed width, and a 0.2s fade-in — with
   light gray link text that fills solid on hover, rather than just
   changing color. Also reset the li's own color (not just the link's):
   core's own ".wp-block-navigation-item__content.wp-block-navigation-
   item__content" rule sets the link to color:inherit at a specificity
   our plain link rule below can't beat, so it was inheriting the white
   set on the surrounding .wp-block-navigation-item li — !important
   settles both. */
.site-header .wp-block-navigation__submenu-container {
	background-color: var(--wp--preset--color--dark-green) !important;
	box-shadow: 1px 1px 30px rgba(0, 0, 0, 0.06);
	/* !important throughout: core's own submenu-container rules (e.g. the
	   focus-within/open-state selector that sets min-width, and the
	   :not(.has-background) one that sets border) chain enough classes
	   and pseudo-classes to out-specificity a plain descendant selector. */
	min-width: 290px !important;
	transition: opacity 0.2s ease-in !important;
	border-left: none !important;
	border-right: none !important;
	border-bottom: none !important;
	border-top: 2px solid #fff !important;
}

.site-header .wp-block-navigation__submenu-container,
.site-header .wp-block-navigation__submenu-container .wp-block-navigation-item {
	color: #fff !important;
}

.site-header .wp-block-navigation__submenu-container a {
	color: #fff !important;
	font-family: var(--wp--preset--font-family--body);
	font-size: 14px;
	text-transform: none;
	font-weight: 400;
	letter-spacing: normal;
	/* Override the site-wide clickable-area expansion (padding + negative
	   margin) below: a dropdown item is already a full-width block, so it
	   doesn't need that trick, and the original's hover fill should cover
	   exactly this padded box, not overflow it. */
	padding: 12px 20px !important;
	margin: 0 !important;
	display: block !important;
}

.site-header .wp-block-navigation__submenu-container a:hover {
	color: #fff !important;
	background-color: #00846e;
}

/* The submenu item matching the current page: text stays white like the
   rest (the yellow current/hover color is reserved for the main header
   buttons), just filled with the same solid background used on hover. */
.site-header .wp-block-navigation__submenu-container .wp-block-navigation-item.current-menu-item > a {
	background-color: #00846e !important;
}

/* Expand the clickable/tappable area around each link and the logo beyond
   their visible text/image bounds. Padding grows the hit area; the equal
   negative margin pulls the box back to its original visual footprint, so
   the 60px gap between items and the header's own 15px padding still
   measure the same — only the invisible hit target is bigger. */
.site-header .wp-block-navigation-item__content {
	padding: 14px 10px;
	margin: -14px -10px;
}

.site-header .custom-logo-link {
	display: inline-block;
	padding: 14px 10px;
	margin: -14px -10px;
}

/* Higher specificity than the block library's own ".wp-block-site-logo img"
   default (width:120px), which would otherwise cap the image's rendered
   size below our intended max-height. */
.site-header .site-logo img {
	/* Desktop: 75px full height at the top of the page, shrinking to 50px
	   compact in step with --header-progress. */
	max-height: calc(75px - 25px * var(--header-progress, 0));
	width: auto;
	/* Undo core's own "img{max-width:100%}" normalize: without this, once
	   the header's own layout (flex or the tablet grid below) gets tight
	   on horizontal space, the browser shrinks the logo itself to fit its
	   box rather than letting it keep its height-driven size — the logo
	   should only ever change size via --header-progress above, never by
	   being squeezed for room. */
	max-width: none;
}

/* Between the ~730px point where the single-row desktop nav naturally
   fits and the width where the logo (now fixed-size, never shrinking —
   see the max-width:none rule above) and the button columns can no
   longer both fit with a comfortable gap, the header used to just rely
   on flex-wrap to break the line wherever it ran out of room — landing
   anywhere from 1 to 4 items on the second line depending on exact
   width. This makes the break deliberate instead: 3 columns (logo, then
   a fixed 2x2 grid of the 4 links — "Who Is Bob" + "Phoenix Project" on
   the first row, "Articles" + "Volunteer" on the second) centered as a
   group with equal 60px gaps between all 3 columns, regardless of
   exactly how wide the viewport is within this range. Below 730px, the
   tighter block further down takes over instead, and below 480px the
   phone block replaces this with its own centered/logo-on-top layout. */
@media (min-width: 730px) and (max-width: 1100px) {
	.site-header .wp-block-navigation__container {
		display: grid;
		grid-template-columns: auto auto auto;
		justify-content: center;
		align-items: center;
		column-gap: 60px;
		row-gap: 10px;
	}

	.site-header .wp-block-navigation__container > .wp-block-navigation-item:first-child {
		grid-row: 1 / 3;
		align-self: center;
	}

	.site-header .wp-block-navigation__container > .wp-block-navigation-item {
		justify-content: center;
	}

	.site-header .wp-block-navigation-item__content {
		text-align: center;
	}

	/* Same overflow as the ≤480px block below: "Phoenix Project" sits in
	   the right column of the 3-column layout above, and its dropdown
	   (fixed-width 290px, see its own rules further down) is positioned
	   relative to that trigger by default — pushing it past the right
	   viewport edge for most of this range. Fixed and centered on the
	   viewport instead, same as mobile, so it can't contribute to
	   horizontal scroll regardless of where its trigger sits. */
	.site-header .wp-block-navigation__submenu-container {
		position: fixed !important;
		left: 50% !important;
		right: auto !important;
		top: 50% !important;
		transform: translate(-50%, -50%);
		width: calc(100vw - 40px) !important;
		max-width: 290px !important;
		max-height: calc(100vh - 40px);
		overflow-y: auto;
		min-width: 0 !important;
	}
}

/* Below 730px there's no longer room for the logo (fixed-size, never
   shrinking) plus both button columns at a comfortable 60px gap without
   overflowing — the 60px gap that range uses is a nice-to-have, not
   load-bearing, so this range drops it to a tight 12px instead of
   changing the actual column layout. That alone isn't enough on its own
   to fit all the way down to 480px, so text is also left free to wrap
   within each button (as it already does on phones) rather than forcing
   the two button columns to stay single-line — the browser then shrinks
   each column only as far as wrapping requires, same shape as the block
   above (logo | 2x2 button grid), just narrower. */
@media (min-width: 481px) and (max-width: 729px) {
	.site-header .wp-block-navigation__container {
		display: grid;
		grid-template-columns: auto auto auto;
		justify-content: center;
		align-items: center;
		column-gap: 12px;
		row-gap: 10px;
	}

	.site-header .wp-block-navigation__container > .wp-block-navigation-item:first-child {
		grid-row: 1 / 3;
		align-self: center;
	}

	.site-header .wp-block-navigation__container > .wp-block-navigation-item {
		justify-content: center;
	}

	.site-header .wp-block-navigation-item__content {
		text-align: center;
	}

	/* Same overflow as the ≤480px block below: "Phoenix Project" sits in
	   the right column, and its dropdown (fixed-width 290px, see its own
	   rules further down) is positioned relative to that trigger by
	   default — pushing it past the right viewport edge through most of
	   this range. Fixed and centered on the viewport instead, same as
	   mobile, so it can't contribute to horizontal scroll regardless of
	   where its trigger ends up. */
	.site-header .wp-block-navigation__submenu-container {
		position: fixed !important;
		left: 50% !important;
		right: auto !important;
		top: 50% !important;
		transform: translate(-50%, -50%);
		width: calc(100vw - 40px) !important;
		max-width: 290px !important;
		max-height: calc(100vh - 40px);
		overflow-y: auto;
		min-width: 0 !important;
	}
}

@media (max-width: 480px) {
	/* On phones the header is a plain, fixed-size bar that scrolls away
	   with the page — no sticky pin, no shrink-on-scroll — matching the
	   original site's mobile behavior (only its desktop header stuck to
	   the top and animated; mobile just scrolled normally). relative,
	   not static: the header's own ::after gradient strip (further down)
	   is positioned absolute with bottom:-100px, anchored to whichever
	   ancestor is itself positioned — on desktop that's this element via
	   its sticky positioning, but a plain static element isn't a
	   positioning context at all, so the gradient would jump to whatever
	   positioned ancestor is next up the tree instead of sitting flush
	   under the header. relative keeps it anchored here without
	   reintroducing the sticky pin — top is reset to auto since, unlike
	   with position:static, a relative element still honors an inherited
	   top offset; without this it kept the `.admin-bar` rules' top:32px/
	   46px (meant only for the sticky pin further up this file), pushing
	   the header down that far for logged-in users and leaving a blank
	   gap above it. The plain-tag selector alone isn't specific enough to
	   beat `.admin-bar header.wp-block-template-part` (a class beats two
	   tags), so it's repeated below with that same class prefix. */
	header.wp-block-template-part {
		position: relative;
		top: auto;
	}

	.admin-bar header.wp-block-template-part {
		top: auto;
	}

	.site-header {
		box-shadow: none;
	}

	.site-header nav.wp-block-navigation {
		/* padding-inline: 30px now lives on the base rule above, applying
		   at every width — only the vertical padding still needs its own
		   smaller mobile value here. */
		padding-block: 0.85rem;
	}

	.site-header .wp-block-navigation a,
	.site-header .wp-block-navigation .wp-block-navigation-item {
		font-size: 1.25rem;
	}

	.site-header .site-logo img {
		max-height: 150px;
		/* Re-enables shrink-to-fit here, undoing the max-width:none from
		   the base rule above. That rule exists to stop the logo being
		   squeezed by cramped flex/grid siblings at tablet widths — not a
		   concern here, since the logo has its own full-width row (see
		   grid-column:1/-1 below) with nothing beside it to compete with.
		   But at max-height:150px the logo's natural width (~454px) is
		   wider than this entire breakpoint, so without a cap here it
		   would hold that width regardless of viewport and force
		   horizontal scroll. 100% caps it to the row's own content width
		   — which already excludes the nav's padding-inline, so the
		   30px edge padding is kept either way. */
		max-width: 100%;
	}

	/* Logo gets its own centered row, then the remaining 4 nav items (Who
	   Is Bob, Phoenix Project, Articles, Volunteer) form a centered 2x2
	   grid below it — a single `gap` sets row-gap and column-gap to the
	   same value, so the spacing between the two buttons on a line and
	   between the two lines themselves match exactly. A plain flex-wrap
	   can't guarantee 2-per-line here: it wraps wherever the available
	   width runs out, which shifts with item text length instead of
	   landing on a fixed 2+2 split. */
	.site-header .wp-block-navigation__container {
		display: grid;
		grid-template-columns: repeat(2, auto);
		justify-content: center;
		justify-items: center;
		gap: 20px;
	}

	.site-header .wp-block-navigation__container > .wp-block-navigation-item:first-child {
		grid-column: 1 / -1;
	}

	/* At the narrow end of this range (e.g. ~430px), "Phoenix Project"
	   wraps onto two lines inside its grid cell — its content link
	   defaults to text-align:start, which would leave "Phoenix" and
	   "Project" both flush left instead of centered on each other. */
	.site-header .wp-block-navigation-item__content {
		text-align: center;
	}

	/* The Phoenix Project dropdown is fixed-width (290px, see its own
	   rules further down) and, on desktop, positioned relative to its
	   trigger — fine there, but "Phoenix Project" sits in the right
	   column of the 2x2 grid above, so that same relative positioning
	   pushes a 290px-wide box further right than most phone screens are
	   wide, well past the viewport edge. It's unreachable by touch
	   anyway (there's no hover on mobile), so this switches it to
	   position:fixed and centers it on the viewport directly instead of
	   relative to the trigger — both un-doing the overflow and keeping
	   it centered regardless of screen width, and taking it out of the
	   page's own layout entirely so it can't contribute to horizontal
	   scroll/whitespace no matter where its trigger ends up. */
	.site-header .wp-block-navigation__submenu-container {
		position: fixed !important;
		left: 50% !important;
		right: auto !important;
		top: 50% !important;
		transform: translate(-50%, -50%);
		width: calc(100vw - 40px) !important;
		max-width: 290px !important;
		max-height: calc(100vh - 40px);
		overflow-y: auto;
		min-width: 0 !important;
	}
}

/* ==========================================================================
   Buttons
   Fix: the site's buttons (e.g. "Learn More About Bob") had lost their
   padding/border/background rules and rendered as bare text. These
   styles give every button explicit padding, a visible border or fill,
   and a hover state, so a button always looks like a button.
   ========================================================================== */

.wp-block-button__link {
	padding: 14px 32px !important;
	font-size: 1rem;
	letter-spacing: 0.03em;
	text-transform: uppercase;
	transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}

/* Default (no style selected): solid dark green fill, for light backgrounds. */
.wp-block-button__link {
	background-color: var(--wp--preset--color--dark-green);
	color: #fff;
	border: 1px solid var(--wp--preset--color--dark-green);
}

.wp-block-button__link:hover {
	background-color: var(--wp--preset--color--mid-green);
	border-color: var(--wp--preset--color--mid-green);
	color: #fff;
}

/* Outline style: for use on white/light sections. */
.is-style-brand-outline .wp-block-button__link {
	background-color: rgba(74, 213, 117, 0.15);
	color: var(--wp--preset--color--dark-green);
	border: 1px solid var(--wp--preset--color--dark-green);
}

.is-style-brand-outline .wp-block-button__link:hover {
	background-color: var(--wp--preset--color--dark-green);
	color: #fff;
}

/* Solid style for use on the dark green hero / photo backgrounds. */
.is-style-brand-solid-dark .wp-block-button__link {
	background-color: var(--wp--preset--color--bright-green);
	color: #fff;
	border: 1px solid #fff;
}

.is-style-brand-solid-dark .wp-block-button__link:hover {
	background-color: var(--wp--preset--color--hover-green);
	border-color: #fff;
}

/* Outline style for dark backgrounds — same tinted-fill-plus-border recipe
   as .is-style-brand-outline above (not a solid fill), just inverted to
   white so it stays legible on the dark green hero. Used to bring "Why I
   Am Running" visually closer to "Learn More About Bob" instead of the
   heavier solid-fill treatment. */
.is-style-brand-outline-light .wp-block-button__link {
	background-color: rgba(255, 255, 255, 0.15);
	color: #fff;
	border: 1px solid #fff;
}

.is-style-brand-outline-light .wp-block-button__link:hover {
	background-color: #fff;
	color: var(--wp--preset--color--dark-green);
}

/* ==========================================================================
   Checklist (List block style)
   Fix: the original checklist used a real <li>, so the browser's own
   disc bullet showed up above the custom icon, misaligned with the
   heading text next to it. list-style:none removes the native bullet;
   the custom green circle + chevron is drawn with ::before so there is
   exactly one marker, vertically centered against the first line.
   ========================================================================== */

.is-style-checklist {
	list-style: none;
	margin: 0;
	padding: 0;
}

.is-style-checklist > li {
	position: relative;
	list-style: none;
	padding: 18px 0 18px 46px;
	border-bottom: 1px solid var(--wp--preset--color--border-gray);
}

.is-style-checklist > li:first-child {
	padding-top: 0;
}

.is-style-checklist > li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 18px;
	width: 30px;
	height: 30px;
	border-radius: 50%;
	background-color: var(--wp--preset--color--dark-green);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 12 10 16 18 8'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 14px 14px;
}

.is-style-checklist > li:first-child::before {
	top: 0;
}

.is-style-checklist ol {
	margin-top: 0.75em;
}

/* ==========================================================================
   Hero (Group block style)
   ========================================================================== */

.is-style-hero {
	background: var(--wp--preset--gradient--header-green);
	color: #fff;
	padding: 4rem 0;
}

.is-style-hero h1,
.is-style-hero h2,
.is-style-hero h3,
.is-style-hero p {
	color: #fff;
}

.is-style-hero .kicker {
	color: #fff;
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	font-size: 0.9rem;
}

.is-style-hero .headline {
	color: var(--wp--preset--color--accent-yellow);
}

.is-style-hero .quote {
	font-style: italic;
	color: var(--wp--preset--color--accent-yellow);
}

.is-style-hero .headline {
	font-size: clamp(2rem, 1.4rem + 3vw, 3.25rem) !important;
}

/* ==========================================================================
   Page title bar
   The original site puts most inner pages (and every blog post) under a
   green gradient band with the page title in large white type — the same
   gradient as the header, applied fresh within its own box.

   This lives as the *first block(s) of each page's own post-content*
   (a Group with this class, wrapping a real Post Title block — see e.g.
   the Volunteer or Constitution page content), not in the page/single
   templates. The classic post/page editor's canvas only ever renders
   post-content — template-level blocks (which is where this used to
   live) are invisible there, so the title bar never showed in the
   editor, only on the front end. Post Title is a dynamic block like any
   other, so moving it into content costs nothing (it still always shows
   the real title) and fixes that: now the whole banner, title included,
   renders identically in the editor and on the front end.
   ========================================================================== */

.page-title-bar {
	background: var(--wp--preset--gradient--header-green);
	padding: 5rem 1.5rem;
	text-align: center;
}

/* When a subtitle bar immediately follows (now a plain adjacent sibling,
   both being content blocks), the title bar needs less of its own bottom
   padding — the subtitle bar supplies the space below the whole band
   instead — so title and subtitle sit close together like the original's,
   rather than getting the full 5rem gap meant for a title with no
   subtitle. */
.page-title-bar:has(+ .page-subtitle-bar) {
	padding-bottom: 1.5rem;
}

.page-title-bar .wp-block-post-title,
.page-title-bar .wp-block-heading {
	font-size: clamp(2.25rem, 1.5rem + 3vw, 4.5rem);
	line-height: 1.1;
	margin: 0;
}

.page-title-bar .wp-block-post-date {
	display: block;
	margin-top: 0.75rem;
	opacity: 0.85;
}

/* A handful of articles replace the dynamic post-date above with a
   plain paragraph instead (a custom sub-heading string rather than the
   real publish date) — styled to match the equivalent sub-heading on
   Pages (.page-subtitle-bar p below) rather than the dimmer, smaller
   post-date treatment, since unlike a date this is real editorial
   content and reads as a heading, not a timestamp. */
.page-title-bar > p {
	color: #fff;
	font-size: 1.25rem;
	line-height: 1.6;
	margin-top: 0.75rem;
}

/* The default 24px block-gap margin would otherwise split the green band
   with a strip of white between the title bar and whatever follows it
   (post-featured-image, or a subtitle bar) — same class of bug as the
   header/main seam fixed above, just one level deeper. */
.page-title-bar + * {
	margin-block-start: 0 !important;
}

/* post-content's own top/bottom padding (see templates/page.html etc.)
   is meant as breathing room around the *regular body content*, not
   around this full-bleed title bar — alignfull only escapes its
   container's left/right padding via WordPress's own negative-margin
   trick, not top/bottom, so left as plain padding it was pushing the
   title bar itself down, away from the header, instead of pushing the
   content below it down away from the title bar. Zero it off here when
   the title bar leads, and add the same amount back as margin on
   whatever directly follows the title bar (or subtitle bar) *unless*
   that's the featured image or a subtitle bar, which should stay flush
   against the title bar with no gap at all. */
.wp-block-post-content:has(> .page-title-bar:first-child) {
	padding-top: 0 !important;
}

/* Same fix as above, for the "Who Is Bob" page's dark-green bio intro
   band (.bio-hero) — it's a different full-bleed leading section (a
   two-column photo/heading layout instead of a centered title), but hits
   the identical post-content top-padding gap when it's first in the
   content. */
.wp-block-post-content:has(> .bio-hero:first-child) {
	padding-top: 0 !important;
}

/* The default 24px block-gap margin would otherwise split the two
   dark-green bands (bio intro, then the "Make A Difference" CTA) with a
   strip of white between them — same class of bug as the header/main
   seam and the page-title-bar one above, just between these two full-
   bleed sections instead. */
.bio-hero + * {
	margin-block-start: 0 !important;
}

.page-title-bar + *:not(.page-subtitle-bar):not(.wp-block-post-featured-image) {
	margin-block-start: 80px !important;
}

.page-subtitle-bar + *,
.wp-block-post-featured-image + * {
	margin-block-start: 80px !important;
}

/* Optional subtitle band: any page can follow its title bar with this
   block (a full-width green group, same gradient) to continue it
   visually — title and subtitle read as one header, rather than the
   subtitle looking like ordinary body content below it. Pages that don't
   need one just don't include the block. */
.page-subtitle-bar {
	background: var(--wp--preset--gradient--header-green);
	padding: 0 1.5rem 3rem;
	text-align: center;
}

.page-subtitle-bar p {
	color: #fff;
	font-size: 1.25rem;
	line-height: 1.6;
	margin: 0;
}

/* Core deliberately excludes .alignleft/.alignright from the constrained
   layout's per-child max-width + auto-margin centering (so floated images
   can bleed out to the full, un-constrained post-content block) — which
   here meant a right-floated image sat flush with the viewport edge
   instead of the 1170px content column's edge. Pull it back in by the
   same half-the-leftover-space math the centered children use. */
.wp-block-post-content.is-layout-constrained > .alignright {
	margin-right: max(0px, calc((100% - var(--wp--style--global--content-size)) / 2));
}

.wp-block-post-content.is-layout-constrained > .alignleft {
	margin-left: max(0px, calc((100% - var(--wp--style--global--content-size)) / 2));
}

/* ==========================================================================
   Phoenix Project document notes
   The Phoenix Project articles (Preamble, Declaration, Article 1-7) are
   raw legal-document HTML, and use plain <blockquote> tags for callout
   notes interspersed with the numbered sections. On the original site
   these render as a distinct highlighted box, not a plain italic quote —
   matched here exactly (color/spacing pulled from the live site).
   ========================================================================== */
.phoenix-doc blockquote {
	background-color: #f5f5f5;
	border-left: 4px solid #65bc7b;
	margin: 36px 40px;
	padding: 15px;
	font-style: italic;
	font-size: 18px;
	line-height: 26px;
	color: #000;
}

.phoenix-doc blockquote p {
	margin: 0;
}

/* ==========================================================================
   Blog list (Query Loop)
   Used both by the Articles page and the Home page's "Read some of Bob's
   Stories" section, so both share the exact same row styling — see the
   .blog-list rules further down.
   ========================================================================== */

.cta-cover .wp-block-cover__inner-container {
	padding-top: 4rem;
	padding-bottom: 4rem;
}

/* Home page's white/light-background sections only (Who Is Bob, Issues
   Facing Oregon, Read some of Bob's Stories) — keeps their heading and
   content off the viewport edge on narrow screens, where they'd otherwise
   sit flush against it (unlike the hero and CTA cover sections, which
   already carry their own side padding). Applied to each section's outer
   group so heading, body, and (where present) the blog-list rows below
   it all share one consistent inset, rather than padding living on the
   query block alone. */
.home-side-padding {
	padding-left: 30px;
	padding-right: 30px;
}

/* Fluid font-size (clamp) lives on the heading block's own inline style
   (set via its typography.fontSize attribute) rather than here — a fixed
   !important rule used to live here and silently pin it back to a static
   3.5rem, overriding that clamp() entirely regardless of viewport width. */
.cta-cover .cta-heading {
	max-width: 768px;
}

/* Each list item is a plain <li> with no link of its own — the post title's
   own <a> is stretched via ::after to cover the full row (the standard
   "stretched link" pattern), so clicking or tapping anywhere in the row
   (date and excerpt included) opens the post, while still shipping only
   one real, valid <a> per row. position:relative on the row is what the
   stretched ::after positions itself against. */
/* Pulls the whole list up by one row's worth of top padding, rather than
   zeroing out just the first row's own padding-top — every row (including
   the first) keeps the same full padding, so its hover highlight is the
   same height on top as every other row's; only the list's start position
   shifts up to compensate, keeping "The Beaver" flush with the page top
   as before. */
.blog-list .wp-block-post-template {
	margin-top: -1.75rem;
}

.blog-list .wp-block-post {
	position: relative;
	padding: 1.75rem 1.25rem;
	margin: 0 -1.25rem;
	border-bottom: 1px solid var(--wp--preset--color--border-gray);
	transition: background-color 0.15s ease;
}

.blog-list .wp-block-post:hover {
	background-color: var(--wp--preset--color--tint-green);
}

.blog-list .wp-block-post-title,
.blog-list .wp-block-post-title a {
	font-family: var(--wp--preset--font-family--card-heading);
	font-size: 2rem;
	color: #3a4149;
	margin: 0;
}

.blog-list .wp-block-post-title a::after {
	content: "";
	position: absolute;
	inset: 0;
}

.blog-list .wp-block-post-date {
	/* Pinned to the bottom-left corner (matching the row's own padding) so
	   it sits on the same line as "Read More…", which is bottom-right in
	   normal flow — independent of the two blocks' order in the markup. */
	position: absolute;
	left: 1.25rem;
	bottom: 1.75rem;
	color: #767676;
	font-size: 0.85rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	white-space: nowrap;
}

.blog-list .wp-block-post-excerpt {
	/* Core's default block-spacing margin-bottom on this wrapper would
	   otherwise leave a gap below "Read More…" before the row's own
	   padding starts, throwing off its alignment with the absolutely
	   positioned date (anchored to that padding edge) below. */
	margin-bottom: 0;
}

.blog-list .wp-block-post-excerpt__more-text {
	text-align: right;
	margin: 0.5em 0 0;
}

.blog-list .wp-block-post-excerpt__more-link {
	/* Above the title's stretched ::after (which otherwise covers the full
	   row) so this link stays independently clickable/hoverable rather
	   than just visually sitting on top of it. */
	position: relative;
	z-index: 1;
	font-weight: 700;
	font-size: 0.85rem;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: var(--wp--preset--color--dark-green);
	text-decoration: none;
}

.blog-list .wp-block-post-excerpt__more-link:hover {
	color: var(--wp--preset--color--mid-green);
}

.wp-block-query-pagination {
	margin-top: 2rem;
	font-weight: 600;
	justify-content: center;
	gap: 1.5rem;
}

.wp-block-query-pagination-numbers {
	display: flex;
	gap: 0.85rem;
}

/* ==========================================================================
   Footer
   ========================================================================== */

.site-footer {
	background-color: var(--wp--preset--color--dark-green);
	color: #fff;
	padding: 3rem 0 2rem;
}

.site-footer a {
	color: #fff;
}

.site-footer a:hover {
	color: var(--wp--preset--color--accent-yellow);
}

.site-footer .disclaimer {
	font-size: 0.8rem;
	opacity: 0.75;
}

/* ==========================================================================
   Volunteer form ([volunteer_form] shortcode — see functions.php)
   ========================================================================== */

.volunteer-form {
	max-width: 700px;
	margin: 0 auto;
}

.form-honeypot {
	position: absolute;
	left: -9999px;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

.form-columns {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 0 1.5rem;
}

@media (max-width: 600px) {
	.form-columns {
		grid-template-columns: 1fr;
	}
}

.form-row {
	margin-bottom: 1rem;
}

.form-row input,
.form-row textarea {
	width: 100%;
	box-sizing: border-box;
	padding: 0.75rem 1rem;
	border: 1px solid var(--wp--preset--color--border-gray);
	border-radius: 2px;
	font-family: var(--wp--preset--font-family--body);
	font-size: 1rem;
}

.form-row textarea {
	resize: vertical;
}

.form-row input:focus,
.form-row textarea:focus {
	outline: none;
	border-color: var(--wp--preset--color--mid-green);
}

.form-how-label {
	font-weight: 700;
	margin-bottom: 0.5rem;
}

.form-how-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 0.5rem 1rem;
	margin-bottom: 1.5rem;
}

@media (max-width: 600px) {
	.form-how-grid {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 480px) {
	.form-how-grid {
		grid-template-columns: 1fr;
	}
}

.form-checkbox {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	font-size: 0.95rem;
}

.form-checkbox input {
	width: auto;
}

.form-submit-row {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 1rem;
	flex-wrap: wrap;
	margin-bottom: 1.5rem;
}

.form-notice {
	max-width: 700px;
	margin: 0 auto 1.5rem;
	padding: 1rem;
	border-radius: 2px;
	font-weight: 700;
}

.form-notice-error {
	background-color: #fdecea;
	color: #b3261e;
	border: 1px solid #b3261e;
}

.form-confirmation {
	max-width: 700px;
	margin: 0 auto;
	padding: 3rem 2rem;
	text-align: center;
	background-color: var(--wp--preset--color--tint-green);
	border: 1px solid var(--wp--preset--color--mid-green);
	border-radius: 2px;
}

.form-confirmation h3 {
	margin: 0 0 0.5rem;
	color: var(--wp--preset--color--dark-green);
}

.form-confirmation p {
	margin: 0;
}

/* ==========================================================================
   Misc
   ========================================================================== */

.is-style-checklist ol li {
	margin-bottom: 0.5em;
}
