/* Website editor sections (Kailah). Loaded only when the org has a
   configured site. Section shells: .kw-section + kw-bg-* / kw-width-* /
   kw-align-* / kw-pad-* from the section's style object. Colors come from the
   theme variables the site already defines, so everything follows the org's
   branding. */

.kw-section { position: relative; }
/* Vertical rhythm scales with the viewport so sections keep breathing room at
   every width instead of running together on tablets and phones (clamp:
   phone -> desktop). */
.kw-pad-sm { padding: clamp(10px, 2.2vw, 16px) 0; }
.kw-pad-md { padding: clamp(24px, 5vw, 48px) 0; }
.kw-pad-lg { padding: clamp(40px, 8vw, 96px) 0; }
/* A hero carries its own padding (.kw-hero-text is 96px, the banner is sized
   by its image), so the section shell adds none at any setting — otherwise
   "Large" stacked 96px on top of 96px and left a 192px gap. */
.kw-type-hero, .kw-type-system_body.kw-pad-sm, .kw-type-spacer { padding: 0; }
/* NOTE: no generic gap between sections. The feed/about blocks carry the live
   site's own padding (see below), so adding margin here would make the editor
   show more spacing than the real site. Plain sections use .kw-pad-*. */
.kw-type-org_about, .kw-type-org_about_cards, .kw-type-events_feed, .kw-type-campaigns_feed, .kw-type-resources_feed { padding: 0; }

/* The original stylesheet spaces these blocks with element-qualified rules
   (section.about-area { padding: 150px 0 } and friends). The editor renders
   the same markup inside a <section class="kw-section">, with the block as a
   <div>, so none of those rules matched and the sections ran together — the
   editor showed far less spacing than the live site. Re-apply the same values
   to the div form, and scale them down on narrow screens (the originals are
   fixed at 150px at every width, which is too much on a phone). */
.kw-section div.hero-area      { padding: 30px 0; }
.kw-section div.about-area,
.kw-section div.blog-area,
.kw-section div.mission-area   { padding: 150px 0; }
.kw-section div.campaigns-area { padding: 40px 0 90px 0; }
.kw-section div.event-area     { padding-bottom: 150px; }
/* Mirrors assets/css/responsive.css for the same blocks, so the editor's
   phone preview matches the real phone layout. Keep the two in step. */
@media (max-width: 767px) {
  .kw-section div.hero-area      { padding: 100px 0; }
  .kw-section div.about-area     { padding: 50px 0; }
  .kw-section div.blog-area      { padding: 70px 0; }
  .kw-section div.mission-area   { padding: 80px 0; }
  .kw-section div.campaigns-area { padding: 30px 0 50px 0; }
  .kw-section div.event-area     { padding-bottom: 56px; }
}
/* A card inside a feed (.blk, .event-blk, .plan-box-1, .kw-listing) paints
   its own white background, so the rules above deliberately stop at its
   edge via :not(...) — otherwise a tint, dark, primary or custom-dark
   section turned the card titles white on white and they vanished. Excluding
   them here, rather than overriding afterwards, leaves each card's own
   colour rules untouched at their original specificity. */
