/* Lodge Sites Engine — baseline frontend styles.
   Colors are never hardcoded here — they come from the 5 CSS custom
   properties the selected Organization Profile palette resolves to
   (see LSE_Color_Palettes::get_css_vars(), applied as a :root block
   by LSE_Plugin::enqueue_frontend_assets()). Swapping the palette in
   wp-admin re-colors every page without touching this file. */

/* Applied to <body> itself, not just .lse-site-header/.lse-page's own
   centered content boxes, so the palette background fills the gap
   between them too — otherwise that gap shows the page's unstyled
   default background instead of the selected palette. Blended toward
   --lse-color-heading rather than left flat, so the page behind
   .lse-site-header and the .lse-page content panel (see both further
   down) reads as a distinct third layer rather than matching either
   of them exactly. Deliberately hardcoded to 100% here, NOT
   var(--lse-chrome-intensity) — only the .lse-page panel responds to
   the admin's Page Background Intensity setting; the body layer
   behind it stays at full strength regardless. Plain var(--lse-color-bg)
   declared first as the color-mix()-unsupported fallback, same
   reasoning as .lse-card below.

   Scoped to the static .lse-classic class every Classic page's <body>
   now carries (see templates/classic/partials/lse-header.php), and
   qualified with an extra `html` ancestor, purely to raise specificity
   to (0,1,2) so this reliably beats GroupBrief's body.gb-frontend
   (0,1,1) no matter which plugin's stylesheet loads later. GroupBrief's
   own pages never carry .lse-classic, so they're unaffected. */
html body.lse-classic {
	background-color: var( --lse-color-bg );
	background-color: color-mix( in srgb, var( --lse-color-heading ) 100%, var( --lse-color-bg ) );
}

/* Shared max content width for Classic's header, page panel, and footer — one
   variable so the three stay locked together (mirrors Modern's
   --lse-modern-width) instead of three independent hardcoded numbers. */
body.lse-classic {
	--lse-classic-width: 1100px;
}

/* Shared card treatment — Philanthropy blocks, History blocks, F&B
   Specials, and the F&B Menu wrapper all add this one class rather
   than duplicating the same background/border/radius/padding four
   times over (see each page's own section further down for where
   it's applied). Background is a lighter, off-white derivative of the
   page's own --lse-color-bg — every current palette's bg is already a
   light/pastel tone, so mixing toward white keeps a card feeling like
   part of the same palette rather than introducing an unrelated
   color. The plain var(--lse-color-bg) fallback declared first is for
   browsers old enough not to support color-mix(): an unsupported
   value invalidates just that one declaration, leaving the earlier
   one in place — no @supports block needed for that fallback to work. */
.lse-card {
	box-sizing: border-box;
	background-color: var( --lse-color-bg );
	background-color: color-mix( in srgb, var( --lse-color-bg ) 68%, white 32% );
	border: 1px solid var( --lse-color-accent );
	border-radius: 12px;
	padding: 1.25rem 1.5rem;
}

/* Vertical divider between the two columns of every two-column layout
   on the site (Philanthropy, History, F&B, Hall Rental) — one shared
   class, applied to whichever element is the *second* column in each
   layout's own markup, rather than four separate implementations.
   Only active above 760px: each layout's own flex-wrap threshold
   (worked out from that pair's flex-basis values + the 2rem gap —
   the highest is F&B/Hall Rental's sidebar+main pairing, ~692px) sits
   below that, so by the time this media query turns the border on,
   every layout is guaranteed to already be showing its columns side
   by side, not stacked. A border-left declared unconditionally would
   otherwise survive the wrap and show up as an orphaned line above a
   stacked second column on narrow viewports — this is what avoids
   that. */
@media ( min-width: 760px ) {
	.lse-col-divider {
		border-left: 1px solid var( --lse-color-accent );
		padding-left: 1.5rem;
	}
}

/* The site's visually distinct content panel — .lse-site-header and
   .lse-site-footer deliberately stay outside it (plain flat
   --lse-color-bg, untouched), so it reads as one floating panel
   between them against the now-tinted body behind it (see body,
   above — body itself is fixed at 100% intensity; only this panel
   responds to the admin's Page Background Intensity setting). Same
   color-mix()-with-plain-fallback pattern as body's own background,
   just driven by var(--lse-chrome-intensity) and blended toward
   --lse-color-accent instead of --lse-color-heading.
   Top/bottom margin plus top padding are new here specifically so the
   rounded corners and shadow have visible breathing room on every
   side instead of butting flush against the header or the page's own
   title text. */
.lse-page {
	max-width: var(--lse-classic-width);
	margin: 1.5rem auto 2rem;
	padding: 1.5rem 1rem 2rem;
	background-color: var( --lse-color-bg );
	background-color: color-mix( in srgb, var( --lse-color-accent ) var( --lse-chrome-intensity ), var( --lse-color-bg ) );
	border-radius: 16px;
	box-shadow: 0 4px 24px rgba( 0, 0, 0, 0.08 );
	color: var( --lse-color-text );
	font-family: var( --lse-font-body );
}

/* At .lse-page's full 100% intensity, its background is the palette's
   pure, unblended Accent color — against which --lse-color-text and
   --lse-color-heading both fail WCAG contrast for 4 of the 5 palettes,
   and --lse-color-accent-colored links/buttons become literally
   invisible (same color as their own background). Below 100% (85% and
   under), .lse-page blends enough toward the plain --lse-color-bg tone
   that all of these stay legible as-is — so every rule below only
   takes effect when <body> carries the lse-chrome-full class, which
   PHP adds only when the saved Page Background Intensity is exactly
   '100' (see LSE_Plugin::add_chrome_body_class()).
   .lse-page's own `color` above is what most plain text (paragraphs,
   list items, labels, ...) already gets by simple inheritance, so
   overriding just that one declaration flips all of it at once — no
   need to enumerate every paragraph/list selector individually.
   Headings and links/buttons that set their OWN explicit color
   (--lse-color-heading / --lse-color-accent) need their own matching
   override instead, listed explicitly below — audited against every
   template to find each one that renders directly on this panel
   (i.e. NOT already inside .lse-card, .lse-fnb-menu-card, or another
   nested light-background container, which keep their own always-off-
   white background regardless of intensity and are reset back to
   normal further below so this override can't leak into them). */
body.lse-chrome-full .lse-page {
	color: var( --lse-color-on-accent );
}

body.lse-chrome-full .lse-page a,
body.lse-chrome-full .lse-button-secondary {
	color: var( --lse-color-on-accent );
}

