/*   Theme default css */
@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");

:root {
  /* ── Brand design tokens ──────────────────────────────────────────────
     Single source of truth for site theming. Per-org white-label overrides
     are injected from <head> in home.php when kd_org carries primary_color
     / secondary_color / font_family values. */

  /* Primary action color (buttons, links, focus rings). */
  --theme-color: #0997d9;

  /* Darker shade of primary for :hover / :active states.
     The fallback works in every browser. The color-mix line wins in modern
     browsers (Chrome 111+, Safari 16.2+, Firefox 113+) and auto-derives
     hover from whatever --theme-color resolves to — so a white-label org
     that overrides --theme-color gets a coherent hover for free. */
  --theme-color-hover: #087cb2; /* fallback */
  --theme-color-hover: color-mix(in srgb, var(--theme-color), black 15%);

  /* Soft tint of primary (card backgrounds, subtle highlights, badges). */
  --theme-light: #e6f5fb;

  /* Text color when sitting on top of --theme-color (e.g. button labels,
     pill content, owl arrow glyphs). Default is white; theme-contrast.js
     reads --theme-color's sRGB luminance at load and overrides this to
     #1a1a1a on :root if the primary is too pale for white text to read
     (cream, pastel pink, soft yellow). */
  --theme-on-primary: #ffffff;

  /* Same idea for --theme-light (the org's secondary). Default is dark
     text because --theme-light is meant to be a soft tint, but an org
     can override it with a saturated secondary color via the dashboard;
     theme-contrast.js flips this to white when that happens. */
  --theme-on-secondary: #1a1a1a;

  /* A version of --theme-color that's guaranteed to read on a white
     background. Default falls through to --theme-color itself, but
     theme-contrast.js iteratively darkens this if the primary's
     luminance is too high (e.g. a near-white pink) so outline buttons
     and theme-colored text on white cards stay visible. */
  --theme-color-readable: var(--theme-color);

  /* Same idea for the secondary: a version of --theme-light that's
     guaranteed to read on a white background. Used for outline buttons
     that should follow the secondary brand color (e.g. the homepage
     'View all X' CTAs). */
  --theme-light-readable: var(--theme-light);

  /* Site-wide font stack. Defaults to Poppins. Per-org overrides from
     home.php's wl-theme-overrides block reassign this to the org's
     chosen font (e.g. Roboto, Lora, Inter, Nunito) on :root, and the
     same block dynamically loads the font from Google Fonts. Every
     surface in the site CSS references var(--font-stack) instead of
     hardcoding "Poppins", sans-serif so a dashboard font change flows
     everywhere with no per-rule update. */
  --font-stack: "Poppins", sans-serif;

  /* Kannect's blue→magenta identity gradient. Hidden via the
     wl-hide-kannect <style> block in <head> when an org opts out of
     showing Kannect branding. */
  --kannect-grad: linear-gradient(to right, #0997d9 0%, #ff0090 100%);

  /* Neutrals. */
  --white-color: #ffffff;
  --black-color: #000000;
  scroll-behavior: smooth;
}
html,
body {
  overflow-x: hidden;
}
body {
  font-family: var(--font-stack);
  font-weight: 400;
  color: #505050;
  font-size: 16px;
  line-height: 1.6875;
}
button {
  cursor: pointer;
}

a:focus,
.button:focus {
  text-decoration: none;
  outline: none;
}

a:focus,
a:hover {
  color: inherit;
  text-decoration: none;
}

a,
button {
  color: inherit;
  outline: medium none;
  transition: 0.3s;
}
a:hover {
  color: var(--theme-color-readable);
}

button:focus,
input:focus,
input:focus,
textarea,
textarea:focus {
  outline: 0;
}

h1,
h2,
h3,
h4,
h5,
h6 {
  font-family: var(--font-stack);
  color: #505050;
  margin-top: 0px;
  text-transform: normal;
}

a.underline {
  text-decoration: underline;
}

h1 a,
h2 a,
h3 a,
h4 a,
h5 a,
h6 a {
  color: inherit;
}

h1 {
  font-size: 40px;
}

h2 {
  font-size: 36px;
}

h3 {
  font-size: 28px;
}

h4 {
  font-size: 22px;
}

h5 {
  font-size: 18px;
}

h6 {
  font-size: 16px;
}

ul {
  margin: 0px;
  padding: 0px;
}

li {
  list-style: none;
}

img {
  max-width: 100%;
}
a {
  text-decoration: none;
  color: inherit;
}
button {
  border: none;
  outline: none;
  background: none;
  padding: 0;
  line-height: auto;
}

.bg-attachment {
  background-size: cover;
  background-position: center center;
  background-repeat: no-repeat;
}
.position-relative {
  position: relative;
  z-index: 1;
}
.white-content h1,
.white-content h2,
.white-content h3,
.white-content h4,
.white-content h5,
.white-content h6,
.white-content p,
.white-content a {
  color: #ffffff;
}
input,
textarea {
  width: 100%;
  border: 1px solid transparent;
  background-color: #f8faf9;
  border-radius: 10px;
  padding: 0.7em;
  transition: 0.3s;
}
input:focus,
textarea:focus {
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
::-moz-placeholder,
::placeholder {
  color: #505050;
  opacity: 1;
}
::-ms-placeholder {
  color: #505050;
}
::-webkit-input-placeholder {
  color: #505050;
}

.hide {
  display: none;
}
/* default-css END 
================================== */

.header-area {
  padding: 10px 0;
  width: 100%;
  z-index: 99;
}
.menu-area ul {
  display: flex;
  justify-content: flex-end;
  flex-wrap: wrap;
  gap: 30px;
}
.menu-area nav ul li {
  list-style: none;
  display: inline-block;
}

.menu-area nav ul li a {
  position: relative;
}
.menu-area nav ul li a.active {
  font-weight: 700;
  color: var(--theme-color-readable);
}
.logo-area {
  display: block;
  font-size: 24px;
  font-weight: 600;
}

.logo-area a {
  display: ruby;
}

.menu-area {
  text-align: right;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 30px;
}
.theme-btn {
  outline: none;
  border: none;
  width: max-content;
  background: var(--theme-color);
  display: flex;
  padding: 0 20px;
  height: 48px;
  color: var(--theme-on-primary);
  line-height: 48px;
  border-radius: 8px;
  border: 1px solid var(--theme-color);
  transition: 0.3s;
  align-items: center;
  justify-content: center;
  gap: 10px;
  font-weight: 600;
}
.theme-btn:hover {
  background: var(--theme-color-hover);
  color: var(--theme-on-primary);
}
.header-action {
  gap: 10px;
}
/* humbergar */
.bar a {
  width: 30px;
  height: 35px;
  float: right;
  position: relative;
}
.bar a span {
  width: 100%;
  height: 3px;
  background: #121212;
  display: block;
  position: relative;
  top: 17px;
  border-radius: 30px;
  transition: 0.3s;
}
.bar a span:before {
  left: 0;
  content: "";
  position: absolute;
  width: 100%;
  height: 100%;
  background: #121212;
  bottom: 10px;
  border-radius: 30px;
  transition: 0.3s;
}
.bar a span:after {
  left: 0;
  content: "";
  position: absolute;
  width: 100%;
  height: 100%;
  background: #121212;
  bottom: -10px;
  border-radius: 30px;
  transition: 0.3s;
}

/* humbarger END */

/* mobile-menu START */
.mobile-menu {
  position: fixed;
  width: 320px;
  height: 100vh;
  background: #ffffff;
  z-index: 99;
  box-shadow: 0px 0px 9px -1px #737373;
  top: 0;
  left: 0;
  transition: 0.3s;
  margin-left: -400px;
  padding-left: 30px;
  padding-top: 15px;
}
.siteBar {
  margin-left: 0;
}
.mobile-menu a.logo {
  display: block;
  max-width: 150px;
  margin-bottom: 45px;
}
.mobile-menu nav ul li {
  list-style: none;
  display: block;
}

.mobile-menu nav ul li a {
  color: #272835;
  font-size: 16px;
  line-height: 40px;
  transition: 0.3s;
}

.mobile-menu nav ul li a:hover {
  color: var(--theme-color-readable);
}

.mobile-menu a.theme-btn {
  margin-top: 60px;
  margin-left: 0;
}
.mobile-menu a.theme-btn {
  margin-top: 60px;
  margin-left: 0;
  height: 45px;
  line-height: 45px;
}
.mobile-menu a.bars {
  position: absolute;
  right: 20px;
  top: 15px;
  width: 40px;
  height: 40px;
  background: #ff4900;
  text-align: center;
  line-height: 38px;
  border-radius: 50%;
  font-size: 22px;
  color: #fff;
  box-shadow: 0px 0px 17px -2px #0000004a;
}

/* Header section END */

/* Hero-area START */
section.hero-area {
  padding: 30px 0;
  background-size: cover;
  background-position: top;
}

/* Hero variant that uses an <img> instead of CSS background-image (see
   web/org.php). The <img> path lets a small JS script swap in the mobile
   variant on narrow viewports when the -mobile file exists, with the
   desktop image serving as the fallback when it doesn't. CSS background-
   image can't do that fallback safely. The <img> covers the 500px hero
   the same way background-size: cover + background-position: top did. */
.hero-area-with-image {
  position: relative;
  /* Desktop hero: 650px. Was 500px — too short for the 1920x960 banners
     we serve, users' banner content was getting heavily cropped top +
     bottom because object-fit: cover fills the box regardless of the
     image's aspect ratio. Bumping to 650 shows more of the banner.
     Mobile keeps a shorter height (see responsive.css) so it doesn't
     dominate the fold on phones. */
  height: 650px;
  padding: 0;
  overflow: hidden;
}
.hero-area-with-image .hero-area-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: top;
  display: block;
}

.hero-area h1 {
  font-size: 80px;
  font-weight: 500;
  color: #fff;
  padding-bottom: 0px;
  background: rgba(0, 0, 0, 0.5);
}

.hero-area h2 {
  font-size: 54px;
  font-weight: 500;
  color: #fff;
  background: rgba(0, 0, 0, 0.5);
  margin-top: -8px;
}

.hero-wrap h2 {
  font-size: 48px;
  font-weight: 500;
  margin-bottom: 30px;
  color: #fff;
}

.hero-wrap p {
  font-size: 22px;
  font-weight: 500;
  color: #fff;
  margin-bottom: 30px;
}

.hero-wrap a.theme-btn {
  margin: auto;
}
/* Hero-area END */

/* About-area START */
section.about-area {
  padding: 150px 0;
}
.about-box {
  padding: 30px;
  /* text-align: center; */
  background-color: var(--theme-light);
  color: var(--theme-on-secondary);
  border-radius: 5px;
}
/* The h1-h6 base rule (this file, top) sets color:#505050 which beats
   the about-box color via inheritance. Set heading colors explicitly so
   the headline + subhead inside the about box read against --theme-light
   regardless of the org's secondary luminance. */
.about-box h1,
.about-box h2,
.about-box h3,
.about-box h4,
.about-box h5,
.about-box h6 {
  color: var(--theme-on-secondary);
}

.about-box p {
  margin-bottom: 0px;
}

/* Force theme color on rich-text inside the org about-box. The dashboard's
   Quill editor exports paragraph text as <span style="color: rgb(0,0,0)">
   which then beats every CSS rule (including .about-box's own theme color)
   and renders as pure black on a themed background — unreadable when the
   theme background is dark. The near-gray sanitizer in controller.php
   correctly leaves pure black alone (some orgs intend it against a light
   background), but here we DO want to override it because the container
   sets its own color-on-background pairing. Scoped to .about-box so
   inline colors in event/article rich text (different containers) are
   still respected. */
.about-box .org-about-rich-text,
.about-box .org-about-rich-text * {
  color: var(--theme-on-secondary) !important;
}
/* Restore dark text inside the quote card (.about-inner-wrap). It's a
   light-background pull-out that lives inside the about-box, so the
   theme-on-secondary override above would render its text unreadable.
   Higher-specificity + later-in-file wins over the block above. */
.about-box .org-about-rich-text .about-inner-wrap,
.about-box .org-about-rich-text .about-inner-wrap * {
  color: #222 !important;
}

/* .about-box h4 {
  font-size: 36px;
  margin-bottom: 30px;
  color: #505050;
}

.about-box h6 {
  font-size: 16px;
  margin-bottom: 0px;
  font-weight: 500;
  color: #505050;
} */

.about-imgs {
  display: flex;
  align-items: center;
  gap: 15px;
  overflow: hidden;
}

.about-imgs img:first-child {
  width: 280px;
  height: 400px;
  object-fit: cover;
  object-position: center;
}

.about-imgs img:last-child {
  width: 360px;
  height: 560px;
  object-fit: cover;
  object-position: center;
}

.hightlight-text {
  font-weight: 500;
  margin-bottom: 0px;
}

.about-inner-wrap {
  border-radius: 5px;
  padding: 25px;
  background: #f8faf9;
  color: #222;
  margin: 25px 0;
}

.about-inner-wrap p:last-child {
  margin: 0;
}
/* About-area END */

/* Campains-area START */
.section-title {
  text-align: center;
  margin-bottom: 60px;
}
/* Match listing-page headings: 40px / 700 Poppins (campaigns.php,
   events.php, resources.php, groups.php all use .listing-hero h1 with
   these values). The base h2 rule sets font-size: 36px which made the
   home headings feel lighter/smaller than the rest of the site. */
.section-title h1,
.section-title h2 {
  font-family: var(--font-stack);
  font-size: 40px;
  font-weight: 700;
}
.section-title .section-subtext {
  max-width: 720px;
  margin: 14px auto 0;
  color: #666;
  font-family: var(--font-stack);
  font-size: 1.05rem;
  line-height: 1.7;
}
.blk {
  background: #fff;
  border-radius: 5px;
  box-shadow: 0 4px 12px 0 #00000014;
  margin: 30px 0;
  padding: 8px;
  cursor: pointer;
}

.blk-top {
  display: block;
  width: 100%;
  position: relative;
}

.blk-top img {
  display: block;
  width: 100%;
  border-radius: 5px;
  max-height: 300px;
}

.blk-wrap {
  margin-top: -20px;
  padding: 10px 15px;
}

.categ {
  position: absolute;
  bottom: 38px;
  left: 10px;
  z-index: 2;
  padding: 2px 10px;
  border-radius: 15px;
  color: #fff;
  font-size: 14px;
}

.blk-wrap h4 {
  font-size: 20px;
}

.the_progs {
  position: relative;
  text-align: right;
  margin-bottom: 20px;
}

.the_progs > div {
  width: 100%;
  background: #f8faf9;
  padding: 5px;
  border-radius: 2px;
  margin-top: 5px;
  /* Safety net for the inline width on the inner fill. The card templates
     already clamp percentage_bar to [0, 100] but a missed caller (or a
     dashboard widget that bypasses the clamp) would otherwise blow the
     bar out 1000%+ on over-funded campaigns. overflow: hidden keeps the
     visual bar inside its track no matter what width gets inlined. */
  overflow: hidden;
}

.the_progs > div div {
  display: block;
  height: 5px;
  background: var(--theme-color);
  border-radius: 10px;
  /* Second safety net — even if the parent's overflow were ever removed,
     max-width here prevents a horizontal scrollbar from leaking onto the
     page from a 100000%-wide child. */
  max-width: 100%;
}

.blk-wrap p {
  margin-bottom: 10px;
}

.blk-wrap a.theme-btn {
  color: var(--theme-color-readable);
  background: transparent;
  /* Center the card button consistently across both campaign card layouts
   * (max-content button centered via auto side margins). */
  margin: 25px auto 0;
}

.blk-wrap a.theme-btn img {
  max-width: 20px;
}

.blk-wrap a.theme-btn:hover {
  background: var(--theme-color);
  color: var(--theme-on-primary);
}

section.campaigns-area {
  /* Was 70px 0 150px 0 — trimmed so the section heading + a row of
     campaign cards fits in one viewport, matching events/resources. */
  padding: 40px 0 90px 0;
}

section.campaigns-area .section-title {
  /* Was 50px — trimmed to reclaim viewport space above the cards. */
  margin-bottom: 30px;
}

/* Campaign card is materially taller than events/resources cards, so a
   viewport that catches the section heading + one row of event/blog cards
   won't fit the campaign row. Trim the card down to closer parity: kill
   the shared .blk 30px top/bottom margin (event/blog cards already do
   this in their own scopes), shrink the image to match .event-img's
   238px height, and tighten the interior spacing (button margin, paragraph
   gaps, progress-bar margin, section title margin). Scoped to
   .campaigns-area .blk / .blk-wrap so other .blk consumers are untouched. */
section.campaigns-area .blk {
  margin: 0;
}
section.campaigns-area .blk-top img {
  max-height: 220px;
}
section.campaigns-area .blk-wrap {
  padding: 8px 15px 12px;
}
section.campaigns-area .blk-wrap p {
  margin-bottom: 6px;
}
section.campaigns-area .the_progs {
  margin-bottom: 12px;
}
section.campaigns-area .blk-wrap a.theme-btn {
  margin-top: 14px;
}
section.campaigns-area .campaign-percent {
  margin-bottom: 6px;
}
.blk-wrap a.theme-btn svg path {
  stroke: var(--theme-color);
}
.blk-wrap a.theme-btn:hover svg path {
  stroke: #fff;
}
.owl-nav {
  position: absolute;
  top: 50%;
  left: 0;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}

.owl-nav > div {
  width: 48px;
  height: 48px;
  background: var(--theme-color);
  color: var(--theme-on-primary);
  font-size: 20px;
  line-height: 1;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 15px;
  transition: 0.2s;
}

.all-campains {
  padding: 0 65px;
}

.owl-nav > div:hover {
  background: #2b9fd5;
}

/* Plan carousel (3+ groups): same recipe as the campaigns carousel. Pad the
 * container so the .owl-nav (absolute, width:100%) places one arrow in each
 * gutter, outside the cards. Safe now that the carousel runs loop:false like
 * campaigns (loop cloning was what clipped the last card before). */
.plan-3x.owl-carousel {
  padding: 0 65px;
}
.plan-3x .owl-nav > div {
  border-radius: 5px;
  box-shadow: 0 4px 12px rgba(9, 151, 217, 0.25);
}

/* Campains-area END */

/* download */
.section-heading p {
  font-weight: 400;
}
.btn {
  -webkit-transition: all 0.3s ease;
  transition: all 0.3s ease;
  text-decoration: none;
  font-family: var(--font-stack);
  font-weight: 400;
  white-space: normal;
  line-height: 1.5;
  background-color: transparent;
  border: 1px solid #ced4da;
  padding: 1rem 1.5rem !important;
  border-radius: 10rem;
  min-width: 200px;
  text-align: left;
  display: -webkit-box !important;
  display: -ms-flexbox !important;
  display: flex !important;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
}

.btn-ios,
.btn-ios:hover {
  color: #ffffff !important;
  background-color: #2b354f;
  border-color: #2b354f;
  margin-right: 20px;
}
.btn-light {
  color: #2b354f !important;
  background-color: #f9fbfd;
  border-color: #f9fbfd;
}
.btn-light:hover {
  color: #2b354f;
  background-color: #dce8f3;
  border-color: #d3e2f0;
}
.text-contrast {
  /* Used on the App Store button label ('App Store' / 'Google Play')
     where the parent button has a --theme-color background. The text
     auto-flips white/dark via theme-contrast.js to stay readable across
     pale vs saturated primaries. */
  color: var(--theme-on-primary) !important;
}
.btn .icon {
  margin-right: 8px;
}
img.icon {
  max-width: 54px;
}
.icon {
  margin-left: 5px;
  margin-right: 15px;
  padding: 0;
  display: inline-block;
  text-align: center;
  -webkit-transition: all 0.3s ease-in-out;
  transition: all 0.3s ease-in-out;
}
.icon-md {
  width: 1.75rem;
  height: 1.75rem;
}
.btn p {
  margin-top: 0;
  margin-bottom: 0;
  margin-left: 8px;
  line-height: 1.45;
}
.btn .small {
  margin-top: -2px;
  display: block;
}

/* Events-area START */
section.event-area {
  padding-bottom: 150px;
}

.all-events {
  max-width: 90%;
  margin: auto;
}
.event-blk {
  position: relative;
  cursor: pointer;
}

.event-wrap-blk {
  background-color: var(--theme-color);
  padding: 25px;
  width: 100%;
}
.event-wrap-blk > div {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px;
  position: relative;
  z-index: 100;
}

.event-wrap-blk > div p {
  margin: 0;
  display: flex;
  gap: 5px;
  color: var(--theme-on-primary);
  font-size: 15px;
  width: 45%;
  height: 24px;
  overflow: hidden;
}

.event-wrap-blk > div p img {
  max-width: 20px;
  /* The clock / map-pin / globe SVGs ship with stroke="white" baked into
     the markup. On --theme-color bands that are pale (e.g. an org with
     a near-white primary), the white stroke disappears. Recolor via the
     same filter the apple-logo button uses: --icon-on-primary-filter
     resolves to brightness(0) for pale themes (icon becomes dark) and
     brightness(0) invert(1) for saturated themes (icon stays white). */
  filter: var(--icon-on-primary-filter, brightness(0) invert(1));
}

.event-img {
  height: 238px;
  overflow: hidden;
}

.event-wrap-blk h4 {
  font-size: 24px;
  margin-bottom: 20px;
  color: var(--theme-on-primary);
  height: 58px;
  overflow: hidden;
}

.event_categ {
  padding: 8px 20px;
  background: #fff;
  width: max-content;
  border-radius: 5px;
  margin-bottom: 15px;
  margin-top: -39px;
}

.event-page-cat {
  padding: 8px 20px;
  background: #fff;
  width: max-content;
  border-radius: 5px;
  margin-bottom: 15px;
  position: relative;
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
  z-index: 100;
  bottom: 60px;
  left: 20px;
}

.owl-dots {
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 45px 0 0px 0;
  gap: 5px;
  min-height: 16px;
}

.owl-dots > div {
  width: 12px;
  height: 12px;
  background: var(--theme-color);
  border-radius: 50%;
  transition: 0.2s;
}

.owl-dots > .owl-dot.active {
  background: var(--theme-color);
  width: 16px;
  height: 16px;
}
/* Events-area END */

/* Mission-area START */
section.mission-area {
  padding: 150px 0;
  background-color: #fafafa;
}

.bg-contrast {
  background-color: #fff;
}

.mission-wrap {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 50px;
}

.mission-contents {
  width: 60%;
}

.mission-img {
  width: 40%;
}

.mission-contents h2 {
  margin-bottom: 40px;
}

.mission-contents div#nav-tab button {
  border: 1px solid var(--theme-color);
  color: var(--theme-color-readable);
  font-weight: 500;
  padding: 10px 40px;
}