.kw-bg-default { background: #fff; }
/* The org's own brand colours, from the dashboard's branding settings. */
/* The secondary brand colour. Text follows --theme-on-secondary, which
   theme-contrast.js computes from that colour's luminance at load, so a dark
   secondary gets white words instead of inheriting the body's near-black. */
.kw-bg-tint { background: var(--theme-light, #f8f9fb); color: var(--theme-on-secondary, #1a1a1a); }
.kw-bg-tint :is(h1, h2, h3, h4, h5, p, li, summary):not(:is(.blk, .event-blk, .plan-box-1, .kw-listing) *) { color: var(--theme-on-secondary, #1a1a1a); }
.kw-bg-primary { background: var(--theme-color, #0997d9); color: var(--theme-on-primary, #fff); }
.kw-bg-dark { background: #15202b; color: #fff; }
.kw-bg-dark :is(h1, h2, h3, h4, h5, p, li, summary):not(:is(.blk, .event-blk, .plan-box-1, .kw-listing) *) { color: #fff; }
.kw-bg-dark .hightlight-text { color: var(--theme-light, #cfe8ff); }
/* Text on the primary brand colour follows the contrast variable the site
   already computes, so a pale brand colour keeps dark text. */
.kw-bg-primary :is(h1, h2, h3, h4, h5, p, li, summary):not(:is(.blk, .event-blk, .plan-box-1, .kw-listing) *) { color: var(--theme-on-primary, #fff); }
/* Custom chosen but no valid colour yet (still typing a hex): plain white,
   rather than an unstyled block. */
.kw-bg-custom { background: #fff; }
/* A custom colour the admin picked: dark or light decided server-side from
   the colour's luminance, so the words stay readable either way. */
.kw-bg-custom-dark, .kw-bg-custom-dark :is(h1, h2, h3, h4, h5, p, li, summary):not(:is(.blk, .event-blk, .plan-box-1, .kw-listing) *) { color: #fff; }
.kw-bg-custom-light, .kw-bg-custom-light :is(h1, h2, h3, h4, h5, p, li, summary):not(:is(.blk, .event-blk, .plan-box-1, .kw-listing) *) { color: #1a1a1a; }
/* The .kw-bg-* rules above also set colour on the section itself, which a
   card would inherit (.blk declares no colour of its own and .kw-listing is
   explicitly `color: inherit`). Reset it at the card boundary, back to the
   site's normal text colour, so each card's own rules take it from there.
   Only the container is targeted — descendants keep their own colours. */
.kw-section :is(.blk, .event-blk, .plan-box-1, .kw-listing) { color: #505050; }
/* Text alignment is inherited, so a centred section centred the text inside
   its cards too — a card's title and date read left-aligned, as they always
   have. The :not() on the alignment rules stops those rules reaching a card,
   but not the inheritance from the section itself, so reset it here.
   A card that centres its own text (the plan cards' text-center) still does,
   because that is set on the card and wins over this. */
.kw-section :is(.blk, .event-blk, .kw-listing) { text-align: left; }

/* Section width. The shell already carries kw-width-*; these give the middle
   options real widths (previously only "contained" vs "full" existed, with
   nothing in between). Applied to the inner container so the section's own
   background still spans the full page. */
.kw-width-narrow > .container,
.kw-width-narrow > .container-fluid { max-width: 720px; }
.kw-width-medium > .container,
.kw-width-medium > .container-fluid { max-width: 960px; }
.kw-width-contained > .container { max-width: 1130px; }
/* "full" keeps Bootstrap's container-fluid, set by kw_open_container. */

/* ── Column rows (edit mode) ──────────────────────────────────────────────
   A Columns section's cells accept blocks of their own, as the broadcast
   email editor's smart cells do. These are editor-only affordances: the
   published page just gets .kw-col-row wrappers, which carry no styling of
   their own beyond the stacking gap. */
.kw-column > .kw-col-row + .kw-col-row { margin-top: 12px; }
.kw-edit .kw-column[data-kw-col] { position: relative; min-height: 90px; }
.kw-edit .kw-column.kw-col-over { outline: 2px solid #2563eb; outline-offset: 3px; border-radius: 8px; }
.kw-col-drop-line { position: absolute; height: 3px; background: #2563eb; border-radius: 2px; z-index: 2147483646; pointer-events: none; }
/* Handle for dragging one block within a column, shown on the page while its
   section is selected. Small and tucked into the corner so it does not sit on
   top of the content it moves. */
.kw-edit .kw-col-row { position: relative; }
.kw-block-handle { position: absolute; top: 2px; right: 2px; z-index: 3; display: none;
                   width: 20px; height: 20px; align-items: center; justify-content: center;
                   border-radius: 5px; background: #fff; border: 1px solid #d9dee6;
                   color: #64748b; cursor: grab; box-shadow: 0 1px 3px rgba(0,0,0,.12); }
.kw-block-handle:active { cursor: grabbing; }
.kw-section.kw-selected .kw-col-row:hover > .kw-block-handle,
.kw-section.kw-selected .kw-block-handle:hover { display: flex; }
.kw-block-handle svg { width: 12px; height: 12px; pointer-events: none; }

/* Dropping beside a section: the edge it will join lights up, so it is clear
   the new thing lands alongside rather than above or below. */
.kw-edit .kw-section { position: relative; }
/* A wide tinted strip rather than a hairline: the band is a third of the
   content width, so the drop zone is large and the indicator should show
   that rather than suggesting a precise edge. */
.kw-side-left::before, .kw-side-right::before {
	content: ""; position: absolute; top: 0; bottom: 0; width: 33%;
	background: linear-gradient(90deg, rgba(37,99,235,.18), rgba(37,99,235,.04));
	border-left: 4px solid #2563eb; z-index: 6; pointer-events: none;
}
.kw-side-left::before  { left: 0; }
.kw-side-right::before {
	right: 0; border-left: 0; border-right: 4px solid #2563eb;
	background: linear-gradient(270deg, rgba(37,99,235,.18), rgba(37,99,235,.04));
}
.kw-side-left::after, .kw-side-right::after {
	content: "Place alongside"; position: absolute; top: 8px; z-index: 6;
	background: #2563eb; color: #fff; font: 600 11px/1 system-ui, sans-serif;
	padding: 5px 8px; border-radius: 5px; pointer-events: none; white-space: nowrap;
}
.kw-side-left::after  { left: 10px; }
.kw-side-right::after { right: 10px; }

/* "+" buttons on a column's edges, for adding one beside it. Hidden until
   the column is hovered so they do not clutter the page. */
.kw-edit .kw-column[data-kw-col] { position: relative; }
.kw-col-add {
	position: absolute; top: 50%; transform: translateY(-50%); z-index: 4; display: none;
	width: 24px; height: 24px; align-items: center; justify-content: center;
	border-radius: 50%; border: 1px solid #d9dee6; background: #fff; color: #2563eb;
	font: 600 15px/1 system-ui, sans-serif; cursor: pointer; box-shadow: 0 2px 6px rgba(0,0,0,.14);
}
.kw-col-add-before { left: -12px; }
.kw-col-add-after  { right: -12px; }
.kw-edit .kw-column:hover > .kw-col-add { display: flex; }
.kw-col-add:hover { background: #2563eb; color: #fff; border-color: #2563eb; }

/* Quick actions in an empty column: the same four starts the email editor
   offers in an empty cell. */
.kw-col-empty { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; justify-content: center;
                min-height: 90px; padding: 12px; border: 1px dashed #c9ccd4; border-radius: 8px; background: #fafbfc; }
.kw-col-act { font: 500 12px/1 inherit; color: #475569; background: #fff; border: 1px solid #d9dee6;
              border-radius: 6px; padding: 7px 10px; cursor: pointer; }
.kw-col-act:hover { border-color: #2563eb; color: #2563eb; }

/* Add-a-section affordance between sections (edit mode). A list page is a
   single very tall section, so without these there was no visible place to
   aim a drop and it looked as though sections could not be added at all. */
.kw-edit .kw-page > .kw-section { position: relative; }
.kw-edit .kw-page > .kw-section::before,
.kw-edit .kw-page > .kw-section::after {
	content: ""; position: absolute; left: 0; right: 0; height: 10px;
	pointer-events: none; opacity: 0; transition: opacity .12s;
	background: repeating-linear-gradient(90deg, #2563eb 0 6px, transparent 6px 12px);
}
.kw-edit .kw-page > .kw-section::before { top: 0; }
.kw-edit .kw-page > .kw-section::after  { bottom: 0; }
.kw-edit.kw-dragging .kw-page > .kw-section::before,
.kw-edit.kw-dragging .kw-page > .kw-section::after { opacity: .35; }

/* The one element inside the selected section that the panel is styling. */
.kw-edit .kw-el-selected { outline: 2px solid #7c3aed; outline-offset: 3px; border-radius: 3px; }

/* ── Per-element styling ──────────────────────────────────────────────────
   Set on one element (a heading, a paragraph, a button) rather than the whole
   section, via kw_el_attrs(). Sizes are relative so a heading styled "lg"
   stays a heading rather than jumping to a fixed pixel size. */
.kw-el-xs  { font-size: .75em; }
.kw-el-sm  { font-size: .875em; }
.kw-el-md  { font-size: 1em; }
.kw-el-lg  { font-size: 1.25em; }
.kw-el-xl  { font-size: 1.5em; }
.kw-el-xxl { font-size: 2em; }
.kw-el-normal { font-weight: 400; }
.kw-el-medium { font-weight: 600; }
.kw-el-bold   { font-weight: 700; }
/* An element's own colour is emitted as `color:#hex !important` by
   kw_el_attrs(), because the SECTION's text colour is itself !important (it
   has to beat the background's automatic contrast). Without that, picking a
   colour for one heading inside a section that has its own colour would do
   nothing. */

/* Blocks with `margin: ... auto` stay visually centered even when the text
   inside them is aligned left or right — that is why a section set to Left
   aligned its body copy but left its heading block looking centered. Reset
   the side margins for the non-centered alignments. */
.kw-align-left .section-title .section-subtext,
.kw-align-left .kw-heading .section-subtext,
.kw-align-left .kw-hero-text .lead { margin-left: 0; margin-right: auto; }
.kw-align-right .section-title .section-subtext,
.kw-align-right .kw-heading .section-subtext,
.kw-align-right .kw-hero-text .lead { margin-left: auto; margin-right: 0; }
/* The hero's own heading and lead follow the section too. */
.kw-align-left .kw-hero-text, .kw-align-left .kw-hero-split .hero-title { text-align: left; }
.kw-align-right .kw-hero-text, .kw-align-right .kw-hero-split .hero-title { text-align: right; }
.kw-align-center .kw-hero-text { text-align: center; }

/* ── A feed with fewer cards than it has room for ─────────────────────────
   One resource in a 3-up carousel sat hard left with two empty slots beside
   it. kw-feed-few centers what is there. The section's own alignment still
   wins: these rules are skipped entirely when the admin has chosen left or
   right, so "center unless you say otherwise" holds. */
/* Not a carousel any more (main.js and the editor both skip Owl when there
   is nothing to scroll), so these are laid out directly: a centred row that
   keeps each card the width it would have had in the 3-up view, rather than
   one card stretched across the page. */
.all-campains.kw-feed-few {
	display: flex; flex-wrap: wrap; gap: 30px; justify-content: center;
}
.all-campains.kw-feed-few > * { flex: 0 1 calc((100% - 60px) / 3); min-width: 260px; }
/* Two cards keep their size and sit together in the middle. */
.all-campains.kw-feed-n2 > * { flex: 0 1 calc((100% - 30px) / 3); }
.kw-align-left .all-campains.kw-feed-few { justify-content: flex-start; }
.kw-align-right .all-campains.kw-feed-few { justify-content: flex-end; }
/* The carousel pads 65px each side for its arrows; with nothing to scroll
   those arrows are hidden, so the padding only pushes the cards off-center. */
.all-campains.kw-feed-few { padding-left: 0; padding-right: 0; }
.all-campains.kw-feed-few .owl-nav { display: none; }

/* Listing grids (People, Directory) use CSS Grid with fixed columns. */
.kw-align-center .kw-listings.kw-feed-few,
.kw-section:not(.kw-align-left):not(.kw-align-right) .kw-listings.kw-feed-few { justify-content: center; }
.kw-align-left .kw-listings.kw-feed-few { justify-content: start; }
.kw-align-right .kw-listings.kw-feed-few { justify-content: end; }
/* Cards keep their natural column width rather than stretching to fill. */
.kw-listings.kw-feed-few { grid-auto-columns: minmax(0, 1fr); }

/* Grid feeds (groups, memberships) use a Bootstrap row. */
.kw-align-center .row.kw-feed-few,
.kw-section:not(.kw-align-left):not(.kw-align-right) .row.kw-feed-few { justify-content: center; }

/* An explicit left or right alignment overrides the centering above. */
.kw-align-left .row.kw-feed-few { justify-content: flex-start; }
.kw-align-right .row.kw-feed-few { justify-content: flex-end; }

/* ── Header and footer arrangements ──────────────────────────────────────
   One class on the <nav>/<footer>; the markup inside is identical for every
   layout, so switching never loses a menu item, the Join button, the
   tagline, the footer columns or the social links.

   "Powered by Kannect" is NOT here: it renders after the footer's own markup
   (.kannect-promo in home.php) and is gated on the org's white-label
   setting, so every layout keeps it. */

/* Header: logo centered above the menu. */
/* Centered: logo stacked above a centred menu. */
.navbar.kw-head-centered > .container { flex-wrap: wrap; justify-content: center; text-align: center; }
.navbar.kw-head-centered .navbar-brand { margin: 0 auto 6px; }
.navbar.kw-head-centered .navbar-collapse { flex-basis: 100%; }
.navbar.kw-head-centered .navbar-nav { margin: 0 auto !important; }

/* Header: menu split either side of the logo. */
@media (min-width: 992px) {
	/* (the 'split' header was removed — see KW_HEADER_LAYOUTS) */
}

/* Header: the whole bar in the brand colour. */
.navbar.kw-head-band { background: var(--theme-color, #0997d9) !important; }
.navbar.kw-head-band .nav-link,
.navbar.kw-head-band .navbar-brand { color: var(--theme-on-primary, #fff) !important; }
.navbar.kw-head-band .navbar-toggler-icon { filter: brightness(0) invert(1); }

/* Header: a thin rule under the bar. */
/* Underlined: a visible rule in the brand colour under the bar. The old
   #eef1f5 hairline was so faint it was indistinguishable from Classic. */
.navbar.kw-head-utility { border-bottom: 3px solid var(--theme-color, #0997d9); }

/* Footer: everything centered in one column. */
/* A footer link should not wrap mid-label — "Board Members" breaking across
   two lines reads as a mistake. Applies to every footer layout, not just the
   centred one. */
.site-footer ul.menu-links li { white-space: nowrap; }

/* Centered: the brand block sits centred ABOVE the columns, which stay side
   by side. Stacking everything into one narrow column made a very tall
   footer that read like a phone layout on a desktop screen. */
.site-footer.kw-foot-centered .footer-grid {
	/* auto, not 1fr: equal thirds squeezed the link columns so long labels
	   wrapped. Sizing to content and centring the group keeps each label on
	   one line. */
	grid-template-columns: repeat(3, auto);
	justify-content: center; justify-items: center; text-align: center;
	column-gap: 56px;
}
.site-footer.kw-foot-centered .footer-brand {
	grid-column: 1 / -1; max-width: 520px; margin-bottom: 8px;
}
.site-footer.kw-foot-centered .footer-explore-combined { justify-content: center; grid-column: 1 / 3; gap: 40px; }
.site-footer.kw-foot-centered .footer-contact { grid-column: 3 / 4; }
.site-footer.kw-foot-centered ul.social-links { justify-content: center; }
/* A long label like "Board Members" was wrapping onto two lines, because the
   three equal columns left each one too narrow. The link columns size to
   their content instead, so a label stays on one line. */
.site-footer.kw-foot-centered ul.menu-links { align-items: center; }
.site-footer.kw-foot-centered ul.menu-links li { white-space: nowrap; }
.site-footer.kw-foot-centered .footer-explore-sublist { min-width: max-content; }

/* Footer: the columns sit on the brand colour. */
/* (the 'band' footer was removed — see KW_FOOTER_LAYOUTS) */

/* Footer: links only, no columns. */
/* Minimal: brand, then every link in one continuous row. The two link
   groups are separate elements, so a gap between them broke the row in the
   middle — `display: contents` lets their items sit in one flex line. */
.site-footer.kw-foot-minimal .footer-grid { grid-template-columns: 1fr; justify-items: center; text-align: center; gap: 14px; }
.site-footer.kw-foot-minimal .footer-contact { display: none; }
.site-footer.kw-foot-minimal .footer-explore-combined {
	display: flex; flex-wrap: wrap; justify-content: center; gap: 0 18px; width: 100%;
}
.site-footer.kw-foot-minimal .footer-explore-sublist { display: contents; }
.site-footer.kw-foot-minimal .footer-explore-sublist h4 { display: none; }
.site-footer.kw-foot-minimal ul.menu-links {
	flex-direction: row; flex-wrap: wrap; gap: 8px 18px; justify-content: center; margin: 0;
}
.site-footer.kw-foot-minimal ul.social-links { justify-content: center; }
.site-footer.kw-foot-minimal .footer-brand { display: flex; flex-direction: column; align-items: center; }

/* Preview bar. A preview used to be indistinguishable from the live site,
   so there was nothing to say the changes were unpublished or that the other
   pages could be checked the same way. Sticky, because it should stay true
   while clicking through. */
.kw-preview-bar {
	position: sticky; top: 0; z-index: 2147483000;
	display: flex; flex-wrap: wrap; gap: 6px 16px; align-items: center; justify-content: center;
	padding: 9px 16px; background: #15202b; color: #fff;
	font: 500 13px/1.35 var(--font-stack, system-ui, sans-serif); text-align: center;
}
.kw-preview-bar strong { color: #fff; }
.kw-preview-note { opacity: .72; font-weight: 400; }

/* Visible to search engines and screen readers, not on screen. Used for the
   h1 a banner hero needs when it carries no title of its own — clip rather
   than display:none, which would hide it from assistive tech too. */
.kw-sr-only {
	position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
	overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}

/* ── Section alignment ────────────────────────────────────────────────────
   A section's alignment applies to EVERY element in it. text-align alone was
   not enough for two reasons: it is inherited, so anything carrying its own
   text-align (a feed's .section-title, a hero overlay) ignored it; and it
   cannot move a block that has a max-width, which needs auto margins.
   Both are handled here, so "align the section" means what it says. An
   element that sets its own alignment (.kw-el-*) still wins — those rules
   come later in the file. */
.kw-align-center { text-align: center; }
.kw-align-center :is(h1, h2, h3, h4, h5, h6, p, ul, ol, blockquote, figcaption):not(:is(.blk, .event-blk, .plan-box-1, .kw-listing) *) { text-align: center; }
/* Blocks with a max-width need margins, not text-align, to move. */
.kw-align-center :is(.kw-heading, .kw-rich-text, .kw-button-row, .kw-figure, .section-subtext, .kw-column-body) { margin-left: auto; margin-right: auto; }
.kw-align-center :is(.kw-button-row, .kw-hero-buttons, .kw-social .social-links) { justify-content: center; }
.kw-align-center .kw-image-grid figcaption, .kw-align-center .kw-column { text-align: center; }

/* Heading */
.kw-heading h1 { font-size: 40px; font-weight: 700; margin: 0 0 12px; }
.kw-heading h2 { font-size: 32px; font-weight: 700; margin: 0 0 12px; }
.kw-heading h3 { font-size: 24px; font-weight: 600; margin: 0 0 10px; }
.kw-heading .hightlight-text { margin-bottom: 6px; }
.kw-heading .section-subtext { max-width: 720px; color: #555; }
.kw-align-center .kw-heading .section-subtext { margin-left: auto; margin-right: auto; }
/* Right alignment, mirroring the centered rules above. */
.kw-align-right { text-align: right; }
.kw-align-right :is(h1, h2, h3, h4, h5, h6, p, ul, ol, blockquote, figcaption):not(:is(.blk, .event-blk, .plan-box-1, .kw-listing) *) { text-align: right; }
.kw-align-right :is(.kw-heading, .kw-rich-text, .kw-button-row, .kw-figure, .section-subtext, .kw-column-body) { margin-left: auto; margin-right: 0; }
.kw-align-right :is(.kw-button-row, .kw-hero-buttons, .kw-social .social-links) { justify-content: flex-end; }
.kw-align-right .kw-image-grid figcaption, .kw-align-right .kw-column { text-align: right; }
.kw-align-right .kw-heading .section-subtext { margin-left: auto; margin-right: 0; }
/* Left is not just "no rule": a feed's .section-title and a hero both centre
   by default, so left has to undo that rather than leave it. */
.kw-align-left { text-align: left; }
.kw-align-left :is(h1, h2, h3, h4, h5, h6, p, ul, ol, blockquote, figcaption):not(:is(.blk, .event-blk, .plan-box-1, .kw-listing) *) { text-align: left; }
.kw-align-left :is(.kw-heading, .kw-rich-text, .kw-button-row, .kw-figure, .section-subtext, .kw-column-body) { margin-left: 0; margin-right: auto; }
.kw-align-left :is(.kw-button-row, .kw-hero-buttons, .kw-social .social-links) { justify-content: flex-start; }

/* A button placed on its own, overriding the section. Declared before the
   per-element rules below, which stay the final word. */
.kw-section .kw-button-row.kw-btnrow-left   { justify-content: flex-start; margin-left: 0; margin-right: auto; }
.kw-section .kw-button-row.kw-btnrow-center { justify-content: center; margin-left: auto; margin-right: auto; }
.kw-section .kw-button-row.kw-btnrow-right  { justify-content: flex-end; margin-left: auto; margin-right: 0; }

/* An element's own alignment beats the section's. Placed after the
   .kw-align-* rules above and carrying an extra class, so it wins on both
   specificity and source order — the !important is for .kw-heading h2 and
   friends, which set their own margins further down the file. */
.kw-section .kw-el-left   { text-align: left !important; margin-left: 0 !important; margin-right: auto !important; }
.kw-section .kw-el-center { text-align: center !important; margin-left: auto !important; margin-right: auto !important; }
.kw-section .kw-el-right  { text-align: right !important; margin-left: auto !important; margin-right: 0 !important; }

/* Feed sections (events, campaigns, resources, people...) render their title
   through the site's .section-title, which is centered for the original home
   page. Inside the editor the section's own alignment has to win, or Left and
   Right appear to do nothing on those sections. */
.kw-align-left .section-title { text-align: left; }
.kw-align-left .section-title .section-subtext { margin-left: 0; margin-right: auto; }
.kw-align-right .section-title { text-align: right; }
.kw-align-right .section-title .section-subtext { margin-left: auto; margin-right: 0; }
.kw-align-center .section-title { text-align: center; }
.kw-align-center .section-title .section-subtext { margin-left: auto; margin-right: auto; }
/* Same for people cards and column blocks, which center themselves. */
.kw-align-left .kw-people-grid .kw-person, .kw-align-left .kw-column { text-align: left; }
.kw-align-right .kw-people-grid .kw-person, .kw-align-right .kw-column { text-align: right; }
.kw-align-center .kw-people-grid .kw-person { text-align: center; }

/* A single image is capped by max-width, so without a margin rule it always
   sat left whatever the section's alignment said. Same for the button row,
   which only honoured center and right. */
/* The <figure> spans the container, so aligning it does nothing; it's the
   capped <img> inside that has to move. Size the figure to its contents and
   align that. */
.kw-image, .kw-image-empty { display: block; }
/* The figure is the block alignment moves, so it carries the width cap
   (kw-image-*). It used to be fit-content around an image that was itself
   width:100%, which made the figure span the row — leaving the auto margins
   nothing to shift, so a single image could not be aligned at all. */
.kw-figure { max-width: 100%; }
.kw-align-left .kw-figure { margin-left: 0; margin-right: auto; }
.kw-align-center .kw-figure { margin-left: auto; margin-right: auto; }
.kw-align-right .kw-figure { margin-left: auto; margin-right: 0; }
.kw-align-left .kw-button-row, .kw-align-left .kw-hero-buttons { justify-content: flex-start; }

/* Text colour chosen per section. Set on the wrapper as --kw-text and
   applied to everything that carries words, so a heading, its subtext and
   body copy all follow it rather than only the top-level element. */
/* This is also what lets the admin override the automatic light/dark choice
   a background makes: !important puts their pick above .kw-bg-* contrast. */
.kw-text-custom,
.kw-text-custom h1, .kw-text-custom h2, .kw-text-custom h3, .kw-text-custom h4, .kw-text-custom h5, .kw-text-custom h6,
.kw-text-custom p, .kw-text-custom li, .kw-text-custom summary, .kw-text-custom figcaption,
.kw-text-custom .section-title h2, .kw-text-custom .section-title p,
.kw-text-custom .section-subtext, .kw-text-custom .hightlight-text { color: var(--kw-text) !important; }

/* Text size per section: scales the section's own type together, so a
   heading stays bigger than its subtext. */
.kw-text-sm  { font-size: 0.875em; }
.kw-text-lg  { font-size: 1.15em; }
.kw-text-xl  { font-size: 1.3em; }
/* Headings are sized in px elsewhere, which would ignore the scale above, so
   restate them in em: the ratios between h1/h2/h3 stay as they are and the
   whole section scales together. */
.kw-text-sm .kw-heading h1, .kw-text-lg .kw-heading h1, .kw-text-xl .kw-heading h1 { font-size: 2.5em; }
.kw-text-sm .kw-heading h2, .kw-text-lg .kw-heading h2, .kw-text-xl .kw-heading h2 { font-size: 2em; }
.kw-text-sm .kw-heading h3, .kw-text-lg .kw-heading h3, .kw-text-xl .kw-heading h3 { font-size: 1.5em; }
.kw-text-sm .section-title h1, .kw-text-lg .section-title h1, .kw-text-xl .section-title h1,
.kw-text-sm .section-title h2, .kw-text-lg .section-title h2, .kw-text-xl .section-title h2 { font-size: 2.5em; }

/* Per-paragraph alignment from the rich-text editor (Quill emits these). */
/* The rich text editor's size buttons emit these classes. Relative, so a
   heading styled "large" stays a heading rather than jumping to a fixed
   pixel size, and they inherit whatever the element already is. */
.kw-section .ql-size-small { font-size: .82em; }
.kw-section .ql-size-large { font-size: 1.4em; }
.kw-section .ql-size-huge  { font-size: 2em; }
/* Heading sizes for a few words (the toolbar's Heading 1/2/3 on a heading,
   eyebrow or title): the site's own h1/h2/h3 sizes and weight. */
.kw-section .ql-size-h1 { font-size: clamp(28px, 4.2vw, 40px); font-weight: 700; line-height: 1.2; }
.kw-section .ql-size-h2 { font-size: clamp(25px, 3.8vw, 36px); font-weight: 700; line-height: 1.2; }
.kw-section .ql-size-h3 { font-size: clamp(21px, 3vw, 28px); font-weight: 700; line-height: 1.25; }
.kw-section .ql-align-center { text-align: center; }
.kw-section .ql-align-right { text-align: right; }
.kw-section .ql-align-justify { text-align: justify; }
/* Quill 2 saves every list as <ol>, marking bulleted items data-list="bullet".
   Without these, a bulleted list from the editor showed numbers on the site. */
.kw-section ol li[data-list="bullet"] { list-style-type: disc; }
.kw-section ol li[data-list="ordered"] { list-style-type: decimal; }

/* Rich text */
.kw-rich-text { line-height: 1.75; color: #333; max-width: 860px; }
.kw-rich-text img { max-width: 100%; height: auto; border-radius: 12px; }
.kw-rich-text h1, .kw-rich-text h2, .kw-rich-text h3 { margin: 1em 0 .5em; }

/* Images */
.kw-figure { margin-top: 0; margin-bottom: 0; }
/* Inside a grid each cell is already sized, so the figure fills its cell
   rather than shrinking to the image. */
/* (superseded below: the figure fills its grid cell either way) */
.kw-figure img { display: block; width: 100%; height: auto; border-radius: 16px; object-fit: cover; }
.kw-figure figcaption, .kw-caption { font-size: 14px; color: #666; margin-top: 8px; }
.kw-image-sm { max-width: 360px; }
.kw-image-md { max-width: 640px; }
.kw-image-lg { max-width: 960px; }
.kw-image-full { max-width: 100%; }
/* An empty placeholder has no intrinsic width, and .kw-figure is
   `width: fit-content`, so the box collapsed to a narrow sliver. A real
   image fills its max-width, so the placeholder should too. */
.kw-figure > .kw-image-empty { width: 100%; }
/* The placeholder fills whatever the figure allows, which is now capped. */
.kw-image-empty { display: flex; align-items: center; justify-content: center; min-height: 180px; border: 2px dashed #cfd6de; border-radius: 16px; color: #8a97a5; background: #f8fafc; font-size: 14px; }
/* The prompt inside an empty slot: an icon, what to do, and how. It used to
   say only "Image", which gave no hint the box does anything. */
.kw-image-empty-inner { display: flex; flex-direction: column; align-items: center; justify-content: center;
                        gap: 2px; text-align: center; padding: 8px; line-height: 1.3; }
.kw-image-empty-icon svg { width: 22px; height: 22px; display: block; margin-bottom: 2px; }
.kw-image-empty-label { font-weight: 600; font-size: 13px; }
.kw-image-empty-sub { font-size: 12px; opacity: .75; }
/* In a small slot the icon and the second line crowd the box, so they go. */
.kw-image-grid .kw-image-empty-icon, .kw-column .kw-image-empty-icon { display: none; }
.kw-image-grid .kw-image-empty-label, .kw-column .kw-image-empty-label { font-size: 12px; }
.kw-image-grid .kw-image-empty-sub, .kw-column .kw-image-empty-sub { font-size: 11px; }

/* In the editor a placeholder takes a click or a dropped file, so it has to
   look like something you can act on rather than a dead rectangle. */
.kw-edit .kw-image-empty[data-kw-img] { cursor: pointer; transition: border-color .12s, background .12s, color .12s; }
.kw-edit .kw-image-empty[data-kw-img]:hover { border-color: #2563eb; background: #f3f7ff; color: #2563eb; }
.kw-edit .kw-image-empty.kw-img-over { border-color: #2563eb; border-style: solid; background: #e8f0ff; color: #1d4ed8; }
.kw-edit .kw-image-empty.kw-img-busy { border-style: solid; opacity: .7; }
.kw-image-empty.kw-square { aspect-ratio: 1 / 1; min-height: 0; }
.kw-hero-empty { min-height: 320px; border-radius: 0; }
/* A heading and a line of text belonging to an image row, above the grid,
   plus an optional caption under it. */
.kw-row-head { margin-bottom: 20px; }
.kw-row-head h2 { font-size: 32px; font-weight: 700; margin: 0 0 8px; }
.kw-row-text { color: #555; max-width: 720px; }
.kw-row-caption { margin-top: 14px; font-size: 14px; color: #666; }
.kw-align-center .kw-row-text, .kw-align-center .kw-row-caption { margin-left: auto; margin-right: auto; }
.kw-align-right .kw-row-text, .kw-align-right .kw-row-caption { margin-left: auto; margin-right: 0; }

.kw-image-grid, .kw-gallery, .kw-columns, .kw-people-grid { display: grid; gap: 24px; }
.kw-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.kw-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.kw-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.kw-image-grid .kw-figure img { aspect-ratio: 4 / 3; }
/* An empty slot must be the same shape as the image that will replace it.
   min-height alone made a 3-up row render as thin letterbox strips (360x180
   where the real image is 360x270), so a fresh template looked broken rather
   than unfinished. Mirror each context's own ratio. */
/* An empty slot is exactly the size the image that replaces it will be:
   same width, same aspect ratio, so nothing jumps or resizes on upload. A
   min-height was fighting the ratio — at 120px against a 4/3 box roughly
   270px tall, the placeholder was less than half the final height, which is
   why the row appeared to double when an image was added. */
.kw-image-grid .kw-image-empty { aspect-ratio: 4 / 3; min-height: 0; width: 100%; }
.kw-gallery .kw-image-empty    { aspect-ratio: 1 / 1; min-height: 0; width: 100%; }
.kw-column .kw-image-empty     { aspect-ratio: 4 / 3; min-height: 0; width: 100%; }
/* The figure must fill its grid cell whether it holds an image or a
   placeholder; width:auto alone let an empty one collapse. */
.kw-image-grid .kw-figure, .kw-gallery .kw-figure { width: 100%; }
/* The dashed border and label shrink with the box so they stay legible. */
.kw-image-grid .kw-image-empty, .kw-gallery .kw-image-empty, .kw-column .kw-image-empty {
	border-radius: 10px; font-size: 13px;
}
.kw-gallery-item { display: block; border-radius: 12px; overflow: hidden; }
.kw-gallery-item img { display: block; width: 100%; aspect-ratio: 1 / 1; object-fit: cover; transition: transform .25s; }
.kw-gallery-item:hover img { transform: scale(1.03); }

/* Video */
.kw-video { position: relative; width: 100%; max-width: 960px; aspect-ratio: 16 / 9; border-radius: 16px; overflow: hidden; background: #000; }
.kw-video iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.kw-video-empty { max-width: 960px; aspect-ratio: 16 / 9; min-height: 0; }

/* Buttons */
.kw-button-row, .kw-hero-buttons { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 16px; }
.kw-btn-outline { display: inline-flex; align-items: center; justify-content: center; gap: 10px; box-sizing: border-box; min-height: 48px; padding: 0 24px; border: 2px solid var(--theme-color, #15202b); color: var(--theme-color-readable, var(--theme-color, #15202b)); border-radius: 8px; font-weight: 600; text-decoration: none; transition: all .2s; }
.kw-btn-outline:hover { background: var(--theme-color, #15202b); color: var(--theme-on-primary, #fff); }
.kw-bg-dark .kw-btn-outline { border-color: #fff; color: #fff; }

/* Divider + spacer */
/* A divider narrower than the section follows the section's alignment:
   left by default, centred or right-shifted when the admin chooses. */
.kw-divider { border: 0; border-top: 1px solid #e3e8ee; margin: 0; }
.kw-align-center .kw-divider { margin-left: auto; margin-right: auto; }
.kw-align-right .kw-divider { margin-left: auto; margin-right: 0; }
.kw-spacer-sm { height: 24px; }
.kw-spacer-md { height: 56px; }
.kw-spacer-lg { height: 120px; }

/* Columns */
.kw-column h4 { font-size: 20px; font-weight: 600; margin: 12px 0 8px; }
.kw-column-body { color: #555; line-height: 1.7; }
.kw-column-img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: 12px; }
.kw-column .kw-btn-outline { margin-top: 12px; min-height: 0; padding: 8px 20px; font-size: 14px; }
/* A button given its own colour (kw_button, kw-btn-c): --kw-c is the colour,
   --kw-on the readable text on it. Placed after the dark-background rule so a
   chosen colour wins there too. */
.theme-btn.kw-btn-c { background: var(--kw-c); border-color: var(--kw-c); color: var(--kw-on); }
.theme-btn.kw-btn-c:hover { background: var(--kw-c); border-color: var(--kw-c); color: var(--kw-on); filter: brightness(.92); }
.kw-btn-outline.kw-btn-c, .section-cta-btn.kw-btn-c { border-color: var(--kw-c); color: var(--kw-c); }
.kw-btn-outline.kw-btn-c:hover, .section-cta-btn.kw-btn-c:hover { background: var(--kw-c); border-color: var(--kw-c); color: var(--kw-on); }

/* Hero variants */
.kw-hero-banner { position: relative; }
/* The overlay is a flex row, and its heading has a max-width, so neither
   text-align nor the section's alignment could move the title — it sat left
   whatever was chosen. The gradient is also directional, so it is flipped to
   match. */
.kw-hero-overlay { position: absolute; inset: 0; display: flex; align-items: center; background: linear-gradient(90deg, rgba(0,0,0,.55), rgba(0,0,0,.15)); color: #fff; }
.kw-hero-overlay h1 { color: #fff; font-size: 44px; font-weight: 700; margin: 0 0 12px; max-width: 640px; }
.kw-hero-overlay p { color: #fff; font-size: 18px; max-width: 560px; }
/* Where the words sit on a banner. The overlay is a flex box, so the two
   axes place the block; text-align then sets how the lines run within it.
   The gradient follows, so the dark side is always behind the words. */
.kw-hero-overlay { justify-content: flex-start; }
.kw-ov-top-left,    .kw-ov-top-center,    .kw-ov-top-right    { align-items: flex-start; }
.kw-ov-center-left, .kw-ov-center-center, .kw-ov-center-right { align-items: center; }
.kw-ov-bottom-left, .kw-ov-bottom-center, .kw-ov-bottom-right { align-items: flex-end; }
/* The container keeps the page's gutters but must span the overlay, or
   Bootstrap's `margin: 0 auto` centres the words whatever side is chosen.
   The words are then placed inside it. */
.kw-hero-overlay > .container { width: 100%; max-width: 100%; display: flex; flex-direction: column; }
.kw-ov-top-left    > .container, .kw-ov-center-left   > .container, .kw-ov-bottom-left   > .container { align-items: flex-start; text-align: left; }
.kw-ov-top-center  > .container, .kw-ov-center-center > .container, .kw-ov-bottom-center > .container { align-items: center; text-align: center; }
.kw-ov-top-right   > .container, .kw-ov-center-right  > .container, .kw-ov-bottom-right  > .container { align-items: flex-end; text-align: right; }
/* The gradient darkens whichever side the words are on. */
.kw-ov-top-center, .kw-ov-center-center, .kw-ov-bottom-center { background: linear-gradient(180deg, rgba(0,0,0,.45), rgba(0,0,0,.45)); }
.kw-ov-top-right, .kw-ov-center-right, .kw-ov-bottom-right { background: linear-gradient(270deg, rgba(0,0,0,.55), rgba(0,0,0,.15)); }
/* Image left, words right: flex order, so the words stay first in the
   markup for screen readers and crawlers. */
@media (min-width: 992px) {
	.kw-hero-split-rev .row { flex-direction: row-reverse; }
}

/* The banner's own `overlay` setting places its words now (kw-ov-*), so the
   section alignment must not also push them around — it was centering them
   whatever side was chosen, because every hero defaults to align:center. */
.kw-hero-text { padding: 96px 0; }
.kw-hero-text h1 { font-size: 44px; font-weight: 700; margin: 0 0 16px; }
.kw-hero-text .lead { color: #555; max-width: 720px; margin: 0 auto; }
.kw-hero-text-bg { background-size: cover; background-position: center; color: #fff; position: relative; }
.kw-hero-text-bg::before { content: ""; position: absolute; inset: 0; background: rgba(0,0,0,.5); }
.kw-hero-text-bg .container { position: relative; }
.kw-hero-text-bg h1, .kw-hero-text-bg .lead { color: #fff; }
.kw-hero-split { padding: 60px 0; }
.kw-hero-split .hero-title { font-size: 40px; font-weight: 700; margin-bottom: 15px; }
.kw-hero-split .hero-sub { font-size: 18px; color: #555; max-width: 500px; }
.kw-hero-split .hero-image { width: 100%; height: 320px; border-radius: 16px; object-fit: cover; background: #eee; }

/* About cards reuse the about page styles when rendered elsewhere */
.kw-about-cards { padding: 60px 0; }
.kw-about-cards .card-clean { background: #fff; border-radius: 16px; padding: 25px; box-shadow: 0 10px 25px rgba(0,0,0,.08); margin-bottom: 20px; }
.kw-about-cards .section-title { font-weight: 600; margin-bottom: 12px; }
.kw-about-cards .text-muted-custom { color: #555; line-height: 1.7; }
.kw-about-cards .quote { font-style: italic; border-left: 4px solid var(--theme-color); padding-left: 15px; margin: 0; color: #555; line-height: 1.7; }
.kw-about-cards .contact-item, .kw-contact .contact-item { font-size: 14px; margin-bottom: 8px; }
.kw-about-cards .map, .kw-contact .map { width: 100%; border-radius: 12px; overflow: hidden; }

/* Plans + directory feeds */
.kw-plans .plan-tab-contents { height: 100%; }
.kw-plan-fee { font-weight: 700; font-size: 20px; margin: 0 0 8px; }
.kw-dir-card { display: flex; gap: 14px; align-items: flex-start; background: #fff; border: 1px solid #e3e8ee; border-radius: 16px; padding: 18px; margin-bottom: 24px; color: inherit; text-decoration: none; height: calc(100% - 24px); }
.kw-dir-card img, .kw-dir-card .kw-avatar { width: 56px; height: 56px; border-radius: 12px; object-fit: cover; flex: none; }
.kw-dir-card h5 { font-size: 17px; margin: 0 0 4px; }
.kw-dir-desc { font-size: 14px; color: #555; margin: 0; }

/* People */
.kw-avatar { display: inline-flex; align-items: center; justify-content: center; width: 96px; height: 96px; border-radius: 50%; background: var(--theme-light, #eef2f6); color: var(--theme-color-readable, var(--theme-color, #15202b)); font-weight: 700; font-size: 32px; }
.kw-avatar-sm { width: 36px; height: 36px; font-size: 14px; }
.kw-people-grid .kw-person { display: block; text-align: center; color: inherit; text-decoration: none; }
.kw-people-grid .kw-person img { width: 140px; height: 140px; border-radius: 50%; object-fit: cover; }
.kw-people-grid .kw-person .kw-avatar { width: 140px; height: 140px; font-size: 44px; }
.kw-people-grid .kw-person-body { margin-top: 12px; }
.kw-people-list .kw-person { display: flex; gap: 18px; align-items: center; padding: 14px 0; border-bottom: 1px solid #e3e8ee; color: inherit; text-decoration: none; }
.kw-people-list .kw-person img { width: 72px; height: 72px; border-radius: 50%; object-fit: cover; flex: none; }
.kw-people-list .kw-person .kw-avatar { width: 72px; height: 72px; font-size: 24px; flex: none; }
.kw-person h5 { font-size: 18px; margin: 0 0 2px; }
.kw-person-title { color: var(--theme-color-readable, var(--theme-color)); font-weight: 600; font-size: 14px; margin: 0 0 6px; }
.kw-person-bio { font-size: 14px; color: #555; margin: 0; line-height: 1.6; }
.kw-person-email { font-size: 14px; margin: 6px 0 0; }

/* Committees */
.kw-committees { display: grid; gap: 20px; }
.kw-committee { background: #fff; border-radius: 16px; padding: 24px; box-shadow: 0 10px 25px rgba(0,0,0,.06); }
.kw-committee :is(h3, h4) { font-size: 20px; font-weight: 700; margin: 0 0 8px; }
.kw-committee-desc { color: #555; line-height: 1.7; }
.kw-committee-people { list-style: none; padding: 0; margin: 14px 0 0; display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }
.kw-committee-people li { display: flex; align-items: center; gap: 10px; }
.kw-committee-people img { width: 36px; height: 36px; border-radius: 50%; object-fit: cover; }
.kw-committee-people em { color: #666; font-style: normal; font-size: 13px; }

/* Contact, social, FAQ */
.kw-contact h3, .kw-social h3 { font-size: 26px; font-weight: 700; margin: 0 0 16px; }
.kw-social .social-links { display: flex; gap: 14px; list-style: none; padding: 0; margin: 0; }
.kw-social .social-links a { display: inline-flex; align-items: center; justify-content: center; }
/* Icon size. `md` is the footer's 28px, so the same icons are the same size
   in both places unless the admin changes it. */
.kw-social-sm .social-links img { width: 20px; height: 20px; }
.kw-social-md .social-links img { width: 28px; height: 28px; }
.kw-social-lg .social-links img { width: 36px; height: 36px; }
.kw-social-xl .social-links img { width: 48px; height: 48px; }
/* Circle: a disc behind the icon. The brand colour is used at low opacity
   rather than at full strength — the icons are full-colour brand marks with
   dark glyphs (TikTok and X are black), so a saturated or dark disc swallowed
   them. A pale tint keeps every icon legible whatever the org's colours are.
   The icons carry no white disc of their own any more; this IS the circle. */
.kw-social-circle .social-links a {
	border-radius: 50%;
	padding: 12px;
	background: color-mix(in srgb, var(--theme-light, #eef2f6) 18%, #fff);
}
/* color-mix is widely supported but not universal; a plain tint is the
   fallback for anything that does not understand it. */
@supports not (background: color-mix(in srgb, red 50%, #fff)) {
	.kw-social-circle .social-links a { background: #eef2f6; }
}
.kw-social-plain .social-links a { background: none; padding: 0; }
/* Elements that are narrower than their section need the section's alignment
   applied as a margin — text-align alone does not move a block with a
   max-width. The video was always stuck to the left for this reason. */
.kw-align-center .kw-video, .kw-align-center .kw-video-empty { margin-left: auto; margin-right: auto; }
.kw-align-right  .kw-video, .kw-align-right  .kw-video-empty { margin-left: auto; margin-right: 0; }
.kw-align-center .kw-committee-people, .kw-align-center .kw-people-list { justify-content: center; }
.kw-align-right  .kw-committee-people, .kw-align-right  .kw-people-list { justify-content: flex-end; }

/* The section's alignment moves the row, not just the text inside it. */
.kw-align-center .kw-social .social-links { justify-content: center; }
.kw-align-right  .kw-social .social-links { justify-content: flex-end; }
/* FAQ sections render through web/components/_faq.php, so they use the
   site's own .detail-faq-* styles — nothing editor-specific here. */

/* Editor-only */
.kw-placeholder { border: 2px dashed #cfd6de; border-radius: 12px; padding: 24px; text-align: center; color: #6b7a89; font-size: 14px; background: #f8fafc; margin: 8px 0; }
.kw-empty-page { padding: 120px 0; text-align: center; color: #6b7a89; }
.kw-mobile-sub a { padding-left: 32px !important; font-size: 14px; }

@media (max-width: 991px) {
  .kw-cols-3, .kw-cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .kw-hero-overlay h1 { font-size: 32px; }
}
@media (max-width: 575px) {
  .kw-cols-2, .kw-cols-3, .kw-cols-4 { grid-template-columns: 1fr; }
  /* The campaigns feed tightens a little further than the 767px step. */
  .kw-section div.campaigns-area { padding: 24px 0 44px 0; }
  .kw-heading h1, .kw-hero-text h1 { font-size: 30px; }

  /* A banner's overlay position is a desktop decision: on a phone there is
     no room either side, so a left or right placement wastes most of the
     width and wraps a long title badly. Centre them all, keeping the
     vertical placement the admin chose. */
  .kw-hero-overlay > .container { align-items: center !important; text-align: center !important; }
  .kw-hero-overlay :is(h1, p) { max-width: 100%; }
  .kw-hero-overlay { background: linear-gradient(180deg, rgba(0,0,0,.5), rgba(0,0,0,.5)); }

  /* Social icons: the largest size is a 72px circle, so five of them
     overflow a narrow phone. Let the row wrap and cap the size. */
  .kw-social .social-links { flex-wrap: wrap; }
  .kw-social-xl .social-links img { width: 34px; height: 34px; }
  .kw-social-circle .social-links a { padding: 9px; }

  /* The minimal footer forces its links into one row, which overflows
     sideways on a phone. */
  .site-footer.kw-foot-minimal ul.menu-links { gap: 10px 16px; }
  /* Centered: the side-by-side columns stack on a phone, where there is no
     room for them — the desktop arrangement is the point of the layout. */
  .site-footer.kw-foot-centered .footer-grid { grid-template-columns: 1fr; }
  .site-footer.kw-foot-centered .footer-explore-combined,
  .site-footer.kw-foot-centered .footer-contact { grid-column: 1 / -1; }

  /* A split hero's image is 320px tall, which dominates a phone screen
     once it stacks under the text. */
  .kw-hero-split .hero-image { height: 200px; }
}

/* ── Listing cards ──────────────────────────────────────────────────────────
   Shared by the editor's People/Directory sections (web/components/
   _listing_card.php). Mirrors the directory page's own cards so a board of
   directors built here matches the directory it came from. */
.kw-listings { display: grid; gap: 24px; }
.kw-listings.kw-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.kw-listings.kw-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.kw-listings.kw-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.kw-listings-list { grid-template-columns: 1fr; gap: 12px; }

.kw-listing { position: relative; display: block; color: inherit; text-decoration: none; overflow: hidden; background: #fff; }
.kw-listings-card .kw-listing { border: 1px solid var(--line, #e3e8ee); box-shadow: 0 2px 10px rgba(16, 24, 40, .06); transition: box-shadow .15s, transform .15s; }
.kw-listings-card .kw-listing:hover { box-shadow: 0 8px 24px rgba(16, 24, 40, .12); transform: translateY(-2px); }
.kw-listings-plain .kw-listing { background: transparent; border: 0; box-shadow: none; text-align: inherit; }
.kw-listings-list .kw-listing { display: flex; align-items: center; gap: 16px; padding: 10px; }
.kw-listings-list .kw-listing-img, .kw-listings-list .kw-listing-initials { width: 64px; height: 64px; flex: none; }
.kw-listings-list .kw-listing-body { padding: 0; }

.kw-listing-img, .kw-listing-initials { display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover; }
.kw-listing-initials { display: grid; place-items: center; color: #fff; font-size: 30px; font-weight: 700; aspect-ratio: 4 / 3; }
.kw-listing-body { padding: 14px 16px 16px; }
.kw-listing-category { font-size: 12px; text-transform: uppercase; letter-spacing: .05em; color: #6b7280; margin: 0 0 4px; }
.kw-listing-name { font-size: 17px; font-weight: 700; margin: 0 0 2px; }
.kw-listing-role { font-size: 14px; color: var(--theme-color-readable, #0997d9); margin: 0 0 6px; font-weight: 600; }
.kw-listing-bio { font-size: 14px; color: #4b5563; line-height: 1.5; margin: 0 0 6px; }
.kw-listing-address, .kw-listing-phone, .kw-listing-email { font-size: 13.5px; color: #4b5563; margin: 0 0 2px; }
.kw-listing-badge { position: absolute; top: 10px; left: 10px; z-index: 2; background: #fff; border-radius: 999px; padding: 3px 10px; font-size: 11.5px; font-weight: 600; box-shadow: 0 1px 4px rgba(0,0,0,.18); }

/* Corner roundness, so a section can match the rest of the site or stand apart. */
.kw-round-default .kw-listing { border-radius: 14px; }
.kw-round-soft    .kw-listing { border-radius: 24px; }
.kw-round-square  .kw-listing { border-radius: 0; }
/* The same corner options on plan cards (memberships, groups), so those
   sections match the directory's controls. */
.kw-plans.kw-round-soft   .plan-tab-contents { border-radius: 24px; }
.kw-plans.kw-round-square .plan-tab-contents { border-radius: 0; }
.kw-round-circle  .kw-listing { border-radius: 14px; }
.kw-round-circle .kw-listing-img, .kw-round-circle .kw-listing-initials {
  aspect-ratio: 1 / 1; border-radius: 50%; width: 132px; height: 132px; margin: 18px auto 0;
}
.kw-round-circle .kw-listing-body { text-align: center; }
.kw-listings-list.kw-round-circle .kw-listing-img,
.kw-listings-list.kw-round-circle .kw-listing-initials { width: 64px; height: 64px; margin: 0; }
.kw-listings-list.kw-round-circle .kw-listing-body { text-align: left; }

@media (max-width: 991px) { .kw-listings.kw-cols-3, .kw-listings.kw-cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 575px) { .kw-listings { grid-template-columns: 1fr; } }