body.lse-chrome-full .lse-page-header h1,
body.lse-chrome-full .lse-officer-roster h2,
body.lse-chrome-full .lse-officer-position,
body.lse-chrome-full .lse-calendar-grid-section h2,
body.lse-chrome-full .lse-philanthropy-column-title,
body.lse-chrome-full .lse-fnb-hours h2,
body.lse-chrome-full .lse-fnb-specials h2,
body.lse-chrome-full .lse-history-column-title,
body.lse-chrome-full .lse-rental-facility h2,
body.lse-chrome-full .lse-rental-contact h2,
body.lse-chrome-full .lse-rental-hall-photos h2,
body.lse-chrome-full .lse-rental-amenities h2,
body.lse-chrome-full .lse-rental-fees h2,
body.lse-chrome-full .lse-rental-policies h2,
body.lse-chrome-full .lse-rental-policy-title,
body.lse-chrome-full .lse-about-section-title {
	color: var( --lse-color-on-accent );
}

/* Nested light-background containers (own background never changes
   with intensity) must NOT inherit the .lse-chrome-full override
   above — reset back to normal, unconditionally, regardless of
   intensity. Every other card-nested element with its own explicit
   color (e.g. .lse-philanthropy-block-title, .lse-fnb-menu-item-price)
   is unaffected either way, since a direct color rule on an element
   always wins over an inherited one. */
.lse-card,
.lse-fnb-menu-card,
.lse-private-club-disclaimer,
.lse-entertainment-policy-note,
.lse-notice {
	color: var( --lse-color-text );
}

/* The plugin-owned sitewide header (see templates/partials/lse-header.php)
   — site identity + primary nav together, on every page. It renders
   outside <main class="lse-page">, so it carries its own
   max-width/centering/background rather than inheriting .lse-page's —
   otherwise it would sit as an unstyled, full-bleed strip above a
   centered, palette-colored page. Bottom padding matches the 1.5rem
   the old per-page <h1> used to provide, so removing that duplicate
   from Home leaves no spacing gap. */
/* Fixed 20% Accent blend, independent of the admin-adjustable
   --lse-chrome-intensity panel setting (see .lse-page) -- this one
   never changes when that dropdown changes. Plain var(--lse-color-bg)
   declared first as the color-mix()-unsupported fallback, same
   pattern as .lse-card. */
.lse-site-header {
	max-width: var(--lse-classic-width);
	margin: 0 auto;
	padding: 2rem 1rem;
	background-color: var( --lse-color-bg );
	background-color: color-mix( in srgb, var( --lse-color-accent ) 20%, var( --lse-color-bg ) );
	color: var( --lse-color-text );
	font-family: var( --lse-font-body );
}

/* A little more room under the nav than above the logo, so a wrapped second
   row of links reads as sitting inside the card rather than falling out of
   the bottom of it. Scoped to Classic on purpose: the Modern header shares
   the .lse-site-header class (see templates/modern/partials/lse-header.php)
   and would otherwise grow its sticky bar by the same amount. */
body.lse-classic .lse-site-header {
	padding-bottom: 2.75rem;
}

/* Just the logo+name row now — width/centering/background live on
   .lse-site-header above, since a real <header> wrapper exists to
   hold that instead of the identity block standing alone.
   flex-wrap lets the name drop below the logo on narrow viewports
   instead of both being squeezed onto one cramped row. */
.lse-site-identity {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-wrap: wrap;
	gap: 1rem;
}

/* Wide/landscape logo (a wordmark, say): stack it above the name, centered,
   rather than sitting beside it. Square and vertical logos keep the default
   side-by-side row above. align-items: center (inherited) now centers the
   stack horizontally; the inherited gap: 1rem provides the vertical spacing. */
.lse-site-identity-landscape {
	flex-direction: column;
	text-align: center;
}

.lse-site-logo-img {
	max-width: 200px;
	width: auto;
	height: auto;
}