.mission-contents div#nav-tab button.active {
  color: var(--theme-on-primary);
  background: var(--theme-color);
}

.mission-contents div#nav-tab {
  margin-bottom: 20px;
}

.mission-contents a.theme-btn {
  margin-top: 35px;
}
/* Mission-area END */

/* Blog-area START */
section.blog-area {
  padding: 150px 0;
}

section.blog-area .blk {
  margin: 0;
  padding: 0;
}

section.blog-area .blk .blk-top .categ {
  color: #505050;
  background: #fff;
  font-weight: 500;
  margin-left: auto;
  margin-right: 20px;
  display: block;
  width: max-content;
  box-shadow: 0 4px 12px 0 #00000026;
  position: relative;
}

section.blog-area .blk .blk-wrap p {
  display: flex;
  align-items: center;
  gap: 5px;
}
/* Blog-area END */

/* Footer-area START */
footer {
  background-color: var(--theme-light);
  padding: 50px 0 0 0;
}

footer > p {
  margin: 0;
  padding: 15px 10px;
  text-align: center;
  background: #fff;
}

.footer-wrap {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  margin-bottom: 40px;
}

.footer-wrap img {
  max-width: 80px;
  margin-right: 15px;
}

/* Every Kannect-gradient surface routes through one rule:
   - .kannect-grad: the explicit class (event success screens, on white)
   - .footer-wrap h4 span: dev's old footer h4 inline gradient
   - .site-footer .footer-col h4 span: new footer column h4 gradient
   - .kannect-promo strong: footer 'Powered by Kannect' line
   The drop-shadow follows the actual rendered glyph pixels (including
   the gradient fill), unlike box-shadow which would just be a rect
   under the text. The shadow color comes from --kannect-grad-shadow so
   it can flip per surface: dark on white (default), white inside the
   footer (which itself flips white/dark via theme-contrast.js). */
.footer-wrap h4 span,
.site-footer .footer-col h4 span,
.kannect-promo strong,
.kannect-grad {
  background: var(--kannect-grad);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  font-weight: 600;
  /* Lock the Kannect wordmark to Poppins regardless of the org's
     --font-stack. Body text should follow the white-label theme; the
     Kannect brand mark itself should not. Without this the gradient
     word visually re-fonts itself on orgs that choose a different font
     family in their dashboard, and the wordmark stops looking like
     Kannect's. */
  font-family: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  filter:
    drop-shadow(0 0 1px var(--kannect-grad-shadow, rgba(0, 0, 0, 0.45)))
    drop-shadow(0 1px 2px var(--kannect-grad-shadow, rgba(0, 0, 0, 0.25)));
}

/* Inside the footer, wrap the gradient text in a white pill so it sits
   on a guaranteed-readable surface regardless of the org's --theme-color
   band. The pill is a pseudo-element behind the gradient text — keeps
   the base rule's background-clip: text gradient untouched, just adds a
   white pill beneath the inline word.

   Why pseudo-element rather than the simpler background-image-layered
   approach: background-clip on the same element can either clip to
   `text` OR `padding-box`, not both reliably across browsers when
   combined with -webkit-text-fill-color: transparent. The pseudo gets
   its own painting context and there's no conflict. */