.lse-site-org-name {
	margin: 0;
	/* min-width: 0 overrides the flex item's implicit min-width:auto,
	   which otherwise stops long text from wrapping/shrinking inside
	   the flex row. Fluid size instead of one fixed value so it scales
	   with the header rather than sitting small next to a tall logo. */
	min-width: 0;
	font-size: clamp( 1.5rem, 4vw, 2.75rem );
	line-height: 1.2;
	font-weight: 700;
	text-align: center;
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

.lse-site-org-name-line2 {
	margin: 0.2em 0 0;
	min-width: 0;
	font-size: clamp( 1.2rem, 3.2vw, 2.2rem );
	line-height: 1.2;
	font-weight: 700;
	text-align: center;
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

.lse-site-nav {
	margin-top: 1rem;
}

.lse-nav-menu {
	list-style: none;
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	/* Row gap deliberately small: each link already carries 0.35rem of its
	   own vertical padding (below), so the visible space between two rows of
	   wrapped nav text is that padding twice over plus this. Modern sets its
	   own gap on .lse-modern-nav-menu at higher specificity, so this value is
	   Classic's alone. */
	gap: 0.1rem 0.75rem;
	margin: 0;
	padding: 0;
}

.lse-nav-menu li {
	position: relative;
}

.lse-nav-menu a {
	display: inline-block;
	padding: 0.35rem 0;
	color: var( --lse-color-heading );
	text-decoration: none;
	font-weight: 600;
}

.lse-nav-menu a:hover,
.lse-nav-menu a:focus {
	color: var( --lse-color-accent );
}

/* JS-inserted flex line-break (see lse-frontend.js): at 10+ nav items on
   desktop it forces the first row to hold exactly 8 items and the rest to wrap
   below. Inert unless the script adds it, so it never affects narrower screens
   or shorter menus. Shared class, so it covers both designs' nav. */
.lse-nav-menu .lse-nav-break {
	flex-basis: 100%;
	width: 100%;
	height: 0;
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Minimal footer, matching GroupBrief's own approach — legal/copyright
   only, no theme branding or widget areas. Unlike .lse-site-header and
   .lse-page, this has no background-color of its own — it sits
   directly on <body>'s own background (fixed at 100% intensity, see
   body above), so its text needs --lse-color-on-heading, not
   --lse-color-muted (designed for legibility against the plain
   --lse-color-bg tone, not the heading-tinted body). The border stays
   on --lse-color-muted -- a decorative divider, not text. */
.lse-site-footer {
	max-width: var(--lse-classic-width);
	margin: 0 auto;
	padding: 1.5rem 1rem;
	text-align: center;
	font-size: 0.85rem;
	color: var( --lse-color-on-heading );
	font-family: var( --lse-font-body );
	border-top: 1px solid var( --lse-color-muted );
}

.lse-site-copyright {
	margin: 0;
}

/* Address / phone, matching the Modern footer's own contact line. Inherits
   the footer's small on-heading typography; the phone is a tel: link and so
   needs its own color reset, same as the links block below. */
.lse-site-footer-contact {
	margin-top: 0.5rem;
}

.lse-site-footer-contact a {
	color: var( --lse-color-on-heading );
	text-decoration: none;
}

/* Terms & Conditions / Privacy Policy links. Same small, on-heading-colored
   footer typography as the copyright/extra text above; the links themselves
   are underlined for affordance against that flat body tone. */
.lse-site-footer-links {
	margin-top: 0.5rem;
	font-size: 0.85rem;
}

.lse-site-footer-links a {
	color: var( --lse-color-on-heading );
	text-decoration: underline;
}

/* Optional, blank-by-default (see Organization Info's "Additional
   Footer Text" field) -- most sites never render this at all. */
.lse-site-footer-extra {
	margin-top: 0.5rem;
}

.lse-site-footer-extra p {
	margin: 0;
}

/* The page's own title, e.g. Leadership/Contact's the_title() — kept
   distinct from .lse-site-org-name above so a page never renders two
   <h1>s just because it also shows the site identity block. */
.lse-page-header h1,
.lse-officer-roster h2 {
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

.lse-page a {
	color: var( --lse-color-accent );
}

.lse-page-header h1 {
	margin-bottom: 1.5rem;
}

.lse-home-details p,
.lse-contact-details p {
	margin: 0.5rem 0;
}

/* Reasonable reading-column width — the rest of .lse-page runs the
   full 960px, but a paragraph or two of prose reads better narrower. */
.lse-home-about {
	margin: 1.5rem 0;
}

.lse-home-about-content {
	max-width: 700px;
	margin: 0 auto;
	line-height: 1.6;
}

.lse-home-about-content :first-child {
	margin-top: 0;
}

.lse-home-about-content :last-child {
	margin-bottom: 0;
}

/* Defensive: some themes (confirmed on Twenty Twenty-Five) set an
   unusually light base body font-weight (300). The browser's default
   `strong { font-weight: bolder }` is a *relative* keyword — resolved
   against an inherited weight that low, "bolder" only steps up to 400,
   which renders visually identical to normal text. An absolute weight
   here sidesteps that relative-keyword resolution entirely. */
.lse-home-about-content strong,
.lse-home-about-content b {
	font-weight: 700;
}

.lse-hours-list {
	list-style: none;
	margin: 0.5rem 0 0;
	padding: 0;
}

.lse-hours-entry-label {
	font-weight: 600;
}

.lse-links-list {
	list-style: none;
	margin: 1.5rem 0 0;
	padding: 0;
}

.lse-links-list li {
	padding: 0.5rem 0;
	border-bottom: 1px solid var( --lse-color-muted );
}

.lse-links-list li:first-child {
	border-top: 1px solid var( --lse-color-muted );
}

/* Same fixed 20% Accent blend as .lse-site-header above, and for the
   same reason -- independent of --lse-chrome-intensity. */
.lse-private-club-disclaimer {
	margin-top: 2rem;
	padding: 1rem;
	border: 1px solid var( --lse-color-muted );
	background-color: var( --lse-color-bg );
	background-color: color-mix( in srgb, var( --lse-color-accent ) 20%, var( --lse-color-bg ) );
	font-size: 0.9rem;
}

.lse-entertainment-policy-note {
	padding: 1rem;
	border: 1px solid var( --lse-color-muted );
	background-color: var( --lse-color-bg );
	font-size: 0.9rem;
}

.lse-officer-rosters {
	display: flex;
	flex-wrap: wrap;
	gap: 2rem;
	margin-top: 1.5rem;
}

.lse-officer-roster {
	flex: 1 1 280px;
}

.lse-officer-list {
	list-style: none;
	margin: 0;
	padding: 0;
}

.lse-officer {
	display: flex;
	justify-content: space-between;
	gap: 1rem;
	padding: 0.5rem 0;
	border-bottom: 1px solid var( --lse-color-muted );
}

.lse-officer-position {
	font-weight: 600;
	color: var( --lse-color-heading );
}

.lse-photo-gallery-grid {
	display: grid;
	grid-template-columns: repeat( auto-fill, minmax( 200px, 1fr ) );
	gap: 1rem;
	margin-top: 1.5rem;
}

.lse-photo-gallery-item {
	display: block;
	border-radius: 4px;
	overflow: hidden;
	cursor: pointer;
}

.lse-photo-gallery-item-hidden {
	display: none;
}

.lse-photo-gallery-img {
	display: block;
	width: 100%;
	height: 200px;
	object-fit: contain;
}

.lse-photo-gallery-load-more-wrap {
	text-align: center;
	margin-top: 1.5rem;
}

.lse-photo-gallery-load-more {
	box-sizing: border-box;
	background-color: var( --lse-color-accent );
	color: var( --lse-color-on-accent );
	border: 2px solid var( --lse-color-on-accent );
	padding: 0.6rem 1.25rem;
	border-radius: 4px;
	font-weight: 600;
	cursor: pointer;
}

.lse-photo-gallery-load-more:hover {
	opacity: 0.9;
}

/* Full-page overlay viewer (see lse-frontend.js initLightbox()). The
   [hidden] attribute selector needs to out-rank .lse-lightbox's own
   display:flex below — the native `hidden` attribute already implies
   display:none via the UA stylesheet, but our own class rule would
   otherwise win the cascade and show it anyway. */
.lse-lightbox {
	position: fixed;
	inset: 0;
	z-index: 1000;
	display: flex;
	align-items: center;
	justify-content: center;
	background-color: rgba( 0, 0, 0, 0.85 );
}

.lse-lightbox[hidden] {
	display: none;
}

.lse-lightbox-img {
	display: block;
	max-width: 90vw;
	max-height: 85vh;
}

.lse-lightbox-close,
.lse-lightbox-prev,
.lse-lightbox-next {
	position: absolute;
	width: 2.75rem;
	height: 2.75rem;
	border: none;
	border-radius: 50%;
	background-color: rgba( 255, 255, 255, 0.15 );
	color: #fff;
	font-size: 1.75rem;
	line-height: 1;
	cursor: pointer;
}

.lse-lightbox-close:hover,
.lse-lightbox-prev:hover,
.lse-lightbox-next:hover {
	background-color: rgba( 255, 255, 255, 0.3 );
}

.lse-lightbox-close {
	top: 1rem;
	right: 1rem;
}

.lse-lightbox-prev {
	left: 1rem;
	top: 50%;
	transform: translateY( -50% );
}

.lse-lightbox-next {
	right: 1rem;
	top: 50%;
	transform: translateY( -50% );
}

/* Prevents the page behind the overlay from scrolling while it's open. */
body.lse-lightbox-open {
	overflow: hidden;
}

.lse-contact-layout {
	display: flex;
	flex-wrap: wrap;
	gap: 2rem;
	margin-top: 1.5rem;
}

.lse-contact-details {
	flex: 1 1 240px;
}

.lse-contact-form-wrap {
	flex: 2 1 360px;
}

/* Sits inside .lse-contact-details now, under the address/phone block
   — width: 100% here means "fill the column", not the full page, so
   moving it doesn't need any resize logic beyond where it's nested. */
.lse-contact-map-wrap {
	margin-top: 1rem;
}

.lse-contact-map {
	display: block;
	width: 100%;
	aspect-ratio: 16 / 9;
	border-radius: 4px;
	overflow: hidden;
	border: 1px solid var( --lse-color-muted );
}

.lse-contact-map iframe {
	display: block;
	width: 100%;
	height: 100%;
	border: 0;
}

.lse-contact-map-link:hover {
	opacity: 0.9;
}

.lse-contact-map-caption {
	margin: 0.4rem 0 0;
	font-size: 0.85rem;
}

/* Purely decorative placeholder (see templates/partials/simulated-map.php)
   — colored via the active palette, never real geographic data. */
.lse-simulated-map {
	position: relative;
	width: 100%;
	height: 100%;
}

.lse-simulated-map svg {
	display: block;
	width: 100%;
	height: 100%;
}

.lse-simulated-map-bg {
	fill: var( --lse-color-bg );
}

.lse-simulated-map-blocks rect {
	fill: var( --lse-color-muted );
	opacity: 0.25;
}

.lse-simulated-map-roads path {
	stroke: var( --lse-color-muted );
	stroke-linecap: round;
}

.lse-simulated-map-pin-shape {
	fill: var( --lse-color-accent );
}

.lse-simulated-map-pin-hole {
	fill: var( --lse-color-bg );
}

.lse-simulated-map-caption {
	position: absolute;
	bottom: 0.6rem;
	left: 0.6rem;
	margin: 0;
	padding: 0.25rem 0.6rem;
	font-size: 0.75rem;
	background-color: var( --lse-color-bg );
	color: var( --lse-color-muted );
	border-radius: 3px;
}

.lse-contact-form p {
	margin-bottom: 1rem;
}

.lse-contact-form label {
	display: block;
	font-weight: 600;
	margin-bottom: 0.25rem;
}

.lse-checkbox-group {
	border: 0;
	padding: 0;
	margin: 0 0 1rem;
}

.lse-checkbox-group legend {
	font-weight: 600;
	margin-bottom: 0.25rem;
	padding: 0;
}

/* Overrides the generic block/bold form-label styling above — each
   checkbox's own label should sit inline next to it, not read like a
   separate full-width field label. */
.lse-checkbox-group-option {
	display: flex !important;
	align-items: center;
	gap: 0.4rem;
	font-weight: 400 !important;
	margin-bottom: 0.35rem;
}

.lse-checkbox-group-option input {
	margin: 0;
}

.lse-contact-form input[type="text"],
.lse-contact-form input[type="email"],
.lse-contact-form input[type="tel"],
.lse-contact-form input[type="url"],
.lse-contact-form textarea {
	width: 100%;
	padding: 0.5rem;
	box-sizing: border-box;
	border: 1px solid var( --lse-color-muted );
	background-color: var( --lse-color-bg );
	color: var( --lse-color-text );
}

/* Outlined rather than plain-filled, at every Page Background Intensity.
   The panel behind these controls is Accent blended toward bg by the
   admin's intensity setting -- and the fill is Accent too, so at 100% the
   two were literally the same color and the button vanished, while below
   100% it was still only ~1.2-1.6:1. The border is what defines the
   control now, so one rule works at every intensity instead of a
   100%-only override. --lse-color-on-accent is used for both the label
   and the border because it is already defined per palette as the
   black-or-white that stays legible against Accent, which makes the
   outline's contrast against an Accent panel guaranteed rather than
   incidental (4.77:1 worst case across all ten palettes). box-sizing
   keeps the 2px border from growing the control, matching the local
   convention used by .lse-card and the form inputs below -- this
   stylesheet has no global box-sizing reset. */
.lse-contact-form button[type="submit"] {
	box-sizing: border-box;
	background-color: var( --lse-color-accent );
	color: var( --lse-color-on-accent );
	border: 2px solid var( --lse-color-on-accent );
	padding: 0.6rem 1.25rem;
	border-radius: 4px;
	font-weight: 600;
	cursor: pointer;
}

.lse-contact-form button[type="submit"]:hover {
	opacity: 0.9;
}

.lse-form-section {
	margin-top: 1.5rem;
}

/* Membership's outbound apply/pay links, styled the same as the
   contact form's submit button for visual consistency. */
.lse-button {
	display: inline-block;
	box-sizing: border-box;
	background-color: var( --lse-color-accent );
	color: var( --lse-color-on-accent );
	border: 2px solid var( --lse-color-on-accent );
	padding: 0.6rem 1.25rem;
	border-radius: 4px;
	font-weight: 600;
	text-decoration: none;
}

/* .lse-page a (see above) is (0,1,1) and outranks .lse-button's own (0,1,0)
   color, which left the Membership apply/pay link's label the same Accent as
   its own fill -- invisible -- at every intensity below 100%. (At 100% the
   .lse-chrome-full override wins over both and happens to set this same
   value, so it only ever looked right there by coincidence.) Matching the
   element and the class together raises this to (0,1,1) as well, and being
   later in the file it wins -- without inflating specificity further or
   touching the shared .lse-page a rule, which is correct for ordinary body
   links. */
a.lse-button {
	color: var( --lse-color-on-accent );
}

.lse-button:hover {
	opacity: 0.9;
}

/* Join and Pay Dues are deliberately two distinct actions, not one
   merged button — the secondary (outline) treatment keeps them from
   reading as equally-weighted duplicates of each other. */
.lse-button-secondary {
	background-color: transparent;
	color: var( --lse-color-accent );
	border: 2px solid var( --lse-color-accent );
	padding: calc( 0.6rem - 2px ) calc( 1.25rem - 2px );
}

.lse-membership-ctas {
	display: flex;
	flex-wrap: wrap;
	gap: 2rem;
	align-items: flex-start;
	margin-top: 1.5rem;
}

/* Each CTA (Application, Dues) now always renders -- a description (if
   set) plus either the real button or a placeholder note when its own
   URL isn't set yet -- so each gets its own stacked area instead of
   sitting directly in the flex row. */
.lse-membership-cta-area {
	flex: 1 1 240px;
	min-width: 0;
}

.lse-membership-cta-desc {
	margin: 0 0 0.75rem;
}

.lse-membership-cta {
	margin: 0;
}

.lse-membership-cta-placeholder {
	margin: 0;
	font-style: italic;
}

/* No top margin: on Home, this sits directly under the header and
   should be flush against it (its own bottom padding is zeroed for
   Home specifically, below). Bottom margin still separates it from
   the address/phone/hours section that follows. */
.lse-home-media {
	margin: 0 0 1.5rem;
}

/* Home is the only template with a hero image immediately below the
   header, so only Home's header loses its bottom padding — Leadership,
   Contact, etc. still get that space before their own page title. */
body.page-template-page-home-php .lse-site-header {
	padding-bottom: 0;
}

.lse-home-media-img,
.lse-carousel-img {
	width: 100%;
	max-width: 100%;
	height: auto;
	display: block;
}

/* Matches .lse-page's own radius, above -- sharp corners looked wrong
   sitting directly on the now-rounded panel. Classic only -- Modern's
   hero reuses this same class for its shared carousel JS but should
   stay square-cornered and full-bleed. */
body.lse-classic .lse-home-media-img {
	border-radius: 16px;
}

.lse-home-media-carousel {
	position: relative;
}

.lse-carousel-track {
	display: flex;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	gap: 1rem;
	scrollbar-width: thin;
}

.lse-carousel-slide {
	flex: 0 0 100%;
	scroll-snap-align: start;
}

.lse-carousel-prev,
.lse-carousel-next {
	position: absolute;
	top: 50%;
	transform: translateY( -50% );
	background: var( --lse-color-bg );
	color: var( --lse-color-heading );
	border: 1px solid var( --lse-color-muted );
	border-radius: 50%;
	width: 2.25rem;
	height: 2.25rem;
	cursor: pointer;
	font-size: 1.25rem;
	line-height: 1;
}

.lse-carousel-prev {
	left: 0.5rem;
}

.lse-carousel-next {
	right: 0.5rem;
}

/* 16:9 responsive wrapper for wp_oembed_get()'s returned iframe. */
.lse-home-media-video {
	position: relative;
	padding-bottom: 56.25%;
	height: 0;
	overflow: hidden;
}

.lse-home-media-video iframe,
.lse-home-media-video embed,
.lse-home-media-video object {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}

.lse-hp-wrap {
	position: absolute !important;
	left: -9999px !important;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

.lse-notice {
	padding: 1rem;
	margin-bottom: 1.5rem;
	border-radius: 4px;
}

/* Success/error notices are semantic status colors, not part of the
   5-role brand palette — intentionally not variable-driven. */
.lse-notice-success {
	background: #e6f4ea;
	border: 1px solid #34a853;
}

.lse-notice-error {
	background: #fce8e6;
	border: 1px solid #ea4335;
}

/* Generous bottom padding gives the popover room to render below a
   marker in the grid's last row without the page itself having to
   grow to fit it. Not load-bearing on its own -- initCalendarPopover()
   in lse-frontend.js flips the popover above the marker instead
   whenever even this isn't enough room, so there's no exact number to
   get right here. */
.lse-calendar-carousel {
	margin-top: 1rem;
	padding-bottom: 20rem;
}

.lse-calendar-carousel-nav {
	display: flex;
	align-items: center;
	justify-content: space-between;
	margin-bottom: 0.75rem;
}

/* .lse-button/.lse-button-secondary were written for the <a>-tag CTAs
   elsewhere on the site — these are real <button> elements instead,
   so pick up cursor/font-family/border-style resets browsers apply to
   <a> by default but not to <button>. */
.lse-calendar-carousel-nav button {
	font: inherit;
	cursor: pointer;
	border-style: solid;
}

.lse-calendar-carousel-nav button:disabled {
	opacity: 0.4;
	cursor: not-allowed;
}

.lse-calendar-grid-section h2 {
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
	margin-bottom: 0.5rem;
}

.lse-calendar-month-grid {
	width: 100%;
	border-collapse: collapse;
	table-layout: fixed;
}

.lse-calendar-month-grid th {
	width: auto;
	padding: 0.35rem;
	font-size: 0.8rem;
	font-weight: 400;
	text-align: center;
	color: var( --lse-color-muted );
}

.lse-calendar-month-grid-blank {
	background-color: var( --lse-color-bg );
	border: 1px solid var( --lse-color-muted );
	height: 3rem;
}

.lse-calendar-month-grid-day {
	vertical-align: top;
	border: 1px solid var( --lse-color-muted );
	background-color: var( --lse-color-bg );
	height: 3rem;
	padding: 0.3rem;
}

.lse-calendar-month-grid-daynum {
	display: block;
	font-size: 0.8rem;
	font-weight: 600;
	color: var( --lse-color-heading );
	margin-bottom: 0.15rem;
}

.lse-calendar-month-grid-event {
	display: block;
	width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	margin: 0 0 0.15rem;
	padding: 0.05rem 0.3rem;
	border: 0;
	border-radius: 3px;
	background-color: var( --lse-color-accent );
	color: var( --lse-color-on-accent );
	font-size: 0.7rem;
	text-align: left;
	cursor: pointer;
}

.lse-calendar-month-grid-event:hover {
	opacity: 0.85;
}

.lse-calendar-month-grid-more {
	display: block;
	width: 100%;
	border: 0;
	background: none;
	padding: 0;
	color: var( --lse-color-accent );
	font-size: 0.7rem;
	text-align: left;
	cursor: pointer;
}

.lse-calendar-month-grid-more:hover {
	text-decoration: underline;
}

/* Hover-or-tap details popover, positioned by initCalendarPopover() in
   lse-frontend.js next to whichever marker triggered it. Same general
   shape as the admin grid's own .lse-calendar-more-popover, styled
   with the site's own palette/fonts instead of wp-admin's. */
.lse-calendar-popover {
	position: absolute;
	z-index: 100;
	min-width: 220px;
	max-width: 320px;
	padding: 0.75rem;
	background-color: var( --lse-color-bg );
	border: 1px solid var( --lse-color-muted );
	border-radius: 4px;
	box-shadow: 0 2px 8px rgba( 0, 0, 0, 0.15 );
	font-family: var( --lse-font-body );
	color: var( --lse-color-text );
}

.lse-calendar-popover[hidden] {
	display: none;
}

.lse-calendar-popover-date {
	font-family: var( --lse-font-heading );
	font-weight: 600;
	color: var( --lse-color-heading );
	margin-bottom: 0.5rem;
}

.lse-calendar-popover-events {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
}

.lse-calendar-popover-event {
	padding-bottom: 0.5rem;
	border-bottom: 1px solid var( --lse-color-muted );
}

.lse-calendar-popover-event:last-child {
	padding-bottom: 0;
	border-bottom: 0;
}

.lse-calendar-popover-event-time {
	display: block;
	font-size: 0.8rem;
	color: var( --lse-color-muted );
}

.lse-calendar-popover-event-title {
	display: block;
	margin-top: 0.15rem;
}

.lse-calendar-popover-event-description {
	margin: 0.25rem 0 0;
	font-size: 0.85rem;
}

/* Philanthropy page: Local/National two-column split -- pinned blocks
   sort to the top within their own column (see
   templates/page-philanthropy.php's stable partition), not a separate
   full-width strip above both columns, so there's no dedicated pinned
   layout class here anymore. */
.lse-philanthropy-columns {
	display: flex;
	flex-wrap: wrap;
	gap: 2rem;
	margin-top: 2rem;
}

.lse-philanthropy-column {
	flex: 1 1 320px;
	min-width: 0;
}

.lse-philanthropy-column-title {
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

.lse-philanthropy-column .lse-philanthropy-block + .lse-philanthropy-block {
	margin-top: 1.5rem;
}

.lse-philanthropy-block-title {
	margin: 0 0 0.5rem;
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

.lse-philanthropy-block-text :last-child {
	margin-bottom: 0;
}

/* Photo left/right: flex-wrap so a photo never squeezes body text below
   a readable width on narrow viewports, regardless of which side it's
   set to. */
.lse-philanthropy-block-has-photo {
	display: flex;
	flex-wrap: wrap;
	gap: 1.5rem;
	align-items: flex-start;
}

.lse-philanthropy-block-photo-right {
	flex-direction: row-reverse;
}

.lse-philanthropy-block-photo {
	flex: 1 1 240px;
	max-width: 320px;
}

.lse-philanthropy-block-img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: 4px;
}

.lse-philanthropy-block-body {
	flex: 2 1 320px;
	min-width: 0;
}

/* Food & Beverage page: hardcoded members-only reminder, then a narrow
   Hours/Specials column beside a wide Menu column — see
   templates/page-food-beverage.php. */
.lse-fnb-reminder {
	padding: 0.75rem 1rem;
	margin-top: 1.5rem;
	border-radius: 4px;
	background: var( --lse-color-accent );
	color: var( --lse-color-on-accent );
	font-weight: 700;
	text-align: center;
}

.lse-fnb-layout {
	display: flex;
	flex-wrap: wrap;
	gap: 2rem;
	margin-top: 1.5rem;
}

.lse-fnb-sidebar {
	flex: 1 1 260px;
	min-width: 0;
}

.lse-fnb-menu {
	flex: 2 1 400px;
	min-width: 0;
}

/* Wraps the whole Menu column in its own enclosing container — a
   distinct, slightly larger-radius card than the shared .lse-card
   treatment used for Philanthropy/History blocks and F&B Specials, so
   the Menu reads as one container holding several categories rather
   than reusing the same visual weight as the smaller item-level cards
   elsewhere on the site. Same color-mix()-with-plain-fallback approach
   as .lse-card, for the same browser-support reason. */
.lse-fnb-menu-card {
	background-color: var( --lse-color-bg );
	background-color: color-mix( in srgb, var( --lse-color-bg ) 85%, white 15% );
	border: 1px solid var( --lse-color-accent );
	border-radius: 14px;
	padding: 1.5rem 1.75rem;
}

.lse-fnb-hours,
.lse-fnb-specials {
	margin-bottom: 2rem;
}

.lse-fnb-hours h2,
.lse-fnb-specials h2,
.lse-fnb-menu-section-title {
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

/* Category photo (if any) + title sit inline as a flex row. The
   between-groups spacing lives on this wrapper now, not the title:
   once the title moved inside here it's no longer a direct child of
   .lse-fnb-menu-card at each category boundary, so :not(:first-child)
   on the title would no longer track category number. */
.lse-fnb-menu-section-header {
	display: flex;
	align-items: center;
	gap: 0.75rem;
	padding-right: 16px;
	margin-bottom: 0.5rem;
}

.lse-fnb-menu-section-header:not( :first-child ) {
	margin-top: 2rem;
}

.lse-fnb-menu-section-title {
	margin: 0;
	padding-left: 4px;
	text-transform: uppercase;
	font-variant: small-caps;
	letter-spacing: 0.05em;
	font-size: 1.4rem;
	font-weight: 700;
}

/* Optional per-Category photo (see class-lse-fnb-settings.php's
   render_category_row()) -- a small thumbnail sitting inline to the
   left of that category's heading when set; adds no markup at all
   otherwise, so a Category with no photo looks exactly as it did
   before this existed. */
.lse-fnb-menu-section-photo {
	width: 120px;
	height: 120px;
	object-fit: contain;
	border-radius: 8px;
	flex-shrink: 0;
	margin-left: auto;
}

/* Compact: photo (if any) capped small, everything stacked tight —
   distinct from Philanthropy's own larger has-photo layout, since this
   is meant to read as a short list, not a full block of prose. */
.lse-fnb-special {
	display: flex;
	gap: 0.75rem;
	margin-top: 1rem;
}

.lse-fnb-special-img {
	flex: 0 0 64px;
	width: 64px;
	height: 64px;
	object-fit: contain;
	border-radius: 4px;
}

.lse-fnb-special-body {
	flex: 1 1 auto;
	min-width: 0;
}

/* flex-wrap lets the price drop to its own line instead of forcing
   both items onto one line that overflows the card -- a flex row's
   default (no wrap) behavior is to keep every item on one line no
   matter what, even past the container's own edge, once a long title
   (e.g. "Taco Tuesday") and a longer price (e.g. "$3.00 each") can no
   longer both fit. */
.lse-fnb-special-title {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: 1rem;
	margin: 0;
}

/* min-width: 0 overrides a flex item's implicit min-width: auto,
   which otherwise floors it at its own widest unbreakable word/token
   and can still contribute to the same overflow flex-wrap alone
   doesn't fully solve -- same reasoning as .lse-site-org-name's own
   min-width: 0 above. */
.lse-fnb-special-name {
	min-width: 0;
	font-weight: 700;
}

.lse-fnb-special-price {
	white-space: nowrap;
	font-weight: 700;
	color: var( --lse-color-heading );
}

.lse-fnb-special-schedule {
	margin: 0.15rem 0 0;
	font-size: 0.85rem;
	color: var( --lse-color-muted );
}

/* Small "Click to Enlarge" hint shown once above each group of
   lightbox-enabled thumbnails (Photo Gallery grid, Hall Rental floor
   plan + hall photos). Purely presentational — no JS involvement. */
.lse-lightbox-hint {
	margin: 0 0 0.5rem;
	font-size: 0.85rem;
	color: var( --lse-color-muted );
}

.lse-fnb-special-desc {
	margin: 0.25rem 0 0;
	font-size: 0.9rem;
}

.lse-fnb-menu-items {
	list-style: none;
	margin: 0 0 1.5rem;
	padding: 0;
}

.lse-fnb-menu-item {
	padding: 0.5rem 0;
	border-bottom: 1px solid var( --lse-color-muted );
}

.lse-fnb-menu-item:last-child {
	border-bottom: 0;
}

.lse-fnb-menu-item-row {
	display: flex;
	justify-content: space-between;
	gap: 1rem;
}

/* Optional per-item photo (see class-lse-fnb-settings.php's
   render_menu_row()) -- a small thumbnail, adjusted to this row-based
   list layout rather than reusing Specials' own card layout. Only
   .lse-fnb-menu-item-content exists unconditionally (an unstyled
   wrapper with no layout effect of its own outside the flex context
   below), so an item with no photo renders exactly as it did before
   this existed -- no flex row, no thumbnail slot, nothing. */
.lse-fnb-menu-item-has-photo {
	display: flex;
	gap: 0.75rem;
	align-items: flex-start;
}

.lse-fnb-menu-item-img {
	flex: 0 0 48px;
	width: 48px;
	height: 48px;
	object-fit: contain;
	border-radius: 4px;
}

.lse-fnb-menu-item-content {
	flex: 1 1 auto;
	min-width: 0;
}

/* Real <h3> now (see templates/page-food-beverage.php) -- margin/
   font-size reset to neutralize the browser's default heading
   sizing/spacing, and deliberately NOT bold: item names should read
   as clearly subordinate to the (larger, bold, small-caps) section
   header above them, not compete with it. */
.lse-fnb-menu-item-name {
	margin: 0;
	font-size: 1rem;
	font-weight: 400;
}

.lse-fnb-menu-item-price {
	white-space: nowrap;
	font-weight: 700;
	color: var( --lse-color-heading );
}

.lse-fnb-menu-item-desc {
	margin: 0.25rem 0 0;
	font-size: 0.9rem;
	color: var( --lse-color-muted );
}

/* Rendered only when an item has Variants set (see
   templates/page-food-beverage.php's render_menu_item()) — one
   label/price row per variant, indented slightly under the item name
   in place of the single top-line price shown when there are none. */
.lse-fnb-menu-item-variants {
	list-style: none;
	margin: 0.35rem 0 0;
	padding: 0;
}

.lse-fnb-menu-item-variant {
	display: flex;
	justify-content: space-between;
	gap: 1rem;
	padding: 0.15rem 0 0.15rem 1rem;
	font-size: 0.9rem;
}

.lse-fnb-menu-item-variant-price {
	white-space: nowrap;
	font-weight: 700;
	color: var( --lse-color-heading );
}

/* Rendered only when an item has Add-ons set — a small note per
   add-on, styled distinctly (italic, muted, smaller) from the
   variants list above so it reads as an optional aside, not another
   priced line item. */
.lse-fnb-menu-item-addons {
	list-style: none;
	margin: 0.35rem 0 0;
	padding: 0;
	font-size: 0.85rem;
	font-style: italic;
	color: var( --lse-color-muted );
}

/* History page: fixed 50/50 two-column layout, Local and National side
   by side — see templates/page-history.php. flex: 1 1 0 on each column
   (equal grow, zero basis) keeps them exactly even-width whenever
   there's room; min-width below is what makes that stop once there
   isn't — flex-wrap here, same as Philanthropy's/F&B's/Contact's own
   column layouts, so the two columns stack instead of getting
   squeezed on narrow viewports. */
.lse-history-columns {
	display: flex;
	flex-wrap: wrap;
	gap: 2rem;
	margin-top: 1.5rem;
}

.lse-history-column {
	flex: 1 1 0;
	min-width: 280px;
}

.lse-history-column-title {
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

.lse-history-column-empty {
	color: var( --lse-color-muted );
	font-style: italic;
}

.lse-history-column .lse-history-block + .lse-history-block {
	margin-top: 1.5rem;
}

.lse-history-block-title {
	margin: 0 0 0.5rem;
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

.lse-history-block-year {
	display: inline-block;
	margin-right: 0.5rem;
	padding: 0.1rem 0.5rem;
	border-radius: 3px;
	background: var( --lse-color-accent );
	color: var( --lse-color-on-accent );
	font-size: 0.8rem;
	font-weight: 700;
	vertical-align: middle;
}

.lse-history-block-text :last-child {
	margin-bottom: 0;
}

/* Photo left/right, same pattern as Philanthropy's own block photos. */
.lse-history-block-has-photo {
	display: flex;
	flex-wrap: wrap;
	gap: 1.5rem;
	align-items: flex-start;
}

.lse-history-block-photo-right {
	flex-direction: row-reverse;
}

.lse-history-block-photo {
	flex: 1 1 240px;
	max-width: 320px;
}

.lse-history-block-img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: 4px;
}

.lse-history-block-body {
	flex: 2 1 320px;
	min-width: 0;
}

/* Hall Rental page: reminder + compliance blurb, then a narrow Facility
   Details/Hall Photos/Amenities column beside a wide Fee Breakdown/
   Policy Notes column — same flex-wrap + min-width responsive pattern
   as Food & Beverage's own layout. */
.lse-rental-reminder {
	padding: 0.75rem 1rem;
	margin-top: 1.5rem;
	border-radius: 4px;
	background: var( --lse-color-accent );
	color: var( --lse-color-on-accent );
	font-weight: 700;
	text-align: center;
}

.lse-rental-compliance {
	margin-top: 1rem;
	padding: 0.75rem 1rem;
	border: 1px solid var( --lse-color-muted );
	border-radius: 4px;
	font-size: 0.9rem;
}

.lse-rental-compliance p {
	margin: 0;
}

.lse-rental-layout {
	display: flex;
	flex-wrap: wrap;
	gap: 2rem;
	margin-top: 1.5rem;
}

.lse-rental-sidebar {
	flex: 1 1 260px;
	min-width: 0;
}

.lse-rental-main {
	flex: 2 1 400px;
	min-width: 0;
}

.lse-rental-facility,
.lse-rental-contact,
.lse-rental-hall-photos,
.lse-rental-amenities,
.lse-rental-fees,
.lse-rental-policies {
	margin-bottom: 2rem;
}

.lse-rental-facility h2,
.lse-rental-contact h2,
.lse-rental-hall-photos h2,
.lse-rental-amenities h2,
.lse-rental-fees h2,
.lse-rental-policies h2 {
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

.lse-rental-contact-invite {
	margin: 0.5rem 0 0;
	font-size: 0.9rem;
}

.lse-rental-contact-list {
	list-style: none;
	margin: 0.75rem 0 0;
	padding: 0;
}

.lse-rental-contact-list li {
	padding: 0.25rem 0;
}

.lse-rental-contact-name {
	font-weight: 700;
}

.lse-rental-floor-plan {
	margin: 0.75rem 0;
}

.lse-rental-floor-plan-img {
	max-width: 100%;
}

.lse-rental-facility-list {
	list-style: none;
	margin: 0.75rem 0 0;
	padding: 0;
}

.lse-rental-facility-list li {
	margin-bottom: 0.4rem;
}

.lse-rental-photo-grid {
	display: grid;
	grid-template-columns: repeat( auto-fill, minmax( 100px, 1fr ) );
	gap: 0.5rem;
	margin-top: 0.75rem;
}

.lse-rental-photo-item {
	display: block;
	border-radius: 4px;
	overflow: hidden;
	cursor: pointer;
}

.lse-rental-photo-img {
	display: block;
	width: 100%;
	height: 100px;
	object-fit: contain;
}

.lse-rental-amenities-list {
	list-style: none;
	margin: 0.75rem 0 0;
	padding: 0;
}

.lse-rental-amenities-list li {
	padding: 0.4rem 0;
	border-bottom: 1px solid var( --lse-color-muted );
}

.lse-rental-amenities-list li:last-child {
	border-bottom: 0;
}

.lse-rental-amenity-name {
	font-weight: 700;
}

.lse-rental-amenity-notes {
	display: block;
	font-size: 0.85rem;
	color: var( --lse-color-muted );
}

.lse-rental-fees-table {
	width: 100%;
	border-collapse: collapse;
	margin-top: 0.75rem;
}

.lse-rental-fees-table th,
.lse-rental-fees-table td {
	padding: 0.5rem;
	text-align: left;
	border-bottom: 1px solid var( --lse-color-muted );
	vertical-align: top;
}

.lse-rental-policy {
	margin-top: 1rem;
}

.lse-rental-policy-title {
	margin: 0 0 0.25rem;
	font-family: var( --lse-font-heading );
	color: var( --lse-color-heading );
}

.lse-rental-policy-desc {
	margin: 0;
}

/* Volunteer Sign-up page: role name/description were previously
   unstyled adjacent <span>s with no separator at all, so they ran
   together as one line of text (e.g. "Setup CrewHelp set up tables").
   display: block on the description forces it onto its own line —
   same name/notes pattern already used for Hall Rental's
   .lse-rental-amenity-name/-notes above. Presentation-only: the
   underlying 'role'/'description' field values in the admin (see
   LSE_Volunteer_Settings::get_roles()) are untouched. */
.lse-volunteer-roles-list {
	list-style: none;
	margin: 1rem 0 0;
	padding: 0;
}

.lse-volunteer-roles-list li {
	padding: 0.4rem 0;
	border-bottom: 1px solid var( --lse-color-muted );
}

.lse-volunteer-roles-list li:last-child {
	border-bottom: 0;
}

.lse-volunteer-role-name {
	font-weight: 700;
}

.lse-volunteer-role-description {
	display: block;
	margin-top: 0.15rem;
	font-size: 0.9rem;
	color: var( --lse-color-muted );
}

/* ---- About page (merged Leadership / Charity / History / Links) ----
   Baseline layout only: the jump menu reads as a row of links, and each
   stacked section is separated by a rule with breathing room. The section
   bodies themselves reuse the same partials (and CSS) as their standalone
   pages, so they're already styled. */
.lse-about-jump {
	margin: 1.5rem 0 2rem;
}

.lse-about-jump-list {
	list-style: none;
	margin: 0;
	padding: 0 0 1rem;
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem 1.25rem;
	border-bottom: 1px solid var( --lse-color-muted );
}

.lse-about-jump-list a {
	font-weight: 600;
	color: var( --lse-color-heading );
	text-decoration: none;
}

.lse-about-jump-list a:hover,
.lse-about-jump-list a:focus {
	text-decoration: underline;
}

.lse-about-section {
	margin-top: 2.5rem;
	padding-top: 2.5rem;
	border-top: 1px solid var( --lse-color-muted );
}

.lse-about-section:first-of-type {
	margin-top: 1.5rem;
	padding-top: 0;
	border-top: 0;
}

.lse-about-section-title {
	margin: 0 0 1rem;
	color: var( --lse-color-heading );
}

/* Image alignment — WordPress's alignleft / alignright / aligncenter classes,
   as written from the classic editor's align buttons on Custom Pages (and any
   other page's the_content() output). A left/right image floats so text wraps
   around it; the content area clears its own floats so nothing bleeds out. */
.lse-page-content .alignleft {
	float: left;
	margin: 0.25rem 1.5rem 1rem 0;
	max-width: 100%;
	height: auto;
}
.lse-page-content .alignright {
	float: right;
	margin: 0.25rem 0 1rem 1.5rem;
	max-width: 100%;
	height: auto;
}
.lse-page-content .aligncenter {
	display: block;
	margin-left: auto;
	margin-right: auto;
}
.lse-page-content::after {
	content: "";
	display: table;
	clear: both;
}