.site-footer .footer-wrap h4 span,
.site-footer .footer-col h4 span,
.site-footer .kannect-promo strong {
  filter: none;
  position: relative;
  padding: 1px 8px;
  z-index: 0;
}
.site-footer .footer-wrap h4 span::before,
.site-footer .footer-col h4 span::before,
.site-footer .kannect-promo strong::before {
  content: "";
  position: absolute;
  inset: 0;
  background: #ffffff;
  border-radius: 999px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12);
  z-index: -1;
}

.footer-wrap h4 {
  font-size: 16px;
  font-weight: 600;
  color: #444444;
  margin-bottom: 15px;
}

/* ===== New dynamic footer (home-footer) ===== */
.site-footer {
  background-color: var(--theme-light);
  padding: 64px 0 0 0;
}

.site-footer .footer-grid {
  display: grid;
  grid-template-columns: 1.7fr 1fr 1fr 1.4fr;
  gap: 48px;
  padding-bottom: 56px;
}

.site-footer .footer-col h4 {
  font-size: 15px;
  font-weight: 700;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #333;
  margin-bottom: 18px;
}

/* Background / clip / shadow consolidated into the .kannect-grad group
   higher in the file; this rule only adds the column-heading-specific
   text-transform reset. */
.site-footer .footer-col h4 span {
  text-transform: none;
}

/* Brand column */
.footer-brand .footer-logo {
  display: inline-block;
  margin-bottom: 18px;
}

.footer-brand .footer-mission {
  color: #555;
  font-size: 15px;
  line-height: 1.6;
  margin-bottom: 22px;
  max-width: 34ch;
}

/* Explore (dynamic nav) column */
.footer-explore ul.menu-links {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.footer-explore ul.menu-links li a {
  color: #444;
  font-size: 15px;
  transition:
    color 0.2s ease,
    padding-left 0.2s ease;
}

.footer-explore ul.menu-links li a:hover {
  color: var(--theme-color-readable);
  padding-left: 4px;
  opacity: 1;
}

/* Contact column */
.site-footer .contact-infos > div {
  align-items: flex-start;
}

.site-footer .contact-infos span,
.site-footer .contact-infos a {
  color: #555;
  font-size: 15px;
  line-height: 1.5;
}

.site-footer .contact-infos a:hover {
  color: var(--theme-color-readable);
}

/* Social icons */
/* Plain social icons (original style) — no circular background/shadow. */
.site-footer ul.social-links {
  gap: 16px;
}

.site-footer ul.social-links img {
  width: 28px;
  height: 28px;
}

/* Discreet Kannect promo — one line docked at the bottom of the footer.
 * Collapsed (max-height:0) by default so the page ends normally at the
 * copyright bar. When the user is at the page bottom and scrolls/over-scrolls
 * a little further, the small script adds .is-revealed and it expands open,
 * reading as part of the footer. */
.kannect-promo {
  max-height: 0;
  overflow: hidden;
  background: #eef5f9;
  border-top: 1px solid transparent;
  transition:
    max-height 0.3s ease,
    border-color 0.3s ease;
}

.kannect-promo.is-revealed {
  max-height: 100px;
  border-top-color: #e3eef4;
}

.footer-bottom-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 11px 0;
  flex-wrap: wrap;
}

.footer-bottom-bar p {
  margin: 0;
  line-height: 1.4;
}

.kannect-promo-text {
  font-size: 13px;
  color: #8a949b;
}

.footer-copy-text {
  font-size: 11px;
  color: #aab2b8;
  text-align: right;
  white-space: nowrap;
}

/* Background / clip / shadow consolidated into the .kannect-grad group
   higher in the file; this rule only bumps weight from 600 to 700 to
   make the footer 'Kannect' a touch bolder than the other surfaces. */
.kannect-promo strong {
  font-weight: 700;
}

.kannect-promo a {
  color: var(--theme-color-readable);
  font-weight: 600;
  text-decoration: none;
}

.kannect-promo a:hover {
  text-decoration: underline;
}

/* Responsive */
@media (max-width: 991px) {
  .site-footer .footer-grid {
    grid-template-columns: 1fr 1fr;
    gap: 40px;
  }
}

@media (max-width: 575px) {
  .site-footer .footer-grid {
    grid-template-columns: 1fr;
    gap: 36px;
    text-align: left;
  }
  .footer-bottom-bar {
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
  }
  .footer-copy-text {
    text-align: left;
  }
  .kannect-promo.is-revealed {
    max-height: 140px;
  }
}
ul.social-links {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
}

ul.social-links a {
  display: block;
  transition: 0.3s;
}

ul.social-links a:hover {
  filter: brightness(0.5);
}

ul.menu-links {
  display: flex;
  flex-wrap: wrap;
  flex-direction: column;
  gap: 10px;
}

ul.menu-links li a {
  transition: 0.2s;
}

ul.menu-links li a:hover {
  opacity: 0.8;
}

.contact-infos {
  display: flex;
  flex-wrap: wrap;
  flex-direction: column;
  gap: 15px;
}

.contact-infos > div {
  display: flex;
  align-items: center;
  gap: 10px;
}
/* Footer-area END */

/* PAGE TITLE */
.page-title {
  height: 400px;
}
.page-title::after {
  position: absolute;
  content: "";
  width: 100%;
  height: 100%;
  background-color: #000;
  opacity: 0.5;
  top: 0;
  left: 0;
  z-index: -1;
}
.page-title h2 {
  font-size: 48px;
  line-height: 1;
}
.page-title .breadcrumb {
  margin-bottom: 0;
}
.page-title .breadcrumb-item {
  font-size: 24px;
}
.page-title .breadcrumb-item + .breadcrumb-item {
  padding-left: 20px;
}
.page-title .breadcrumb-item + .breadcrumb-item::before {
  content: ">";
  padding-right: 20px;
  color: #ffffff;
}
.page-title .breadcrumb-item.active {
  color: #fff;
}
/* PAGE TITLE end */

/* EVENT & Campaign DETAILS PAGE */
.event-details-area {
  padding-top: 20px;
  padding-bottom: 100px;
}

.fw-medium {
  font-weight: 500;
}
.fw-semibold {
  font-weight: 600;
}
.fw-bold {
  font-weight: 700;
}
.container-1100 {
  max-width: 1130px;
}
.text-theme {
  color: var(--theme-color-readable);
}
.text-purple {
  color: #9747ff;
}
hr {
  border: 0;
  background-color: #d7cbcb;
  height: 1px;
}
.event-bx {
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
  border-radius: 5px;
  padding: 2em 1.5em;
}
.inline-img-text img {
  filter: invert(45%) sepia(83%) saturate(740%) hue-rotate(161deg)
    brightness(90%) contrast(95%);
  max-width: 1.5em;
}
.text-list li {
  list-style: disc;
}
.text-list {
  margin-left: 15px;
}
/* Progressbar */
.progressbar {
  padding: 2em;
  border-radius: 5px;
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.progressbar .progress {
  overflow: inherit;
  background-color: #f5f5f5;
}
.progressbar .progress-bar {
  position: relative;
  overflow: inherit;
  border-radius: 50px;
  background-color: var(--theme-color);
}
.progressbar .progress-bar span {
  position: absolute;
  right: -15px;
  top: -30px;
  color: var(--theme-color-readable);
  font-size: 16px;
  font-weight: 700;
}
.blog-alert {
  font-size: 18px;
  font-style: italic;
  background-color: #f4fbff;
  padding: 1.5em;
  border-left: 0.39em solid var(--theme-color);
}

/* Subscribe Form */
.subscribe-form {
  padding: 1.9em;
  border-radius: 5px;
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}

/* Search Box */
.search-box,
.recent-post,
.membership-plan-box {
  padding: 2em;
  border-radius: 5px;
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.search-input img {
  position: absolute;
  top: 50%;
  left: 1em;
  transform: translateY(-50%);
  max-width: 1.5em;
}
.search-input input {
  border-radius: 5px;
  padding-left: 3em;
}
.rp-img img {
  max-width: 100px;
  height: 100px;
  object-fit: cover;
}
.flex-1 {
  flex: 1;
}

.recent-post-item {
  margin-bottom: 20px;
}
.recent-post-item:last-child {
  margin-bottom: 0;
}
/* EVENT DETAILS PAGE end */

/* MEMBERSHIP FORM PAGE */
.membership-area {
  margin: 100px 0px;
}
@media (max-width: 991px) {
  .membership-area {
    margin: 30px 0px 100px 0px;
  }
}
.membership-form-box {
  padding: 3em 5em;
  border-radius: 5px;
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.membership-form input {
  border-color: #d8d8d8;
  background-color: transparent;
}
.membership-form label {
  margin-bottom: 5px;
  font-weight: 500;
}
.membership-form input::placeholder {
  color: #bdbdbd;
}

/* Row alignment for the join form.
 * Fields render at different intrinsic heights — a text input is ~38px
 * but the Yes/No radio row (volunteer checkbox) is only ~24px, so a row
 * with those two side-by-side used to vertically center each column at
 * its own height. Force each column to fill the row's height so
 * whichever field is tallest defines the row and its neighbor's label
 * sits at the same baseline. */
.membership-form .row > [class*="col-"] {
  display: flex;
  flex-direction: column;
}
/* Push inputs/radios to the top of the column so labels always align,
 * regardless of the neighbor field's overall height. */
.membership-form .row > [class*="col-"] > *:not(label) {
  margin-top: auto;
  margin-bottom: 0;
}

/* Give native <select> dropdowns room to open at the bottom of the
 * scrollable modal body. Without this, the gender / marital-status
 * selects — often the last row on tab 1 — clipped their menu against
 * the modal-body's overflow container. Extra bottom padding pushes the
 * scroll area past the field so the menu has room. */
.plan-join-modal-body {
  padding-bottom: 48px;
}
.event-bx .nice-select {
  width: 100%;
  font-size: 16px;
  line-height: 1;
  display: flex;
  align-items: center;
  padding: 1em;
  border-radius: 5px;
}
.form-check {
  display: flex;
}
.form-check-input {
  margin-right: 10px;
}
.membership-form .nice-select {
  width: 100%;
  float: inherit;
  font-size: 16px;
  line-height: 1;
  display: flex;
  align-items: center;
  padding: 1.5em;
  border-radius: 10px;
}
.membership-form .nice-select:after {
  right: 1.5em;
  width: 8px;
  height: 8px;
  margin-top: -7px;
}
.membership-form .nice-select ul.list {
  width: 100%;
}

.checkbox-input label {
  font-weight: normal;
  display: flex;
  align-items: center;
  gap: 10px;
  cursor: pointer;
}
.checkbox-input label span {
  width: 1.25em;
  height: 1.25em;
  border: 1px solid #979797;
  border-radius: 3px;
}
.checkbox-input input {
  position: absolute;
  left: 0;
  top: 0;
  opacity: 0;
  visibility: hidden;
}
.checkbox-input input[type="checkbox"]:checked + label span {
  background-color: var(--theme-color);
  border-color: transparent;
}
.btn-transparent {
  border: 1px solid var(--theme-color);
  background-color: transparent;
  color: var(--theme-color-readable);
}
.btn-transparent:hover {
  border-color: transparent;
}
.form-timeline ul li {
  width: 100%;
  background-color: #f5f5f5;
  color: #979797;
  padding: 0.8em 2em 0.8em 3em;
  text-align: left;
  clip-path: polygon(0 0, 92% 0, 100% 50%, 92% 100%, 0 100%, 8% 50%);
}
.form-timeline ul li.active {
  background-color: var(--theme-color);
  color: var(--theme-on-primary);
}
.membership-form-box p {
  padding: 0 10%;
}

.plan-area {
  padding: 100px 0;
  background-color: #fafafa;
}

.plan-desc {
  height: 135px;
  display: -webkit-box;
  -webkit-line-clamp: 5;
  -webkit-box-orient: vertical;
  text-overflow: ellipsis;
  overflow: overlay;
}

.plan-heading h2 {
  font-size: 46px;
  line-height: 1;
  margin-bottom: 5px;
  color: #ff0090;
  font-weight: 500;
  position: relative;
  display: inline-block;
}
.plan-heading h2 span {
  font-size: 0.43em;
  position: absolute;
  top: -5px;
  left: -20px;
}
.plan-heading p {
  font-size: 14px;
}
/* MEMBERSHIP FORM PAGE end */

/* MEMBERSHIP PLAN PAGE */
.plan-tab-contents {
  padding: 2em 3em;
  border-radius: 14px;
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
  background-color: #fff;
}
.plan-3x .plan-tab-contents {
  padding: 2em 2em;
}

.plan-feature {
  background-color: #f5f5f5;
  border-radius: 10px;
  padding: 1.5em;
  height: 188px;
  overflow: overlay;
}

.plan-3x .plan-feature {
  padding: 1em;
}
.plan-tab-link {
  background-color: #f5f5f5;
  color: var(--theme-color);
  font-weight: 600;
  padding: 0.8em 3em;
  cursor: pointer;
  transition: 0.3s;
}
.plan-tab-link.active {
  background-color: var(--theme-color);
  color: var(--theme-on-primary);
}
/* Plan "Join Now" buttons span the full card width inside .plan-tab-contents
   so the CTA reads as a single committed action per plan, not a button
   floating in the middle of a card body. */
.plan-tab-contents .theme-btn {
  width: 100%;
}
.plan-btn-wrap {
  text-align: center;
}

.plan-box-1 h2 {
  font-size: 40px;
  font-weight: 600;
}
.plan-box-1 h2 span {
  font-size: 0.4em;
  color: #979797;
  font-weight: 500;
}
.plan-feature ul li {
  display: flex;
  gap: 15px;
  align-items: start;
}
.plan-feature ul li img {
  max-width: 1.5em;
  margin-top: 0.4em;
}

.org-about-rich-text blockquote {
  font-size: 15px;
  padding: 15px 20px;
  background: #f5f5f6;
  color: #324148;
  margin-top: 1rem;
  margin-bottom: 1rem !important;
  border-left: 6px solid #ccc;
}

.org-about-rich-text > ol > li[data-list="bullet"]::before {
  content: "\2022"; /* Bullet point symbol */
  color: black;
  display: inline-block;
  width: 1em;
  /* margin-left: -1em; */
}

/* Style for ordered lists */
.org-about-rich-text > ol > li[data-list="ordered"] {
  list-style-type: decimal;
  margin-left: 1em;
  display: list-item;
  counter-increment: step-counter;
}

/* Hide default number for bullet items in an ordered list */
.org-about-rich-text > ol > li[data-list="bullet"] {
  list-style-type: none;
  counter-increment: none;
}

.ql-align-right {
  text-align: right;
}

.ql-align-center {
  text-align: center;
}
.ql-align-justify {
  text-align: justify;
}

.bootstrap-btn {
  --bs-btn-padding-x: 0.75rem;
  --bs-btn-padding-y: 0.375rem;
  --bs-btn-font-family: ;
  --bs-btn-font-size: 1rem;
  --bs-btn-font-weight: 400;
  --bs-btn-line-height: 1.5;
  --bs-btn-color: #212529;
  --bs-btn-bg: transparent;
  --bs-btn-border-width: 1px;
  --bs-btn-border-color: transparent;
  --bs-btn-border-radius: 0.375rem;
  --bs-btn-hover-border-color: transparent;
  --bs-btn-box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
  --bs-btn-disabled-opacity: 0.65;
  --bs-btn-focus-box-shadow: 0 0 0 0.25rem
    rgba(var(--bs-btn-focus-shadow-rgb), 0.5);
  display: inline-block;
  padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);
  font-family: var(--bs-btn-font-family);
  font-size: var(--bs-btn-font-size);
  font-weight: var(--bs-btn-font-weight);
  line-height: var(--bs-btn-line-height);
  color: var(--bs-btn-color);
  text-align: center;
  text-decoration: none;
  vertical-align: middle;
  cursor: pointer;
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
  border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
  border-radius: var(--bs-btn-border-radius);
  background-color: var(--bs-btn-bg);
  transition:
    color 0.15s ease-in-out,
    background-color 0.15s ease-in-out,
    border-color 0.15s ease-in-out,
    box-shadow 0.15s ease-in-out;
}

@keyframes fadeEffect {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
.plan-tab-content {
  animation: fadeEffect 1s ease;
}
.plan-tab-content.active {
  display: block;
}

.border-radius-12px-12px-0px-0px {
  border-radius: 12px 12px 0 0 !important;
}

/* MEMBERSHIP PLAN PAGE end */

@media (max-width: 767px) {
  .hero-area h1 {
    font-size: 40px;
  }
}

.plan-3x > .owl-dots {
  margin: 0 !important;
}

/* Shared styles for the helper's rendered image/fallback. The container
	   (e.g. .blk-top, .event-img, .membership-image-wrap) controls the
	   dimensions; both the <img> and the fallback fill it completely. */
.card-image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.card-image-fallback {
  width: 100%;
  aspect-ratio: 4 / 3;
  min-height: 180px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-family: var(--font-stack);
  font-size: 1.3rem;
  font-weight: 700;
  text-align: center;
  padding: 16px;
  line-height: 1.3;
  word-break: break-word;
  box-sizing: border-box;
}

/* Nav dropdown "All <section>" link — the first item under Memberships
   and Directory dropdowns that points to the listing page itself.
   Mobile-only: shown bold + themed so it reads as the section's primary
   link. Desktop: hidden (along with the divider below it) because on
   desktop the dropdown opens on HOVER and a CLICK on the toggle navigates
   directly to the section, so the 'All <section>' menu item would be
   redundant — its destination is one of the two click outcomes already. */
.dropdown-item-all {
  font-weight: 600;
  color: var(--theme-color-readable);
}
.dropdown-item-all:hover,
.dropdown-item-all:focus {
  color: var(--theme-color-readable);
}

/* Desktop nav dropdown behavior — restores the pre-existing prod
   behavior where the toggle is a real link to the listing page and the
   dropdown opens on hover (not click). Mobile keeps the Bootstrap-native
   click-to-open behavior + the 'All <section>' link inside the open
   menu. The 992px breakpoint matches Bootstrap's navbar-expand-lg
   threshold where the navbar collapses into a hamburger. */
@media (min-width: 992px) {
  .navbar-nav .dropdown:hover > .dropdown-menu,
  .navbar-nav .dropdown:focus-within > .dropdown-menu {
    display: block;
    margin-top: 0;
  }
  .navbar-nav .dropdown-item-all,
  .navbar-nav .dropdown-divider {
    display: none;
  }
}

/* ── Admin rich-text lists ─────────────────────────────────────────────
   The global resets at the top of this file (ul { padding: 0 } and
   li { list-style: none }) intentionally strip bullets from nav menus,
   plan-feature checkmark lists, social links, footers, etc. But admin-
   authored rich text (campaign body, article body, plan detail body,
   org about, event description) often includes real <ul>/<ol> lists
   that the user typed in the dashboard's rich-text editor — those need
   bullets and indentation to read correctly.

   Re-enable list styles inside the known rich-text body containers,
   without touching the rest of the site. Targets the union of all
   wrappers that hold admin-authored rich text. */
.blog_details ul,
.blog_details ol,
.section-content ul,
.section-content ol,
.plan-detail-description ul,
.plan-detail-description ol,
.org-about-rich-text ul,
.org-about-rich-text ol,
.event-description ul,
.event-description ol {
  padding-left: 1.5em;
  margin: 0.5em 0 1em;
}
.blog_details ul,
.section-content ul,
.plan-detail-description ul,
.org-about-rich-text ul,
.event-description ul {
  list-style: disc;
}
.blog_details ol,
.section-content ol,
.plan-detail-description ol,
.org-about-rich-text ol,
.event-description ol {
  list-style: decimal;
}
/* Override the global `li { list-style: none }` for items inside admin
   rich-text — `inherit` picks up the disc/decimal set on the parent. */
.blog_details li,
.section-content li,
.plan-detail-description li,
.org-about-rich-text li,
.event-description li {
  list-style: inherit;
  margin: 0.25em 0;
}
/* Nested lists keep their natural depth and switch marker style. */
.blog_details ul ul,
.section-content ul ul,
.plan-detail-description ul ul,
.org-about-rich-text ul ul,
.event-description ul ul {
  list-style: circle;
}
.blog_details ul ul ul,
.section-content ul ul ul,
.plan-detail-description ul ul ul,
.org-about-rich-text ul ul ul,
.event-description ul ul ul {
  list-style: square;
}

/* ── Quill editor bullet/number fix ────────────────────────────────────
   The dashboard's rich-text editor is Quill.js, which wraps BOTH bullet
   lists AND numbered lists in <ol>, distinguishing them only via a
   `data-list="bullet"` or `data-list="ordered"` attribute on each <li>.
   Quill has its own CSS that renders the correct marker per data-list
   — that CSS isn't loaded here (nor should it be — Quill's stylesheet
   is heavy and only for the editor UI). Without it, every list from
   the editor shows numeric markers regardless of whether the user
   clicked the bullet or number button, plus Quill's inline
   <span class="ql-ui"> gets rendered as a visible empty box.

   Fix: strip the default <ol> counter, hide the ql-ui span, then
   render the correct marker off the data-list attribute using CSS
   `::before` on each <li>. Applied inside the same rich-text wrappers
   as the base list styles above so it doesn't leak to nav menus or
   the plan feature-list checkmarks. */
.blog_details ol > li[data-list],
.section-content ol > li[data-list],
.plan-detail-description ol > li[data-list],
.org-about-rich-text ol > li[data-list],
.event-description ol > li[data-list] {
  list-style-type: none;
  position: relative;
  counter-increment: none;
}
/* Bullet variant — <li data-list="bullet"> */
.blog_details ol > li[data-list="bullet"]::before,
.section-content ol > li[data-list="bullet"]::before,
.plan-detail-description ol > li[data-list="bullet"]::before,
.org-about-rich-text ol > li[data-list="bullet"]::before,
.event-description ol > li[data-list="bullet"]::before {
  content: "\2022";      /* • */
  position: absolute;
  left: -1.1em;
  font-weight: bold;
}
/* Numbered variant — <li data-list="ordered">. Uses a CSS counter so
   consecutive ordered <li>s number correctly (1, 2, 3…). Counter is
   reset per <ol> that CONTAINS an ordered item so a mix of bullet and
   ordered items in different <ol>s starts each ordered group at 1. */
.blog_details ol:has(> li[data-list="ordered"]),
.section-content ol:has(> li[data-list="ordered"]),
.plan-detail-description ol:has(> li[data-list="ordered"]),
.org-about-rich-text ol:has(> li[data-list="ordered"]),
.event-description ol:has(> li[data-list="ordered"]) {
  counter-reset: quill-ordered;
}
.blog_details ol > li[data-list="ordered"]::before,
.section-content ol > li[data-list="ordered"]::before,
.plan-detail-description ol > li[data-list="ordered"]::before,
.org-about-rich-text ol > li[data-list="ordered"]::before,
.event-description ol > li[data-list="ordered"]::before {
  counter-increment: quill-ordered;
  content: counter(quill-ordered) ".";
  position: absolute;
  left: -1.5em;
}
/* Hide Quill's editor-only DOM artifact — a contenteditable span that
   the editor uses internally but which renders as an empty inline box
   on the public site. */
.blog_details .ql-ui,
.section-content .ql-ui,
.plan-detail-description .ql-ui,
.org-about-rich-text .ql-ui,
.event-description .ql-ui {
  display: none;
}
