/* ============================================================================
   CLAUDE UPDATES — module polish (authored by Claude / Pepper Marketing)
   ----------------------------------------------------------------------------
   Consolidates fixes that were previously inlined in module templates.
   Loaded from _base.twig via the theme's css include chunk.
   Companion JS: /assets/js/claude-updates.js
   Change log: CELONA-THEME-CHANGELOG.md in the pepper repo.
   Sections:
     [1] Icon sizing (iconImageSize field on card/feature)
     [2] Carousel arrows (bare chevron, contrast on dark, size control)
     [3] Carousel blockquote spacing (overlap fix)
     [4] Carousel slides-per-view (slideWidth field, responsive step-down)
   ============================================================================ */

/* [1] Icon sizing — classes emitted by cards.twig / featuresList.twig from the
   iconImageSize dropdown (small default / medium / large). */
.icon-wrap img.icon-sz-sm { max-width: 40px; max-height: 40px; }
.icon-wrap img.icon-sz-md { max-width: 56px; max-height: 56px; }
.icon-wrap img.icon-sz-lg { max-width: 80px; max-height: 80px; }
/* Icon + Text (iconText) media-library icons: the template's img-fluid has no size cap */
.wrap-icon img { width: 40px; height: 40px; object-fit: contain; }
.wrap-icon { padding: 0 !important; }

/* [2] Carousel arrows — bare teal chevron, no circle/shadow.
   Fancyapps consumes the --f-arrow-* variables. */
.section-carousel .f-carousel {
  --f-arrow-bg: transparent;
  --f-arrow-hover-bg: transparent;
  --f-arrow-active-bg: transparent;
  --f-arrow-shadow: none;
  --f-arrow-border-radius: 0;
  --f-arrow-color: #00304A; /* teal → navy 2026-07-22 (client) */
  --f-arrow-svg-stroke-width: 3;
  --f-arrow-svg-width: 24px;
  --f-arrow-svg-height: 24px;
}
.section-carousel .f-carousel__nav .f-button {
  background: transparent !important;
  box-shadow: none !important;
  border-radius: 0 !important;
}
.section-carousel .f-carousel__nav .f-button svg {
  color: #00304A !important;
  stroke: #00304A !important;
}
/* White arrows on dark-background carousels for contrast */
.section-carousel.bg-deep-blue .f-carousel,
.section-carousel.bg-dark-blue .f-carousel,
.section-carousel.bg-blue .f-carousel,
.section-carousel.bg-teal .f-carousel,
.section-carousel.bg-charcoal .f-carousel,
.section-carousel.bg-rich-charcoal .f-carousel,
.section-carousel.bg-deep-cobalt .f-carousel {
  --f-arrow-color: #ffffff !important;
}
.section-carousel.bg-deep-blue .f-carousel__nav .f-button svg,
.section-carousel.bg-dark-blue .f-carousel__nav .f-button svg,
.section-carousel.bg-blue .f-carousel__nav .f-button svg,
.section-carousel.bg-teal .f-carousel__nav .f-button svg,
.section-carousel.bg-charcoal .f-carousel__nav .f-button svg,
.section-carousel.bg-rich-charcoal .f-carousel__nav .f-button svg,
.section-carousel.bg-deep-cobalt .f-carousel__nav .f-button svg {
  color: #ffffff !important;
  stroke: #ffffff !important;
  fill: #ffffff !important;
}
/* Size control: "Arrow size" dropdown (arrowSize field) → .arrows-lg on the section */
.section-carousel.arrows-lg .f-carousel {
  --f-arrow-svg-width: 38px;
  --f-arrow-svg-height: 38px;
  --f-arrow-width: 54px;
  --f-arrow-height: 54px;
}

/* [3] Carousel slide rhythm & blockquotes.
   - Consistent vertical gap between a slide's stacked columns/rows.
   - Blockquote as an indented pull-quote: opening mark sits BESIDE the quote,
     closing mark removed, author paragraph tucks in close underneath.
   NOTE for dev: root cause is the global blockquote SCSS (line-height:1em +
   80px block glyphs) — worth fixing site-wide. */
.section-carousel .card .wrapper { row-gap: 0.75rem; }
/* Slides size to their own content — a tall sibling (e.g. a video tile) must
   not stretch light tiles into mostly-empty boxes (client, CW proof). */
.section-carousel .f-carousel__slide .card.h-100 { height: auto !important; }
/* Titled media tiles (use-case proof anatomy) get a height FLOOR so one-line
   tiles hold their own beside richer siblings — tall tiles still grow.
   Caption-only gallery tiles and quote/testimonial slides are unaffected. */
@media (min-width: 768px) {
  .section-carousel .f-carousel__slide .card:has(h3):has(figure.image),
  .section-carousel .f-carousel__slide .card:has(h3):has(video) {
    min-height: 620px;
  }
}
.section-carousel .f-carousel__slide { display: flex; align-items: flex-start; }
.section-carousel .f-carousel__slide > * { width: 100%; }
.section-carousel .card h3 { margin-bottom: 0.5rem; }
/* Slide sub-headline (h4): theme sizes it like the h3 title — step it down so
   the hierarchy reads (title → takeaway → quote), with air between the three. */
.section-carousel .card h4 { font-size: 1.2rem; line-height: 1.45; margin: 1.1rem 0 0; } /* 1.25->1.2 [59]: same size as body, weight carries the takeaway level */
.section-carousel .card h4 + blockquote { margin-top: 1.25rem; }
.section-carousel blockquote { position: relative; padding-left: 2.4rem; line-height: 1.5; margin: 0.5rem 0 0; }
.section-carousel blockquote p { line-height: 1.55; margin-bottom: 0; }
.section-carousel blockquote::before { content: "“"; position: absolute; left: 0; top: -0.08em; font-size: 52px; line-height: 1; margin: 0; }
.section-carousel blockquote::after { content: none; }
.section-carousel blockquote p:last-of-type::after { content: "”"; font-size: 2.6em; line-height: 0; vertical-align: -0.42em; margin-left: 0.35em; }
.section-carousel blockquote + p { margin-top: 0.75rem; margin-bottom: 0; padding-left: 2.4rem; }

/* [4] Slides-per-view — classes emitted by carousel.twig from the slideWidth
   field, with a responsive step-down (1-up on phones, 2-up on tablets). */
.f-carousel__slide.slide-w-third,
.f-carousel__slide.slide-w-half {
  flex: 0 0 100%;
  max-width: 100%;
}
@media (min-width: 768px) {
  .f-carousel__slide.slide-w-third,
  .f-carousel__slide.slide-w-half {
    flex: 0 0 50%;
    max-width: 50%;
  }
}
@media (min-width: 992px) {
  .f-carousel__slide.slide-w-third {
    flex: 0 0 33.3333%;
    max-width: 33.3333%;
  }
}

/* [5] HubSpot forms — legacy v2 embeds ship unstyled and expect the host site
   to style the .hs-* hooks (celona.io does this in its own CSS). On-brand skin
   for any HubSpot form embedded via a Code Block, light or dark band. */
.hs-form { text-align: left; max-width: 680px; margin-left: auto; margin-right: auto; }
.hs-form fieldset { max-width: 100% !important; }
.hs-form .hs-form-field { margin-bottom: 1.1rem; }
.hs-form label { display: block; font-weight: 500; font-size: 0.85rem; margin-bottom: 0.35rem; text-align: left; }
.hs-form .hs-input {
  width: 100% !important;
  padding: 0.65rem 0.9rem;
  font-size: 1rem;
  font-family: inherit;
  border: 1px solid rgba(0, 48, 74, 0.25);
  border-radius: 8px;
  background: #ffffff;
  color: #00304A;
}
.hs-form fieldset.form-columns-2 .hs-input { width: 95% !important; }
.hs-form textarea.hs-input { min-height: 110px; }
.hs-form .hs-input:focus { outline: 2px solid #5aa7a0; outline-offset: 1px; border-color: #5aa7a0; }
.hs-form .inputs-list { list-style: none; margin: 0; padding: 0; }
.hs-form .inputs-list li { margin: 0.3rem 0; }
.hs-form input[type="checkbox"].hs-input, .hs-form input[type="radio"].hs-input { width: auto !important; }
.hs-form .hs-form-booleancheckbox-display, .hs-form .hs-form-checkbox-display, .hs-form .hs-form-radio-display { display: flex; gap: 0.55rem; align-items: flex-start; font-weight: 400; }
.hs-form .hs-form-booleancheckbox-display input, .hs-form .hs-form-checkbox-display input, .hs-form .hs-form-radio-display input { width: auto !important; margin-top: 0.3em; flex: 0 0 auto; }
.hs-form .hs-error-msgs { list-style: none; padding: 0; margin: 0.3rem 0 0; font-size: 0.8rem; color: #e58f6f; }
.hs-form .hs-richtext { font-size: 0.8rem; opacity: 0.85; margin: 0.6rem 0; text-align: left; }
.hs-form .hs-richtext a { color: #5aa7a0; }
/* reCAPTCHA: scaled down + tucked right so it doesn't dominate the submit */
.hs-form .hs-recaptcha { float: right; margin: 0 0 0.5rem 1rem; transform: scale(0.72); transform-origin: top right; }
.hs-form .hs-submit { margin-top: 0.9rem; }
/* Submit: hollow teal outline pill, sized like the theme's .btn (0.525em/1.25em, 1rem/600) */
.hs-form .hs-button {
  background: transparent;
  color: #5aa7a0;
  border: 1px solid #5aa7a0;
  border-radius: 999px;
  padding: 0.525em 1.25em;
  font-weight: 600;
  font-size: 1rem;
  line-height: 1.5;
  font-family: inherit;
  cursor: pointer;
  transition: background 0.18s, color 0.18s;
}
.hs-form .hs-button:hover { background: #5aa7a0; color: #ffffff; }
/* Dark bands: light labels/consent, inputs stay white for usability */
.bg-deep-blue .hs-form label, .bg-dark-blue .hs-form label, .bg-blue .hs-form label, .bg-deep-cobalt .hs-form label,
.bg-deep-blue .hs-form legend, .bg-dark-blue .hs-form legend, .bg-blue .hs-form legend, .bg-deep-cobalt .hs-form legend { color: #eaf0ee; }
.bg-deep-blue .hs-form .hs-richtext, .bg-dark-blue .hs-form .hs-richtext, .bg-blue .hs-form .hs-richtext, .bg-deep-cobalt .hs-form .hs-richtext { color: #c9d6da; }
.bg-deep-blue .hs-form .hs-input, .bg-dark-blue .hs-form .hs-input, .bg-blue .hs-form .hs-input, .bg-deep-cobalt .hs-form .hs-input { border-color: rgba(255, 255, 255, 0.25); }

/* [6] Certified-device maker names — text chips replacing the logo carousel
   (Manufacturing + Oil & Gas "Certified Devices" maker row). */
.maker-chips { display: flex; flex-wrap: wrap; gap: 16px; justify-content: center; }
.maker-chips span {
  flex: 1 1 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: #ffffff;
  border: 1px solid #5aa7a0;
  border-radius: 16px;
  padding: 1rem /* [59] 1.05->1 */ 2rem;
  min-width: 150px;
  font-weight: 600;
  font-size: 1rem /* [59] 1.05->1 */;
  color: #414041;
  letter-spacing: 0.01em;
}

/* [7] Carousel slide images — uniform crop (3:2, cover) so any uploaded image
   renders at consistent size and captions align across slides (In the Field). */
.section-carousel .f-carousel__slide figure.image { display: block; width: 100%; margin: 0 0 0.75rem; position: relative; border-radius: 12px; overflow: hidden; }
/* uniform navy grade over every slide image (some assets had it baked in, raw uploads didn't) */
.section-carousel .f-carousel__slide figure.image::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(0, 48, 74, 0.28);
  mix-blend-mode: multiply;
  pointer-events: none;
}
.section-carousel .f-carousel__slide figure.image img,
.section-carousel .f-carousel__slide p > img {
  /* FOOLPROOF: !important beats the inline aspect-ratio/width/height CKEditor
     writes onto inserted images (that's what let raw portrait uploads render
     full-height). Default = 16:9 (client call: shorter default); the "Slide
     image height" dropdown customises from there. */
  width: 100% !important;
  height: auto !important;
  aspect-ratio: 16 / 9 !important;
  object-fit: cover;
  border-radius: 12px; /* matches the figure clip; Safari doesn't reliably clip replaced content via overflow alone */
}

/* Slide image height variants ("Slide image height" dropdown on the carousel) */
.section-carousel.img-scale-short .f-carousel__slide figure.image img { aspect-ratio: 16 / 9 !important; } /* legacy = default */
.section-carousel.img-scale-ratio32 .f-carousel__slide figure.image img { aspect-ratio: 3 / 2 !important; }
.section-carousel.img-scale-tall .f-carousel__slide figure.image img { aspect-ratio: 4 / 3 !important; }
.section-carousel.img-scale-square .f-carousel__slide figure.image img { aspect-ratio: 1 / 1 !important; }

/* [8] Banner height control ("Banner height" dropdown on pages) — theme default
   is a fixed padding:130px 0 on .title-section with no editor control. */
.title-section.banner-lean { padding: 64px 0 44px !important; }
.title-section.banner-tall { padding: 220px 0 !important; }

/* [9] Cards module: "Lean card images" lightswitch (leanCardImages field) —
   photo cards normally render a 4:3 image block (.pcardphoto .ph aspect-ratio),
   which makes image cards deep. Lean = short 21:9 banner crop instead.
   Tablet-up only: on phones the card goes horizontal (image is a narrow side
   column) where 21:9 would be a sliver — theme 4:3 stays. */
@media (min-width: 768px) {
  .section-cards.cards-img-lean .pcardphoto .ph,
  .section-cards.cards-img-lean .pcardphoto .ph-wrapper {
    aspect-ratio: 21 / 9;
  }
}

/* [11] Card photos — SAME navy grade as carousel slide images ([7]) so photos
   read consistently across modules/pages. Replaces the theme's baked-in
   sepia/hard-light duotone on .pcardphoto (which looked different from the
   carousel treatment). */
.pcardphoto .ph::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(0, 48, 74, 0.28);
  mix-blend-mode: multiply;
  pointer-events: none;
  z-index: 2; /* above .ph-wrapper's z-index:1 */
}
.pcardphoto .ph img {
  mix-blend-mode: normal;
  filter: none;
}
.pcardphoto .ph-wrapper {
  mix-blend-mode: normal;
  background: transparent;
}

/* [15] Callout bubble — supporting stats/context in rich text (client: the
   McKinsey port-automation stat "should look like a callout, bubble").
   Editors: apply by giving a paragraph the class "callout". */
p.callout {
  background: #ffffff;
  border-radius: 14px;
  padding: 20px 26px;
  margin-top: 1.5rem;
  box-shadow: 0 10px 28px -22px rgba(0, 48, 74, 0.35);
  color: #00304A; /* bubble bg is always white — keep ink text even on dark bands */
}

/* [21] Stat box that pops (client, CW requirement cards): teal chip holding
   the supporting stat — editors apply class "stat-pop" to a paragraph. */
/* Requirement rows (CW use-case requirements): white icon lives INSIDE the
   teal stat chip (one unit — a floating icon read as belonging to the wrong
   row); generous separation between wrapped column pairs. */
p.stat-pop.stat-pop-icon { display: inline-flex; align-items: center; gap: 14px; }
p.stat-pop.stat-pop-icon img { width: 44px; height: 44px; object-fit: contain; flex: 0 0 auto; }
p.req-icon { margin: 0; }
p.req-icon img { width: 52px; height: 52px; object-fit: contain; }
/* Requirement row-cards: each row is its own mc with a White block — style
   the block like the site's cards (border + radius + slim padding) so the
   icon, copy, and stat chip visibly belong to one unit. */
#use-case-requirements .row:has(> [class~="col-lg-1"]),
[id^="req-row-"] .row:has(> [class~="col-lg-1"]) {
  background: #ffffff;
  border: 1px solid #c3cbd5;
  border-radius: 16px;
  padding: 22px 26px;
  margin: 0 clamp(25px, 4vw, 50px) 18px; /* the theme's own .block-x content padding — aligns the cards to the text well at EVERY viewport, not just 1440 */
  align-items: center;
}

p.stat-pop {
  background: #5aa7a0;
  color: #ffffff;
  border-radius: 12px;
  padding: 14px 18px;
  font-weight: 600;
  display: inline-block;
  margin-top: 0.75rem;
  margin-bottom: 0;
  line-height: 1.4;
}

/* [19] Hollow (outline) buttons — fill with the button colour on hover
   (client: "See Certified Devices" on every page, plus all other hollow
   dark-blue buttons: TCO calculator, replace-me CTAs, etc.). */
.btn-outline-dark-blue:hover,
.btn-outline-dark-blue:focus-visible {
  background-color: #00304A !important;
  border-color: #00304A !important;
  color: #ffffff !important;
}
/* (btn-filled / btn-filled-teal classes RETIRED 2026-07-17 — all rich-text
   buttons are now native Buttons CK entries using the theme's own
   btn-dark-blue / btn-teal / btn-outline-* classes.) */

/* [18] Text → boxes rhythm + alignment (client: on every industry page, cut
   the gap between intro text and the boxed row below to ~1/3, and align the
   boxes to the text well).
   - Gap: the intro multiColumn's own bottom padding (pb-md-7 = 104px /
     pb-md-6 = 80px) is what separates it from a title-less cards/accordion
     section that follows — pull the follower up so ~30-35% remains.
   - Width: card rows start 50px left of the text well (the mc wraps copy in
     a padded block-x the cards row doesn't have) — inset the row to match.
   Sections with their own .section-title are new topics, not continuations —
   left untouched via :has(). md+ only; phones keep stacked spacing. */
@media (min-width: 768px) {
  section[class*="section-multiColumn"].pb-md-7 + section.section-cards:not(:has(.section-title)),
  section[class*="section-multiColumn"].pb-md-7 + section.section-featuresList:not(:has(.section-title)) {
    margin-top: -68px;
  }
  /* pb-md-6 pairs: only when the follower carries its own pt-md-6 (both sides
     contribute) — followers already at pt-md-0 (O&G TCO) would overlap. */
  section[class*="section-multiColumn"].pb-md-6 + section.section-cards.pt-md-6:not(:has(.section-title)),
  section[class*="section-multiColumn"].pb-md-6 + section.section-featuresList.pt-md-6:not(:has(.section-title)) {
    margin-top: -52px;
  }
  section[class*="section-multiColumn"].pb-md-5 + section.section-cards:not(:has(.section-title)),
  section[class*="section-multiColumn"].pb-md-5 + section.section-featuresList:not(:has(.section-title)) {
    margin-top: -16px;
  }
  section.section-cards .row:has(> [class*="col-"] > .card) {
    /* text well = theme .block-x padding (clamp) minus the 9px the card row
       already gains from its own gutters — responsive, not 1440-hardcoded */
    margin-left: calc(clamp(25px, 4vw, 50px) - 9px);
    margin-right: calc(clamp(25px, 4vw, 50px) - 9px);
  }
  /* EXCEPTION to the inset below: cards sections whose outer column is
     col-xl-10 already sit AT the text well — the inset would double-dip
     (client: quote boxes same width as content above). Restore gutters. */
  section.section-cards [class~="col-xl-10"] .row:has(> [class*="col-"] > .card) {
    margin-left: -18px;
    margin-right: -18px;
  }
  /* [121] 2026-08-07 ...and the intro TEXT above those cards has to come with them.
     [18]'s exception pulls the card row out to the text well on col-xl-10 sections, but the
     CK container above it keeps the theme's 50px .block-x padding - so the intro paragraph
     sat 59px right of its own cards (measured on /agv-amr "Why it matters": text 184, cards 125).
     Zero the block-x inset in exactly the case where the cards were already un-inset. */
  section.section-cards [class~="col-xl-10"] .block-x {
    padding-left: 0; padding-right: 0;
    /* ...and the last 9px: the card row carries margin-left:-18px from [18]'s exception
       while this wrapper keeps the row's 9px gutter. Measured 134 vs 125. */
    margin-left: -9px; margin-right: -9px;
  }

  /* Maker-chip rows open 50px wider than the card row above them — align both
     to the text well (client: chips same width as the boxes). */
  .maker-chips {
    margin-left: clamp(25px, 4vw, 50px);
    margin-right: clamp(25px, 4vw, 50px);
  }
}

/* Devices-section CTA button (sectionID devices-cta on the 6 button mcs):
   the gap above (chips band bottom) outweighed the gap below — pull up so
   the button sits visually centred between chips and band end. */
#devices-cta { margin-top: -16px; }

/* featuresList v3 (with claude-updates.js): the JS fixes the panel column at
   the tallest tab's height (no bounce navigating tabs); these rules stretch
   the visible bordered panel to FILL that height so shorter tabs show a
   taller box instead of dead band-space below the border. */
@media (min-width: 768px) {
  .section-featuresList .col-md-6.px-md-0 .nav { display: flex; flex-direction: column; height: 100%; }
  .section-featuresList .col-md-6.px-md-0 .accordion-item:has(.accordion-collapse.show) { flex: 1; display: flex; flex-direction: column; }
  .section-featuresList .col-md-6.px-md-0 .accordion-collapse.show { flex: 1; display: flex !important; flex-direction: column; }
  .section-featuresList .col-md-6.px-md-0 .accordion-collapse.show .accordion-body { flex: 1; }
}

/* Banner side-images (page image field + bannerImageHalf): a tall/square
   graphic at half-container width blows the banner out vertically — cap it
   (client: Frequency hub made the banner "larger than normal"). */
.title-section .col-lg-5 img.img-fluid { max-height: 400px; width: auto; max-width: 100%; display: block; margin-inline: auto; }

/* [17] Use-case tabs rhythm — .tab-content.mt-6 put 80px between the tab strip
   and the panel (client: reduce). The strip-to-intro gap is handled by DATA,
   not CSS: every intro mc / tabsSection pair is sectionSpacing none/none
   (2026-07-16 normalisation) — a fixed negative margin here overlapped pages
   whose intro carried no padding, so don't reintroduce one. */
.section-tabsSection .tab-content { margin-top: 28px !important; }
/* Default breathing room above the strip: with none/none data the natural gap
   is ~1px. PADDING not margin — a margin is transparent and lets the white
   page background show as a strip between two same-coloured bands; padding
   stays band-coloured. -9px margin = the theme's .new-section seam overlap. */
section.section-tabsSection { margin-top: -9px !important; padding-top: 41px !important; }
/* Panel headings (bare CK h2s) rendered at 56px — the chips above already
   carry the use-case name, so the repeat only needs to anchor the panel. */
.section-tabsSection .tab-content h2 { font-size: 1.75rem !important; line-height: 1.25 !important; margin-bottom: 0.75rem; }
/* Six of the seven intros wrap their copy in a (band-coloured, invisible)
   block whose own 50px+50px bottom paddings re-inflate the gap to ~140px —
   zero just the bottom edge when a tabs section follows. */
section[class*="section-multiColumn"]:has(+ section.section-tabsSection) .block-x { padding-bottom: 0 !important; margin-bottom: 0 !important; }
section[class*="section-multiColumn"]:has(+ section.section-tabsSection) > .container-xxl.block,
section[class*="section-multiColumn"]:has(+ section.section-tabsSection) > .container.block { padding-bottom: 0 !important; }

/* [16] Cards module: "5 per row" grid option (cardGridSize = 5) — used for
   the Smart Ports certified-device row (5 form factors on one line). */
.col-cards-5 { position: relative; width: 100%; padding-right: calc(var(--bs-gutter-x) * .5); padding-left: calc(var(--bs-gutter-x) * .5); }
@media (min-width: 768px) { .col-cards-5 { flex: 0 0 33.3333%; max-width: 33.3333%; } }
@media (min-width: 1200px) { .col-cards-5 { flex: 0 0 20%; max-width: 20%; } }

/* [14] Section-header rhythm — compress the eyebrow zone (client: the
   "/ EYEBROW" header block ate ~290px before the heading; bottoms sat at ~64px).
   Was: 80px container pad + 60px title-row margin + ~50px inflated line-box
   (the small eyebrow text sits in a display-4-sized row). Now ≈ half. */
section[class*="section-"] > .container-xxl.pt-6,
section[class*="section-"] > .container.pt-6 {
  padding-top: 40px !important;
}
.section-title {
  margin-bottom: 44px;
}
.section-title .display-4 {
  line-height: 1.15;
}

/* [13] Pull-quote treatment for blockquotes in multiColumn rich text (same
   look as the carousel fix in [3]; the theme's global blockquote SCSS —
   line-height:1em + 80px marks — remains the root cause site-wide).
   Used for the customer problem-statement quotes on Healthcare/Higher Ed. */
.section-multiColumn blockquote { position: relative; padding-left: 2.4rem; line-height: 1.5; margin: 2rem 0 0; }
.section-multiColumn blockquote p { line-height: 1.55; margin-bottom: 0; font-size: 1.15rem; }
.section-multiColumn blockquote::before { content: "“"; position: absolute; left: 0; top: -0.08em; font-size: 52px; line-height: 1; margin: 0; }
.section-multiColumn blockquote::after { content: none; }
.section-multiColumn blockquote p:last-of-type::after { content: "”"; font-size: 2.6em; line-height: 0; vertical-align: -0.42em; margin-left: 0.35em; }
.section-multiColumn blockquote + p { margin-top: 0.75rem; margin-bottom: 0; padding-left: 2.4rem; }

/* [12] Rich-text image sections — "Rounded corners" lightswitch (roundedImage
   field on the Image Single / Image Gallery CK sections). Same 12px radius as
   the carousel slide-image treatment ([7]). */
.img-rounded img,
.img-rounded .gallery-image {
  border-radius: 12px;
  overflow: hidden;
}

/* [10] Card highlight — teal 3px outline via the "Highlight card" lightswitch
   (field 163, highlightCard) on any card; cards.twig emits .card-highlight.
   Front-end-editable per card in the CP — replaces the earlier hardcoded
   Section-ID hooks (the-shift / dc-physical-ai / highlight-last-card, retired
   2026-07-17; those ids may remain on blocks as anchors but carry no style).
   In use: The Shift Orion answer 19731 · DC Meet Celona Orion 22659 ·
   HE solution 21729 · HC solution 21911.
   Theme card border is 1.5px light-charcoal → 3px teal. */
.card.card-highlight {
  border-width: 3px;
  border-style: solid;
  /* !important needed: the block-level .border-light-charcoal class sets
     border-color with !important and was overriding the teal */
  border-color: #00304A !important;
}
.card.card-highlight .card-top {
  border-color: #00304A !important; /* .card-top::after divider inherits this */
}

/* Image slides (e.g. In the Field): slim the card frame so photos render LARGE.
   Scoped via :has(figure.image) — text slides (Proof) keep the roomy padding. */
.section-carousel .f-carousel__slide .wrapper:has(figure.image):not(:has(h3)) { padding: 14px; }
.section-carousel .f-carousel__slide .wrapper:has(figure.image):not(:has(h3)) .row { margin-left: 0; margin-right: 0; }
.section-carousel .f-carousel__slide .wrapper:has(figure.image):not(:has(h3)) > [class*="col"],
.section-carousel .f-carousel__slide .wrapper:has(figure.image):not(:has(h3)) .row > [class*="col"] { padding-left: 0; padding-right: 0; }
/* Use-case proof tiles (image + h3 title + body) keep the roomy card padding —
   the slim treatment above is only for caption-only gallery slides. */

/* [22] featuresList ("The Platform" et al): the SELECTED tab keeps the accent
   colour — the theme only defines .hover-teal:hover, so the active tab dropped
   back to ink the moment the pointer left it (client, 2026-07-17; global).
   Desktop trigger rows = .row.feature-tab-container (Bootstrap toggles
   .collapsed; the active row is the one without it). Mobile accordion headers
   track aria-expanded (the template pre-sets it on the first tab). Keyed to
   .hover-teal so a module with a different accent colour is untouched. */
.feature-tabs .row.feature-tab-container:not(.collapsed) .hover-teal,
.feature-tabs .accordion-header.feature-tab[aria-expanded="true"] .hover-teal {
  color: #5aa7a0;
}

/* [20] 2026-07-20 partner-tabs (/partners): centre tab-selector labels */
#partner-tabs .tab-card{display:flex;align-items:center;justify-content:center;text-align:center;}

/* [21] 2026-07-20 partner-tabs logo strip: replace the 4-col justify-between grid with a
   centred flex row so all logos sit on one balanced line with uniform gaps (gridSize no longer
   matters); size is driven by the logoScale inline max-height, capped at 80px as a fallback. */
#partner-tabs .logo-listing-tiled{display:flex;flex-wrap:wrap;justify-content:center!important;align-items:center;gap:1.75rem 3.25rem;}
#partner-tabs .logo-listing-tiled > .col{flex:0 0 auto;width:auto;max-width:none;padding:0;margin:0;}
#partner-tabs .logo-listing-tiled a{display:inline-flex;align-items:center;}
#partner-tabs .logo-listing-tiled img{width:auto;max-height:64px!important;object-fit:contain;}

/* [22] 2026-07-20 icon-cards (col-3 icon + col copy): a copy word wider than the content column
   made the whole column drop BELOW the icon (flex default min-width:auto; hit /partnerprograms
   "Open doors to new opportunities"). min-width:0 lets the text wrap in place so copy stays to the
   right. Pattern-scoped to the icon-card row; a no-op wherever copy already fits, so safe sitewide. */
.row:has(> .col-3 > .icon-wrap) > .col{min-width:0;}

/* [23] 2026-07-20 /partnerprograms card sections (scoped via sectionID) */
/* Tier medals (#pp-tiers): square medals were cropped top/bottom by the photo-card .ph-wrapper
   (aspect-ratio 4/3 + object-fit:cover). Show the full medal, no crop, no framed background. */
#pp-tiers .ph-wrapper{display:flex!important;align-items:center;justify-content:center;height:100%!important;aspect-ratio:auto!important;overflow:hidden;background:transparent!important;}
#pp-tiers .ph-wrapper img.card-image{object-fit:contain!important;max-height:100%!important;max-width:100%!important;width:auto!important;height:auto!important;margin:0!important;}
/* Centre the medal vertically: kill the wrapper's mb-3 and the img's own margin-bottom
   (flex align-items:center was centring the img+margin box, shoving it high). */
#pp-tiers .card-image-top > .ph{margin-bottom:0!important;}
/* Kill the photo-card tint overlay (.ph::after = rgba(0,48,74,.28)) that washed the medals. */
#pp-tiers .card-image-top .ph::after{content:none!important;display:none!important;}
#pp-tiers .card-image-top .ph{background:transparent!important;}
/* Specialization badges (#pp-badges): medal images dropped in the icon slot rendered at 80px.
   Enlarge to 120px (cards.twig icon transform bumped to 240px so it stays sharp). */
#pp-badges .icon-wrap img{max-width:120px!important;max-height:120px!important;}

/* [24] 2026-07-20 /alliances ecosystem logo cards (#alliance-ecosystem): show partner logos
   contained/centred on white, no photo-card crop / tile / tint overlay (same fix as #pp-tiers). */
#alliance-ecosystem .ph-wrapper{display:flex!important;align-items:center;justify-content:center;height:100%!important;aspect-ratio:auto!important;overflow:hidden;background:transparent!important;}
#alliance-ecosystem .ph-wrapper img.card-image{object-fit:contain!important;max-height:64px!important;max-width:100%!important;width:auto!important;height:auto!important;margin:0!important;}
#alliance-ecosystem .card-image-top > .ph{margin-bottom:0!important;}
#alliance-ecosystem .card-image-top .ph::after{content:none!important;display:none!important;}
#alliance-ecosystem .card-image-top .ph{background:transparent!important;}

/* [25] 2026-07-20 .celona-bullets: replace list bullets with the Celona favicon mark
   (reusable; used on /alliances "What you get"). */
.celona-bullets{list-style:none;padding-left:0;}
.celona-bullets li{position:relative;padding-left:1.9rem;margin-bottom:.55rem;}
.celona-bullets li::before{content:"";position:absolute;left:0;top:.15em;width:1.15rem;height:1.15rem;background:url(/assets/favicons/favicon.svg) no-repeat left center;background-size:contain;}

/* [26] 2026-07-20 resourceListing: give the resource grid breathing room so it does not
   bleed into the footer (module has no sectionSpacing/background field of its own). */
.section-resourceListing{padding-bottom:4rem!important;margin-bottom:2.5rem;}

/* [27] 2026-07-21 Open / borderless icon-panel cards + icon-above-title layout
   (Greg, universal). Icon cards (the non-photo branch in cards.twig) now render
   the icon stacked ABOVE the title on an open panel — no border, box, shadow, or
   fill — sitting directly on the section background (Perplexity-style grid).
   Photo / tier cards (the item.image branch) are unaffected and keep their
   borders. cards.twig emits `.card.card-open` + `.icon-wrap.icon-top`. */
.card.card-open{border:0;background:transparent;box-shadow:none;border-radius:0;}
/* Open-card text alignment + air between columns (client 2026-07-21: "more padding between
   text or we revert to visible boxes" + "these misalign"). The section-heading markup carries
   +24px of nested padding from the section edge while the card grid carries only +12px — a
   theme-wide quirk the old boxes masked. Base .75rem left padding puts open-card text at +24px,
   flush with the heading; the larger right padding keeps columns clearly separated. */
.card.card-open > .card-body,.card.card-open > .card-top{padding-left:1.5rem;padding-right:.75rem;}
@media (min-width:768px){
  .card.card-open > .card-body,.card.card-open > .card-top{padding-right:2.25rem;}
}
.card.card-open .icon-wrap.icon-top{display:block;margin-bottom:1rem;}
.card.card-open .card-title{margin-top:0;}
/* Highlighted open card still reads as emphasised: soft tinted panel + teal
   border + padding (overrides the transparent default and the plain
   .card-highlight border that card-open strips). */
.card.card-open.card-highlight{background:rgba(90,167,160,.07)!important;border:1px solid #5aa7a0!important;border-radius:14px!important;}
.card.card-open.card-highlight > .card-body,.card.card-open.card-highlight > .card-top{padding-left:1.5rem!important;padding-right:1.5rem!important;}

/* [28] 2026-07-21 (retired same day) Home-only pillar gap tweak — superseded by the global
   open-card padding in [27], which both aligns card text with headings and separates columns.
   Keeping the row/col overrides would double-shift the home cards. */

/* [29] 2026-07-21 Global auto-mono icon-card icons, keyed off the section background
   (client: prefer auto-recolour over uploading mono/reverse variants). Uploaded icon SVGs
   (<img>) can't take CSS fill, so recolour via filter: brightness(0) normalises any source
   colour to black, then the chain builds the target. Default = brand navy (#00304A) for light
   bands (White/Light Buff/Warm Linen/Light Charcoal) + no-bg sections; dark bands
   (Dark Blue/deep-blue/Blue/Rich Charcoal/Teal) → white/reverse. Scoped to .icon-wrap.icon-top
   (icon-card icons) so it never touches photo images, logos, or the coloured tier medals
   (#pp-badges). Palette hexes audited 2026-07-21. */
.icon-wrap.icon-top img{
  filter:brightness(0) saturate(100%) invert(12%) sepia(83%) saturate(1698%) hue-rotate(180deg) brightness(94%) contrast(101%);
}
.bg-dark-blue .icon-wrap.icon-top img,
.bg-deep-blue .icon-wrap.icon-top img,
.bg-blue .icon-wrap.icon-top img,
.bg-rich-charcoal .icon-wrap.icon-top img,
.bg-teal .icon-wrap.icon-top img,
.bg-deep-cobalt .icon-wrap.icon-top img{
  filter:brightness(0) invert(1);
}

/* [30] 2026-07-21 Home hero video. v3 (2026-07-22, client): FULL-SCREEN takeover — breaks out
   of the module container to full viewport width and full screen height. Where the browser
   supports scroll-driven animations (Chromium) it starts slightly inset/rounded and expands to
   full-bleed as it scrolls into view; elsewhere it is simply always full-bleed. Video block
   spacing set to none/none so it sits seamless between bands. */
.orion-hero-video{display:block;width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);height:100svh;min-height:520px;aspect-ratio:auto;object-fit:cover;object-position:center;border-radius:0;background:#01202f;}
/* 2026-08-07 - the scroll-driven grow is REMOVED (client): "it starts not full width, and as
   you scroll goes full width. Can we fix that." It was a scroll-timeline animation scaling the
   video .94 -> 1 with a 22px radius over `entry 0% cover 35%`; because the video sits high on
   the page it was already in view at load, so the first thing a visitor saw was an inset,
   rounded frame that then snapped out - read as a bug, not a flourish. Now full-bleed from the
   first paint. (Chromium-only feature; other browsers never saw it, so this also removes a
   browser inconsistency.) Keyframes deleted with it - nothing else referenced them. */

/* [31] 2026-07-21 Nav dead zone 1200–1399px (pre-existing theme bug, client-reported):
   the desktop menu is d-xxl-flex (≥1400px) but the hamburger is hidden from 1200px up —
   so ordinary laptop widths get NO navigation at all. Show the hamburger in the gap. */
@media (min-width:1200px) and (max-width:1399.98px){
  /* 2026-08-07 v2 - show the REAL nav here, not a hamburger (client: "I've now got hamburger menu
     on desktop - please fix"). The theme gates the desktop menu at d-xxl-flex (>=1400) but it fits
     comfortably well below that: measured at 1200 the menu <ul> is 592px inside a 738px column -
     146px of slack, no wrapping, no header overflow at 1200/1280/1366. So 1200-1399 gets the full
     menu and the hamburger goes away. Below 1200 the theme's own hamburger takes over unchanged.
     !important is needed to counter Bootstrap's own .d-none utility, which is !important. */
  nav.nav-main{display:flex!important;}
  div.d-xl-none:has(> button.hamburger){display:none!important;}
  button.hamburger{display:none!important;}
}

/* [32] 2026-07-21 Desktop nav: hide the dropdown chevrons on the top-level items
   (client). Desktop menu only — the mobile/hamburger menu is untouched. */
nav.nav-main i.icon-chevron-down1{display:none;}
/* [33] 2026-07-21 Home "why Orion" vertical steps (#orion-why-vertical, block 27340, under the
   hero video). Perplexity-style numbered rows: graphic left (col-4) / headline+caption right
   (col-8), thin dividers between rows, mono "// 01" eyebrows. Copy + placeholder chart per client. */
#orion-why-vertical .row > [class*="col-"]{display:flex;flex-direction:column;justify-content:center;}
#orion-why-vertical .row > [class*="col-"]:nth-child(n+3){border-top:1px solid rgba(0,48,74,.14);padding-top:2.75rem;margin-top:2.75rem;}
#orion-why-vertical .vert-step-eyebrow{font-family:'Roboto Mono',monospace;font-size:.85rem;letter-spacing:.08em;margin-bottom:1rem;}
#orion-why-vertical h3{margin-bottom:.6rem;}
#orion-why-vertical img{max-width:140px;width:100%;height:auto;}

/* [34] 2026-07-21 Open-card icon: strip the theme's 20px icon-wrap top padding (part of the
   "gap bugging me" fix — the rest was the redundant blockColour panel on the pillars block). */
.card.card-open .icon-wrap.icon-top{padding-top:0;}

/* [35] 2026-07-22 gallerySection carousel arrows (client, home draft edits): navy (#00304A)
   instead of default, transparent chrome, and on wide screens pulled OUTSIDE the photo strip
   so they don't sit on top of the images. Below xl they stay inside (no side room). */
.section-gallerySection .f-gallery,
.section-gallerySection .f-logoCarousel{
  --f-arrow-bg:transparent;--f-arrow-hover-bg:transparent;--f-arrow-active-bg:transparent;
  --f-arrow-shadow:none;--f-arrow-border-radius:0;
  --f-arrow-color:#00304A;--f-arrow-svg-stroke-width:3;
}
.section-gallerySection .f-carousel__nav .f-button{background:transparent!important;box-shadow:none!important;}
.section-gallerySection .f-carousel__nav .f-button svg{color:#00304A!important;stroke:#00304A!important;}
@media (min-width:1200px){
  .section-gallerySection .f-gallery,
  .section-gallerySection .f-logoCarousel{overflow:visible;}
  .section-gallerySection .f-carousel__nav .f-button.is-prev{left:-54px;}
  .section-gallerySection .f-carousel__nav .f-button.is-next{right:-54px;}
}

/* [35b] 2026-07-22 Carousel-module arrows: same treatment as the gallery ([35]) — on wide
   screens pull prev/next OUTSIDE the slides so they don't sit on the photos. (Arrow colour
   for .section-carousel flipped teal → navy in [2] same day, client.) */
@media (min-width:1200px){
  .section-carousel .f-carousel{overflow:visible;}
  .section-carousel .f-carousel__nav .f-button.is-prev{left:-54px;}
  .section-carousel .f-carousel__nav .f-button.is-next{right:-54px;}
}

/* [35c] 2026-07-22 Arrow visibility over photos (client: "arrows sit tight to the photo so you
   can't see them"). Full-bleed strips have no room outside the images, so instead: navy chevron
   on a white circular chip with a soft shadow — readable on any photo. Light bands only; dark
   bands keep the bare white chevrons from [2]. */
.section-carousel .f-carousel,
.section-gallerySection .f-gallery,
.section-gallerySection .f-logoCarousel{
  --f-arrow-bg:#ffffff;--f-arrow-hover-bg:#f5f3ec;--f-arrow-active-bg:#f5f3ec;
  --f-arrow-border-radius:50%;--f-arrow-shadow:0 2px 10px rgba(0,48,74,.18);
}
.section-carousel .f-carousel__nav .f-button,
.section-gallerySection .f-carousel__nav .f-button{
  background:#ffffff!important;border-radius:50%!important;box-shadow:0 2px 10px rgba(0,48,74,.18)!important;
}
.section-carousel.bg-deep-blue .f-carousel__nav .f-button,
.section-carousel.bg-dark-blue .f-carousel__nav .f-button,
.section-carousel.bg-blue .f-carousel__nav .f-button,
.section-carousel.bg-teal .f-carousel__nav .f-button,
.section-carousel.bg-charcoal .f-carousel__nav .f-button,
.section-carousel.bg-rich-charcoal .f-carousel__nav .f-button,
.section-carousel.bg-deep-cobalt .f-carousel__nav .f-button{
  background:transparent!important;box-shadow:none!important;
}

/* [36] (retired same day — fancyapps-based focus strip; superseded by the [37] custom stage) */

/* [37] 2026-07-22 "Focus Strip" gallery type v2 (client: "centre image larger, two either side
   sitting under/around it" — standard centred-focus gallery). Custom absolute-position stage
   (gallerySection.twig focusStrip branch + JS [9]): centre item full size on top (z3), left/right
   neighbours tucked under its edges at ~82% scale (z2), next-in-line items parked offstage
   invisible so advancing glides them in. Arrow chips inherit [35e]. */
.orion-focus{position:relative;padding:0 3.5rem;}
.ofs-stage{position:relative;width:100%;aspect-ratio:3.42/1;min-height:200px;}
.ofs-item{position:absolute;top:0;left:50%;width:46%;margin:0;transform:translateX(-50%) scale(.6);opacity:0;z-index:1;
  transition:transform .55s cubic-bezier(.22,.8,.24,1),opacity .4s ease;will-change:transform,opacity;}
.ofs-item img{width:100%;height:auto;display:block;border-radius:12px;box-shadow:0 10px 28px rgba(0,48,74,.14);}
.ofs-item figcaption{text-align:center;font-weight:600;color:#00304A;margin-top:.85rem;opacity:0;transition:opacity .35s ease .15s;}
.ofs-item.is-center{transform:translateX(-50%) scale(1);opacity:1;z-index:3;}
.ofs-item.is-center figcaption{opacity:1;}
.ofs-item.is-left{transform:translateX(-108%) scale(.82);opacity:.9;z-index:2;}
.ofs-item.is-right{transform:translateX(8%) scale(.82);opacity:.9;z-index:2;}
.ofs-item.is-farleft{transform:translateX(-150%) scale(.7);opacity:0;z-index:1;}
.ofs-item.is-farright{transform:translateX(50%) scale(.7);opacity:0;z-index:1;}
.orion-focus .f-button{position:absolute;top:calc(50% - 24px);width:48px;height:48px;border:0;border-radius:50%;
  display:grid;place-items:center;cursor:pointer;z-index:4;color:#00304A;}
.orion-focus .f-button.is-prev{left:0;}
.orion-focus .f-button.is-next{right:0;}
@media (max-width:767.98px){
  .orion-focus{padding:0 2.5rem;}
  .ofs-item{width:74%;}
  .ofs-stage{aspect-ratio:1.78/1;}
  .ofs-item.is-left{transform:translateX(-112%) scale(.8);opacity:.55;}
  .ofs-item.is-right{transform:translateX(12%) scale(.8);opacity:.55;}
}

/* [35d] 2026-07-22 Dark-band arrow fix: [35c]'s white chips assumed the dark class sits on the
   SECTION — but some carousels (e.g. the dark testimonial "proof" sliders) get their colour from
   an inner block/card wrapper, producing a white chip + white chevron = invisible. Key off ANY
   dark ancestor: bare white chevrons, no chip, wherever the band is dark. */
:is(.bg-deep-blue,.bg-dark-blue,.bg-blue,.bg-teal,.bg-charcoal,.bg-rich-charcoal,.bg-deep-cobalt) .f-carousel__nav .f-button{
  background:transparent!important;box-shadow:none!important;
}
:is(.bg-deep-blue,.bg-dark-blue,.bg-blue,.bg-teal,.bg-charcoal,.bg-rich-charcoal,.bg-deep-cobalt) .f-carousel__nav .f-button svg{
  color:#ffffff!important;stroke:#ffffff!important;
}

/* [35e] 2026-07-22 Arrow rules, structure-proof: some carousels render arrows as direct
   `.f-button.is-arrow` children of .f-carousel (no .f-carousel__nav wrapper), so [2]/[35c]/[35d]
   never matched them (result: white chip + white chevron = invisible on the dark testimonial
   sliders). Cover BOTH structures; dark-ancestor override declared last so it wins. */
.section-carousel .f-button:is(.is-prev,.is-next),
.section-gallerySection .f-button:is(.is-prev,.is-next){
  background:#ffffff!important;border-radius:50%!important;box-shadow:0 2px 10px rgba(0,48,74,.18)!important;
}
.section-carousel .f-button:is(.is-prev,.is-next) svg,
.section-gallerySection .f-button:is(.is-prev,.is-next) svg{
  color:#00304A!important;stroke:#00304A!important;
}
:is(.bg-deep-blue,.bg-dark-blue,.bg-blue,.bg-teal,.bg-charcoal,.bg-rich-charcoal,.bg-deep-cobalt) .f-button:is(.is-prev,.is-next){
  background:transparent!important;box-shadow:none!important;
}
:is(.bg-deep-blue,.bg-dark-blue,.bg-blue,.bg-teal,.bg-charcoal,.bg-rich-charcoal,.bg-deep-cobalt) .f-button:is(.is-prev,.is-next) svg{
  color:#ffffff!important;stroke:#ffffff!important;
}

/* [38] 2026-07-22 Home hero heading +20% (client). Theme h2 is clamp(1.325em,4vw,3.5em);
   scoped to the intro wrapper (.home-intro in home.twig) so other h2s are untouched. */
.home-intro h2{font-size:clamp(1.59em,4.8vw,4.2em);}

/* [39] 2026-07-22 "Platform style" featuresList variant (client — Platform Section): vertical
   accordion, clean titles left (caption only shows on the OPEN item), large borderless media
   right, CTAs as plain text-with-arrow links. Toggled per block by the "Platform style (image
   accordion)" lightswitch (emits .feature-platform on the section). Media lives in each
   feature's rich text, so images can be swapped for videos/slideshows later. */
/* closed items: title only */
.feature-platform .feature-tab-container.collapsed .feature-tab > div p:not(.h4){display:none;}
.feature-platform .feature-tab > div p:not(.h4){margin-bottom:0;margin-top:.35rem;}
.feature-platform .feature-tab > div p.h4{margin-bottom:0;}
/* right panel: no box, large media */
.feature-platform .accordion-body:not([class*="bg-"]),
.feature-platform .feature-tab-content:not([class*="bg-"]){background:transparent;border:0;padding:0;box-shadow:none;}
.feature-platform .blocked:not([class*="bg-"]){background:transparent;border:0;padding:0;margin:0;}
.feature-platform .accordion-body img{width:100%;height:auto;border-radius:14px;display:block;}
.feature-platform .accordion-body figure{margin:0;}
.feature-platform .accordion-body video{width:100%;height:auto;border-radius:14px;display:block;}
/* CTAs: borderless text + arrow */
.feature-platform .accordion-body .btn{background:none!important;border:0!important;padding:0!important;border-radius:0!important;font-weight:600;box-shadow:none!important;font-size:1.15rem;text-decoration:none!important;}.feature-platform .accordion-body .btn::before,.feature-platform .accordion-body .btn::after{content:none!important;display:none!important;}
.feature-platform .accordion-body .btn:hover{opacity:.75;}
.feature-platform .accordion-body .btn .icon{transition:transform .2s ease;display:inline-block;}
.feature-platform .accordion-body .btn:hover .icon{transform:translateX(4px);}

/* [39b] 2026-07-22 Platform variant media stabilisation (client: imagery "variably placed" +
   section height jumps when navigating). Every panel's media renders inside a FIXED 16:10
   frame (object-fit:contain, centred) so all four items present identically regardless of
   source image size — and the panel swap is instant (no Bootstrap height animation), so the
   section never changes height while navigating. */
.feature-platform .accordion-body figure.image{aspect-ratio:16/10;display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:14px;}
.feature-platform .accordion-body figure.image img{width:100%;height:100%;object-fit:contain;border-radius:0;}
.feature-platform .accordion-body video{aspect-ratio:16/10;object-fit:contain;}
.feature-platform .collapsing{transition:none!important;}

/* [40] 2026-07-22 "Tall card imagery (portrait)" cards-module toggle (client — "Who it's for":
   tall vertical images a la Archetype, persona + solution + CTA only). Counterpart to the
   existing lean-images switch; emits .cards-img-tall. Portrait 2:3 crop comes from cards.twig;
   here: let the frame run tall instead of the theme's square-ish crop, and hide the
   descriptive <p> (copy stays in the CP — display only). */
.cards-img-tall .card-image-top .ph,
.cards-img-tall .ph-wrapper{aspect-ratio:2/3!important;height:auto!important;}
.cards-img-tall .ph-wrapper img.card-image{width:100%;height:100%;object-fit:cover;}
.cards-img-tall .card-body p{display:none;}
.cards-img-tall .card-body h4{margin-bottom:0;}

/* [40b] 2026-07-22 Why-Celona CTAs (client): the theme's btn-link/underline style draws a
   dash/underline stub beside the label (visible on hover) — strip ALL button chrome on the
   open cards here so the CTA is plain text + arrow, matching the Platform section. */
#home-why-orion .card .btn{background:none!important;border:0!important;padding:0!important;box-shadow:none!important;text-decoration:none!important;border-radius:0!important;}
#home-why-orion .card .btn::before,
#home-why-orion .card .btn::after{content:none!important;display:none!important;}
#home-why-orion .card .btn:hover{color:#5aa7a0!important;}
#home-why-orion .card .btn .icon{transition:transform .2s ease;display:inline-block;}
#home-why-orion .card .btn:hover .icon{transform:translateX(4px);}

/* [39c] 2026-07-22 Platform CTA placement (client: "random placement"): the CTA was
   left-aligned to the panel while the contained media centres in its frame — centre the
   button row under the media so they always relate. */
.feature-platform .accordion-body .row:has(> .col-auto .btn){justify-content:center;}

/* [39d] 2026-07-23 Platform variant: neutralise the featuresList panel-height stabiliser
   (client: "set padding to none, still quite large"). The theme JS pins the panel column to
   an inline min-height sized for the old boxed panels (~549px) — ~90-140px of dead space no
   spacing field can remove. The platform variant's fixed 16:10 media frame already equalises
   panel heights, so the stabiliser is unnecessary here. !important beats the inline style. */
.feature-platform .feature-tabs .col-md-6.px-md-0{min-height:0!important;}

/* [39e] 2026-07-23 Platform CTA breathing room (client: "button overhang") — the CTA is the
   panel's last element and sat flush on the section edge, visually swallowing the section's
   bottom padding. Default margin below it (no !important — section spacing stacks on top). */
.feature-platform .accordion-body .row:has(> .col-auto .btn){margin-bottom:1.5rem;}

/* [39f] 2026-07-23 Platform BOXED mode polish (client: panel defines the space but images need
   to "look good" + button placement). When the editor sets Content Colour ([class*="bg-"]), the
   panel becomes a rounded card: media runs edge-to-edge across its top (no floating-image gaps),
   CTA sits bottom-left as a card footer. All defaults, no !important — Content Colour unset
   returns the open layout, and CK inline image styles still win. */
.feature-platform .accordion-body[class*="bg-"]{padding:0;border-radius:12px;overflow:hidden;}
.feature-platform .accordion-body[class*="bg-"] .blocked{padding:0;margin:0;border:0;}
.feature-platform .accordion-body[class*="bg-"] figure.image{border-radius:0;}
.feature-platform .accordion-body[class*="bg-"] .row:has(> .col-auto .btn){justify-content:flex-start;margin:.5rem 1.25rem 1.25rem;}

/* [39g] 2026-07-23 Boxed-mode media fills the panel horizontally (client: image "should cover
   all horizontal space in the box") — cover crop inside the 16:10 frame. Note: crops
   tall/portrait sources (incl. product renders); open mode keeps contain. */
.feature-platform .accordion-body[class*="bg-"] figure.image img{object-fit:cover;}

/* [41] 2026-07-23 "Trusted by" stat band (client mock, single-band approach; pairs with JS [11]).
   Markup pattern (codeBlock):
   <div class="stat-band">
     <div class="stat"><span class="stat-label">Label</span><span class="stat-value">25+</span></div>
     <div class="stat"><span class="stat-label">Global leaders in</span>
       <span class="stat-value stat-rotate"><span>Electrical manufacturing</span><span>…</span></span></div>
   </div> */
.stat-band{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:1rem 1.5rem;background:#fff;border-radius:14px;padding:1.3rem 2rem;}
.stat-band .stat{display:flex;align-items:center;gap:.9rem;}
.stat-band .stat-label{font-size:.9rem;line-height:1.25;color:#00304A;opacity:.75;max-width:9.5em;text-align:right;border-right:2px solid rgba(0,48,74,.25);padding-right:.9rem;}
.stat-band .stat-value{font-size:1.55rem;font-weight:600;color:#0B5394;white-space:nowrap;}
.stat-band .stat-rotate{position:relative;display:inline-block;}
.stat-band .stat-rotate > span{position:absolute;left:0;top:0;opacity:0;transform:translateY(8px);transition:opacity .5s ease,transform .5s ease;white-space:nowrap;}
.stat-band .stat-rotate > span.is-on{position:relative;opacity:1;transform:translateY(0);}
@media (max-width:767.98px){
  .stat-band{flex-direction:column;align-items:flex-start;gap:1rem;}
  .stat-band .stat-label{text-align:left;}
  .stat-band .stat-value{font-size:1.5rem;}
}

/* [43] 2026-07-23 Typography v2 — SCOPED to text zones ([42] global ramp reverted same day; lesson:
   never resize bare heading tags globally on this theme). Sizes only — no colour changes.
   Zones: .block-x = the CK text container (cards.twig/multiColumn/accordionSection — verified the
   cards grid renders OUTSIDE it, and .block-x.stat-block has no direct h2/h3, only p.stat-value);
   direct-child (>) so nothing nested deeper (cards, tiles) is touched. Hero/title zones descendant.
   .lead = the CKEditor "Header Statement" style. Defaults not locks — no !important. */
/* [43d] 2026-07-23: body H2/H3 back to LEGACY — size upgrades apply ONLY to page-header content
   (hero/title zones). Client rule: nothing outside the header scales up. H2 size in these zones
   comes from [43b] below; this rule keeps only the balanced wrap. */
:is(.section-header, .section-title-intro, .home-intro) h2 { text-wrap: balance; }
:is(.section-header, .section-title-intro, .home-intro) h3 { font-size: clamp(2.2rem, 3.57vw, 3.5rem); text-wrap: balance; }
/* [43c] 2026-07-23: body text stays LEGACY — the upsized "Header Statement" applies ONLY in the
   hero/title zones (client rule: "anything not in the header is the same as it was"). Body-section
   .lead paragraphs revert to the theme size/weight. */
:is(.section-header, .section-title-intro, .home-intro) .lead { font-size: clamp(1.25rem, 1rem + 0.93vw, 1.95rem); font-weight: 400; line-height: 1.35; }

/* [43a] 2026-07-23 addendum to [43]: page-title H1 stays the largest — the upscaled body H2
   (68px cap) was overtaking the theme H1 (~58px at laptop widths). Hero/title zones only. */
:is(.section-header, .section-title-intro, .home-intro) h1 { font-size: clamp(3rem, 4.36vw, 4.65rem); text-wrap: balance; }

/* [44b] 2026-07-23: laptop trim — hero ~67px @1440 (5vw->4.65vw), H3/Header Statement -7% to match. */
/* [44a] 2026-07-23: hero headline cap 5.5rem->4.65rem (~74px, client). */
/* [43b] 2026-07-23 addendum: H2 typed as the PAGE HEADLINE (home-intro / intro-text heroes,
   title zones) renders at page-title scale — same as [43a] H1 — so the hero leads the page again.
   Body H2s (.block-x) stay at the [43] 68px-cap scale. Later-in-file wins over [43]'s zone rule. */
:is(.section-header, .section-title-intro, .home-intro) h2 { font-size: clamp(3rem, 4.36vw, 4.65rem); }

/* [44] 2026-07-23 Colour-by-background defaults (the "White Text" replacement).
   On dark section bands, CK-typed text defaults to legible: headings white, running text light.
   SCOPED like [43d]: only direct children of .block-x (the CK text container), and NOT block-x
   columns that carry their own background (multiColumn colourPicker adds bg-* to the block-x div).
   Cards/tiles/components on dark bands are untouched (they render outside .block-x and manage
   their own colours). DEFAULTS NOT LOCKS: no !important — editor fontColor and the existing
   .text-light (Bootstrap !important) always win, so current content is unchanged; this catches
   text that would otherwise render navy-on-navy and removes the need to hand-apply White Text. */
:is(.bg-deep-blue, .bg-dark-blue, .bg-blue, .bg-teal, .bg-charcoal, .bg-rich-charcoal, .bg-black, .bg-deep-cobalt) .block-x:not([class*="bg-"]) > :is(h1, h2, h3, h4, h5, h6) { color: #ffffff; }
:is(.bg-deep-blue, .bg-dark-blue, .bg-blue, .bg-teal, .bg-charcoal, .bg-rich-charcoal, .bg-black, .bg-deep-cobalt) .block-x:not([class*="bg-"]) > :is(p, ul, ol, .lead) { color: #c3cbd5; }

/* [45] 2026-07-23 bannerImageHalf hero: close the centre gap + give the copy more width.
   Theme lays the half-banner as .col-lg-6 (content) + .col-lg-5.offset-lg-1 (image), leaving a
   whole empty grid column (~8.3%) of dead space between text and image. Rebalance 55/45 and drop
   the offset. SELF-SCOPED to bannerImageHalf: only that toggle produces the col-lg-6 +
   col-lg-5.offset-lg-1 pairing (full-bleed/text-only banners use col-11/col-12), so it can't touch
   other banner modes. Image size deliberately left to the max-height:400px cap above so it never
   fights the lean/standard/tall height toggle. */
@media (min-width:992px){
  .title-intro-wrap > .col-lg-6 { flex: 0 0 auto; width: 55%; }
  .title-intro-wrap > .col-lg-5.offset-lg-1 { flex: 0 0 auto; width: 45%; margin-left: 0; }
}

/* [46] 2026-07-24 Proof-carousel cards: consistent height (client: hate variable-height case-study
   cards). The Fancyapps viewport is CSS grid, so slides ALREADY stretch equal to the tallest; the
   only reason cards look variable is the earlier 'height:auto' override stopping each card filling
   its slide. So just re-enable card fill — but ONLY in all-text carousels (no image/video tile),
   so the earlier client note (don't stretch light tiles to match a tall video/chart) still holds
   for mixed carousels. Media detection mirrors the existing min-height:620px rule. */
.section-carousel:not(:has(.f-carousel__slide .card figure.image)):not(:has(.f-carousel__slide .card video)) .f-carousel__slide .card.h-100 { height: 100% !important; }

/* [47] 2026-07-24 Image "Tall" heroes cap to the fold (client: banner overruns — still visible on
   scroll). The nav (header.section-nav) is ~142px and position:relative, so it PUSHES the hero down;
   the hero was a FIXED padding:220px 0 (~729px regardless of screen), so nav+hero overran shorter
   laptops. Fix: fill the REMAINING fold via svh so it adapts to any viewport, and neutralise the
   fixed tall padding. Scoped to has-image + banner-tall only (text heroes + lean/standard untouched). */
.title-section.has-image.banner-tall { min-height: calc(100svh - 150px); padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; }

/* [48] 2026-07-24 Use-case tab bullets — un-bold + 16px (client: whole line went bold, want body
   size). Cause: theme .table td:nth-child(1){font-weight:600} + .table td{font-size:14px}. These
   bullet tables are SINGLE-column, so :nth-child(1) bolded the entire cell (should be only the
   lead-phrase <strong>). Scope to single-cell rows (td:only-child) in tab content so multi-column
   spec/pricing tables keep their bold first column and 14px. No !important (higher specificity). */
.section-tabsSection .tab-content .table td:only-child { font-weight: 400; font-size: 1rem; }

/* [49] Megamenu label headers + hierarchy — 2026-07-24
   (a) Grouping headers render as <span class="nav-label"> (client: only Platform Overview links).
       Match the anchor styling each span replaces. Defaults, not locks. */
header .nav-main > ul > li .mega-nav > li > span.nav-label {
  font-weight: 700;
  font-size: 18px;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  line-height: 1.125em;
  cursor: default;
}
.mobile-nav li.has-children > span.nav-label {
  margin-top: 20px;
  color: #5aa7a0;
  font-family: "Roboto Mono", monospace;
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  display: inline-block;
}
.nav-mobile span.nav-label.menu-link { cursor: default; }

/* [49a] Indent items nested under a bold subgroup header (e.g. Celona Orchestrator under Orchestration) */
header .nav-main > ul > li .mega-nav > li > ul ul {
  padding-left: 14px;
}

/* [49b] Long column lists (8+ items, e.g. By Industry) spread over two inner columns
   (v4, 2026-07-24): panel flexes and hugs its content (width:max-content) so there is NO slack
   anywhere - every text-to-divider gap is exactly 44px. The long list uses a content-sized
   GRID (columns as wide as their own longest item, unlike multicol's equal columns), flowing
   column-first over 5 rows. Content-driven via :has(). If the list grows past 10 items, bump
   the row count. */
header .nav-main > ul > li .mega:has(ul.level2 > li:nth-child(8)) {
  width: max-content;
  max-width: 1080px;
  left: -150px;
}
header .nav-main > ul > li .mega-nav:has(> li > ul.level2 > li:nth-child(8)) {
  columns: auto;
  display: flex;
  column-gap: 0; /* theme's 50px column-gap also applies to flex; paddings own the spacing here */
}
header .nav-main > ul > li .mega-nav:has(> li > ul.level2 > li:nth-child(8)) > li {
  flex: 0 0 auto;
  padding: 0 44px;
}
header .nav-main > ul > li .mega-nav:has(> li > ul.level2 > li:nth-child(8)) > li:first-child {
  padding-left: 0;
}
header .nav-main > ul > li .mega-nav:has(> li > ul.level2 > li:nth-child(8)) > li:last-child {
  padding-right: 0;
}
header .nav-main > ul > li .mega-nav:has(> li > ul.level2 > li:nth-child(8)) > li + li {
  border-left: 1px solid #dee2e6;
}
header .nav-main > ul > li .mega-nav:has(> li > ul.level2 > li:nth-child(8)) > li > ul.level2 > li a {
  white-space: nowrap;
}
header .nav-main > ul > li .mega-nav > li > ul.level2:has(> li:nth-child(8)) {
  display: grid;
  grid-auto-flow: column;
  grid-template-rows: repeat(5, auto);
  column-gap: 56px;
  justify-content: start;
}

/* [49c] Pricing + Product Documentation are utility links inside the Platform Overview column
   (re-homed 2026-07-24): bold them apart from the page list, with a measured 14px gap above
   the pair. Targeted by href (no CP field exists for this); defaults, not locks. */
header .nav-main > ul > li .mega-nav > li > ul.level2 > li > a[href$="/pricing"],
header .nav-main > ul > li .mega-nav > li > ul.level2 > li > a[href*="docs.celona.io"] {
  font-weight: 700;
  font-size: 18px;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  line-height: 1.125em;
}
header .nav-main > ul > li .mega-nav > li > ul.level2 > li > a[href$="/pricing"] {
  margin-top: 22px;
}
header .nav-main > ul > li .mega-nav > li > ul.level2 > li > a[href*="docs.celona.io"] {
  margin-top: 10px;
}

/* [50] Underline/text-style buttons ("btn btn-link ..."): drop the inherited pill x-padding so
   the link text aligns flush with the copy above it (it was indented right, sized for a pill
   box that isn't there). 2026-07-24. Defaults, not locks. */
.btn.btn-link {
  --bs-btn-padding-x: 0;
  padding-left: 0;
  padding-right: 0;
}

/* [51] Maker-chip links (paired with JS [13]): the injected <a> takes over the chip's flex
   sizing from [6]; teal fill on hover as the click affordance. 2026-07-24. */
.maker-chips a {
  flex: 1 1 0;
  display: inline-flex;
  text-decoration: none;
  min-width: 150px;
}
.maker-chips a > span {
  flex: 1 1 auto;
  min-width: 0;
  width: 100%;
}
.maker-chips a:hover > span {
  background: #5aa7a0;
  border-color: #5aa7a0;
  color: #ffffff;
}

/* [52] /partnerprograms Specialization badges (#pp-badges): show the FULL badge with no photo
   treatment — the pcardphoto default cover-crops the image and lays a hard-light tint over it
   (client: "no layer over image, scaled to see the full badge"). Scoped to this section only.
   2026-07-24. */
#pp-badges .pcardphoto .ph img {
  object-fit: contain;
  mix-blend-mode: normal;
  filter: none;
}
#pp-badges .pcardphoto .ph,
#pp-badges .pcardphoto .ph-wrapper {
  background: transparent;
  mix-blend-mode: normal;
}
#pp-badges .pcardphoto .ph::after {
  content: none; /* the navy multiply overlay that darkened the badges */
}

/* [52a] pp-badges: the cards.twig 2-card count-rule forces col-md-6 (half width) regardless of
   cardGridSize; client wants the two badge boxes on a 2-of-4 grid. Scoped width override. */
@media (min-width: 1200px) {
  #pp-badges .row > .col-md-6.mb-3 {
    flex: 0 0 25%;
    max-width: 25%;
  }
}

/* [53] /become-a-partner: breathing room above the injected HubSpot form (client: "tiny bit
   more padding above"); section aligned to w11 natively. 2026-07-24. */
#bap-form .hbspt-form {
  margin-top: 1.75rem;
}

/* [52b] pp-badges: cap the section intro text at ~2/3 width (client: "60-70%, not fullscreen").
   Applies to the h2+p header block only; the card row keeps the full grid. 2026-07-24. */
@media (min-width: 992px) {
  #pp-badges .mb-5 .block-x {
    max-width: 66%;
  }
}

/* [54] 2026-07-28 TYPE-SYSTEM DEFAULTS — apply the agreed "Celona type system" spec as real site
   defaults. Client (Rajeev): "the 'paragraph lead' font is too small ... I think it's a site-wide
   thing ... that small font thing I'm going to keep repeating", plus "give Pepper the problem
   statement, not cell-by-cell swaps — do NOT hand-swap H3->H2, other things will break".
   Diagnosis (measured on /manufacturing, same 4 elements tracked across widths):
     width  1024   1280   1440   1536   1920
     h2      41     51     56     56     56
     lead    16.0   19.2   21.6   22.0   22.0    <- theme: clamp(1rem, 1.5vw, 1.375em)
     body    16     16     16     16     16
   Three structural defects, all fixed here:
     1. BODY COPY was 16px at line-height 1.125. The type system specifies 1.2rem / 1.5.
     2. THE LEAD HAS NO FLOOR — its min is 1rem, i.e. exactly body-copy size, so at/below ~1090px
        "paragraph lead" and body text render identically and the hierarchy collapses. Its ratio to
        the governing heading sits at 0.37-0.39 at EVERY width; the hero lead (fixed on the 23rd)
        runs 0.45 and reads correctly. Body leads were left behind because [43a-d] scoped last
        week's upgrade to the hero zones only (.section-header/.section-title-intro/.home-intro).
        Fixed by giving body .lead the same approved treatment the hero already uses — cohesion
        across heading/style selections rather than two competing scales.
     3. NO TONAL HIERARCHY ON LIGHT GROUNDS. [44] greys secondary text on dark bands only, so on
        buff/linen/white every line is navy. Spec: heading ink, secondary grey.
   Grey is #55676e, NOT the spec's #5f7178: that value measures 4.06:1 on warm linen and fails
   WCAG AA for normal-size text. #55676e gives 4.71:1 on linen, 5.32 on light buff, 5.91 on white.
   SCOPING (verified by before/after DOM diff on /manufacturing, /pricing, /frequency, /resources):
   no heading moves anywhere and no size REDUCTIONS anywhere. Excludes display-* (the CK label
   styles), .lead, stat values, blockquote pull-quotes and figcaptions; .section-resourcesShowcase
   keeps its own card scale untouched (0 changes on /resources). DEFAULTS NOT LOCKS — no
   !important, so editor colour choices and module-specific rules still win. */
:is(.block-x, .feature-tab-content, .accordion-body, .section-tabsSection .tab-content) :is(p, li, td, dd):not([class*="display-"]):not(.lead):not(.stat-value):not(.stat-pop):not(blockquote p):not(blockquote li):not(figcaption) {
  font-size: 1.2rem;
  line-height: 1.5;
}
/* [54a] paragraph lead: real floor (1.25rem) + the hero's approved ramp, so it can never decay into
   body copy. Hero keeps its own [43c] rule (higher specificity) — this governs BODY sections. */
.lead {
  font-size: clamp(1.25rem, 1rem + 0.93vw, 1.95rem);
  font-weight: 400;
  line-height: 1.35;
}
/* [54b] light-ground tonal hierarchy — the mirror of [44]'s dark-ground rule. Heading keeps ink;
   running text and the lead step back to grey so hierarchy reads by colour as well as size. */
:is(.bg-light-buff, .bg-warm-linen, .bg-white) .block-x:not([class*="bg-"]) > .lead:not(.bg-dark-blue *):not(.bg-deep-blue *):not(.bg-blue *):not(.bg-teal *):not(.bg-charcoal *):not(.bg-rich-charcoal *):not(.bg-black *):not(.bg-deep-cobalt *):not(.section-resourcesShowcase *) {
  color: #55676e;
}

/* [55] 2026-07-28 TYPE-SYSTEM SWEEP — extend [54] to the modules it missed, + badge bug.
   [54] scoped body copy by CONTAINER (.block-x, accordion/tab bodies). That left every CARD behind:
   card text renders in .card-body > .row > .col-12 > p, outside .block-x, so 150+ nodes stayed at
   16px navy (client screenshot: "Private 5G Gateway* / Bring PLCs, machines..." + the TCO Calculator
   block, both measured 16px rgb(0,48,74)). Re-scoped by MODULE instead of container, which also
   excludes .section-resourcesShowcase by construction — it keeps its own deliberate card scale
   (verified: 0 changes on /resources).
   EXCLUSIONS, all deliberate: display-* (CK label styles) · .lead ([54a]) · stat values ·
   blockquote pull-quotes · figcaption · .feature-tab labels (the clickable featuresList tab rows
   run at 24px — the module allowlist would have SHRUNK 30 of them to 19.2; caught in the
   before/after diff). Hero zones (.section-title-intro) deliberately untouched.
   Verified across /manufacturing /resources /partnerprograms /5g-lan /pricing: no heading moves,
   no size reductions. Height +0.0% to +5.6%. */
:is(.section-cards, .section-featuresList, .section-carousel, .section-gallerySection, .section-accordionSection, .section-multiColumn, .section-tabsSection) :is(p, li, td, dd):not([class*="display-"]):not(.lead):not(.stat-value):not(.stat-pop):not(blockquote p):not(blockquote li):not(figcaption):not(.feature-tab p):not(.feature-tab li) {
  font-size: 1.2rem;
  line-height: 1.5;
}
/* [55a] card tonal hierarchy — the card equivalent of [54b]. Cards manage their own ground, so this
   targets ONLY explicitly-light cards (.bg-white 187 / .bg-light-buff 96 sitewide) plus bare cards
   sitting inside a light section. Dark cards (.bg-dark-blue, 3 sitewide) and bare cards on dark
   bands are left alone so nothing goes grey-on-navy. */
:is(.card.bg-white, .card.bg-light-buff) .card-body .lead:not(.bg-dark-blue *):not(.bg-deep-blue *):not(.bg-blue *):not(.bg-teal *):not(.bg-charcoal *):not(.bg-rich-charcoal *):not(.bg-black *):not(.bg-deep-cobalt *):not(.section-resourcesShowcase *),
:is(.bg-light-buff, .bg-warm-linen, .bg-white) .card:not([class*="bg-"]) .card-body .lead:not(.bg-dark-blue *):not(.bg-deep-blue *):not(.bg-blue *):not(.bg-teal *):not(.bg-charcoal *):not(.bg-rich-charcoal *):not(.bg-black *):not(.bg-deep-cobalt *):not(.section-resourcesShowcase *) {
  color: #55676e;
}
/* [55b] BUG: the resourcesShowcase "New"/type badge rendered at 8.4px — the template sets
   .resource-type-line to 0.66rem and the badge to 0.8em, so the em compounds against an already
   reduced parent (0.66 x 0.8 = 0.528rem). Absolute rem stops the compounding. */
.section-resourcesShowcase :is(.resource-badge, .resource-badge-new) {
  font-size: .7rem;
}

/* [55c] 2026-07-28 badge fix, take two. [55b] lost the cascade: the resourcesShowcase TEMPLATE ships
   its own inline <style> carrying `.section-resourcesShowcase .resource-badge-new{font-size:.62em}`
   — identical specificity (0,2,0) to [55b], but an inline <style> in the body renders AFTER the
   linked stylesheet, so order decided it. Adding .card to the chain (0,3,0) wins outright without
   resorting to !important. Root cause unchanged: .62em against a 13.6px parent = 8.43px. */
.section-resourcesShowcase .card :is(.resource-badge, .resource-badge-new) {
  font-size: .7rem;
}

/* [56] 2026-07-28 finish the tonal sweep. [54b]/[55a] applied the grey secondary via CONTAINER
   (.block-x / .card-body), which reached only ~half the body text: a post-deploy sweep of 12 pages
   found 148 body nodes still navy — 89 tabsSection <td> on warm linen, 41 featuresList paragraphs
   on white/light-buff, 10 bare-card paragraphs, 8 nested deeper than .block-x's direct children.
   Half-grey/half-navy reads as a mistake, so this keys off the BACKGROUND instead of the container,
   which is how the type system actually describes it ("colour is automatic by background").
   GUARDS: skips .section-resourcesShowcase (its own scale/colour system), and skips anything inside
   a dark card or dark band nested within a light section (.bg-dark-blue/.bg-teal subtrees) so
   nothing can render grey-on-navy. Same exclusions as [55] otherwise. Contrast checked: #55676e is
   4.71:1 on warm linen, 5.32 on light buff, 5.91 on white — all pass WCAG AA for normal text.
   Defaults not locks: no !important, so editor fontColor spans and .text-light still win. */
:is(.bg-light-buff, .bg-warm-linen, .bg-white) .lead:not([class*="display-"]):not(.stat-value):not(.stat-pop):not(blockquote p):not(blockquote li):not(figcaption):not(.feature-tab p):not(.feature-tab li):not(.section-resourcesShowcase *):not(.bg-dark-blue *):not(.bg-teal *):not(.bg-deep-blue *):not(.bg-charcoal *):not(.bg-rich-charcoal *):not(.bg-black *):not(.bg-deep-cobalt *) {
  color: #55676e;
}

/* [57] 2026-07-28 guard patch (edits [54b]/[55a] in place, no new override layer).
   A post-deploy sweep caught grey-on-DARK on /aerflex: [54b]/[55a] keyed only off a LIGHT ancestor,
   but dark bands nest inside light wrappers, so a .bg-dark-blue section under a light one matched
   both [44] (#c3cbd5) and [54b] (#55676e) — and [54b] is later in the file, so it won. Added
   dark-subtree :not() guards to both, matching [56]'s. Also added :not(.section-resourcesShowcase *)
   — [55a] was grey-ing the showcase "NEW" type line, which owns its own colour. No new rules; the
   two existing selectors were tightened at source so the cascade stays one layer deep. */

/* [58] 2026-07-28 two consequences of the body-copy lift, both caught in review.
   (a) BUTTONS now read small: .btn is var(--bs-btn-font-size) = 1rem, unchanged while body copy went
       to 1.2rem, so CTAs sit BELOW the paragraph they follow. Rebalanced to 1.125rem (18px) — still
       a touch under body so buttons don't shout, but clearly no longer undersized. Set as a scoped
       CUSTOM PROPERTY on main, not a .btn override, so it flows through every Bootstrap button
       variant and every module without a specificity fight. main excludes the nav + footer (both
       render outside <main>, verified), so the header CTAs keep their 16px and the nav layout is
       untouched. Padding is rem-based in this theme, so nothing reflows.
   (b) LEAD/HEADING INVERSION — a defect [54a] introduced. Giving body .lead the hero ramp (30.3px)
       made it LARGER than the heading it sits under wherever that heading is an H3 (28px) or H4
       (24px): 12 such pairs on /aerflex alone (featuresList "Feature"/"Benefit" H4 + lead). The
       client's own direction was to cap how far the lead can drop relative to its heading — the
       dual has to hold too, it must never overtake it. Scoped to the adjacent-sibling case that
       actually occurs (verified: every inversion is `h4 + .lead`, immediate sibling). Range
       20–21.6px: always clear of body copy (19.2) and always under an H4 (24). H2-led leads are
       untouched and keep the full [54a] ramp. */
main {
  --bs-btn-font-size: 1.125rem;
}
/* [58a] lead never overtakes its own heading */
:is(h3, h4, h5, h6) + .lead {
  font-size: clamp(1.25rem, 1rem + 0.4vw, 1.35rem);
}

/* [58b] correction to [58]: Bootstrap declares --bs-btn-font-size ON .btn itself
   (`.btn{--bs-btn-font-size:1rem;font-size:var(--bs-btn-font-size)}`), so scoping the variable to
   `main` never reached it — the component's own declaration is closer to the element and wins.
   Redefine it on the button, still inside main so nav/footer CTAs keep 16px. */
main .btn {
  --bs-btn-font-size: 1.125rem;
}

/* [59] 2026-07-28 PALETTE CLEANUP + SIZE DE-DUPLICATION (client palette slide, Mitch's review).
   Manufacturing audit: 250 nodes -> 41 treatments, 16 sizes, 10 colours. The palette slide settles
   what's rogue: #414041 in gallery captions is actually brand Charcoal (kept); the real rogues are
   pure black on .btn-white (--bs-btn-color default), Bootstrap grey #ADB5BD on breadcrumbs, and
   #01202F on the showcase badge (fixed in the template, same deploy). Sizes: every <1.5px-apart
   near-duplicate collapsed to the nearest scale step — 20/19.2, 18.9/19.2, 16.8/16, 14.8/14,
   13.6/14, 11.5/11.2/11 — simulated first: only the intended nodes move, zero height change.
   The carousel-h4 and maker-chips edits are IN their original sections above (marked [59]). */
main .btn-white { --bs-btn-color: #00304A; } /* black -> Dark Blue; brand has no pure black */
.breadcrumbs li, .breadcrumbs li a { font-size: .7rem; color: #C3CBD5; } /* #adb5bd -> palette Light Charcoal; 11 -> 11.2 joins the micro step */
.section-tab-wrap { font-size: clamp(.75rem, 1.125vw, .875rem); } /* mono eyebrow: cap 14.8 -> 14, keeps the theme's fluid floor */

/* [59a] breadcrumb grey, second attempt: the theme rule is `.breadcrumbs li a{color:#adb5bd!important}`
   — a hard lock, so [59]'s default lost. Countering an existing theme !important is one of the
   sanctioned lock cases (css-defaults-not-locks policy); scope stays exactly as narrow as the rule
   it replaces. Hover (navy, also !important) left as the theme had it. */
.breadcrumbs li a { color: #C3CBD5 !important; }

/* [60] 2026-07-28 DEEP COBALT #0B5394 — promoted to a full brand colour (client palette slide,
   Mitch's confirmation). The swatch itself is added centrally in config/colour-swatches.php (one
   file feeds BOTH ColourSwatches fields — colourPicker #6 for backgroundColour/accentColour/
   cardColour/blockColour/contentColour layout instances, and colourPickerButton #132). The plugin
   derives the classes (bg-/text-/btn-/btn-outline-deep-cobalt) but nothing defined them in CSS —
   these mirror the theme's Bootstrap-generated .btn-dark-blue / .bg-dark-blue patterns exactly.
   Deep Cobalt is a DARK ground: also added to every dark-band enumeration above, marked by the
   replacements in [44] (colour-by-background engine), [56]/[57] guards, carousel arrows, HubSpot
   dark-form styling, and the icon auto-mono invert. ([56]'s guard was also missing
   .bg-rich-charcoal — hole closed in the same pass.) Utility classes use !important where the
   theme's Bootstrap utilities do (that is the utility contract, not a lock violation). */
.bg-deep-cobalt { background-color: #0B5394 !important; color: #f5f3ec; }
.text-deep-cobalt { color: #0B5394 !important; }
.btn-deep-cobalt { --bs-btn-color: #fff; --bs-btn-bg: #0B5394; --bs-btn-border-color: #0B5394; --bs-btn-hover-color: #fff; --bs-btn-hover-bg: #09447a; --bs-btn-hover-border-color: #09447a; --bs-btn-active-color: #fff; --bs-btn-active-bg: #083d6e; --bs-btn-active-border-color: #083d6e; --bs-btn-disabled-color: #fff; --bs-btn-disabled-bg: #0B5394; --bs-btn-disabled-border-color: #0B5394; }
.btn-outline-deep-cobalt { --bs-btn-color: #0B5394; --bs-btn-border-color: #0B5394; --bs-btn-hover-color: #fff; --bs-btn-hover-bg: #0B5394; --bs-btn-hover-border-color: #0B5394; --bs-btn-active-color: #fff; --bs-btn-active-bg: #0B5394; --bs-btn-active-border-color: #0B5394; --bs-btn-disabled-color: #0B5394; --bs-btn-disabled-border-color: #0B5394; }

/* [61] 2026-07-28 home-hero lead colour (Mitch: home page H2 + lead render the same navy).
   The tonal engine keys off bg-* classes, but .home-intro sits on the page's DEFAULT background —
   visually light, no class — so neither the light rule ([54b]/[56]) nor the dark rule ([44]) can
   match and the lead stayed ink. Per the type system the Header Statement under a heading is grey
   on light ground. Scoped to .home-intro only; other heroes (.section-title-intro/.section-header)
   sit on images/banner colours the theme governs. No !important — an editor colour still wins. */
.home-intro .lead { color: #55676e; }

/* [62] 2026-07-28 STACKED-HEADING DEMOTION (Mitch: "if h2,h2 / h1,h2 / h2,h3 combinations, the
   second has the same treatment as Body/lead"). This is the type-system's "default combinations"
   stack — top line carries the hierarchy (ink/white, bold), every heading directly under it reads
   as the intro line (grey, regular weight). Size is NOT changed — an H3 under an H2 keeps H3 scale,
   which is exactly the pane's "H2 + H3 default standard section header" combo.
   SCOPE: section-heading stacks only — direct children of .block-x (the CK content container) and
   .home-intro. Card-internal stacks are deliberately excluded: the 14 existing H3+H4 pairs sitewide
   are all inside cards (proof-carousel title+takeaway, home persona cards) and are styled as bold
   pairs on purpose. No live .block-x stacks exist today, so this changes nothing until an editor
   types one — it's the forward default. No !important; editor colour picks still win. */
:is(.block-x, .home-intro) > :is(h1, h2, h3) + :is(h2, h3, h4) {
  color: #55676e; /* [64c] weight change removed — colour only */
}
/* [62a] dark-ground variant: the demoted heading matches the dark body/lead grey. Wins over [44]'s
   white-headings rule on specificity (same ancestor chain + the adjacent-sibling compound). */
:is(.bg-deep-blue, .bg-dark-blue, .bg-blue, .bg-teal, .bg-charcoal, .bg-rich-charcoal, .bg-black, .bg-deep-cobalt) .block-x:not([class*="bg-"]) > :is(h1, h2, h3) + :is(h2, h3, h4) {
  color: #c3cbd5;
}

/* [63] 2026-07-28 TONAL REVERT — BODY COPY BACK TO INK ON LIGHT GROUNDS (Mitch, after seeing it in
   the wild on the TCO/featuresList panels: "I think we revert body. So headline/lead is the other
   non-header that is grey"). The grey secondary now applies ONLY to the Header-Statement layer:
   `.lead` ([54b]/[55a]/[56], all restricted to .lead in place above) + the [62] demoted stacked
   heading + the [61] home-hero lead. Plain paragraphs/lists/tables on light grounds return to the
   theme ink they had before yesterday. DARK grounds unchanged — [44]'s #c3cbd5 body stays, that's
   legibility not hierarchy. Size work ([54]/[55] 19.2px body) is NOT reverted — colour only. */

/* [64] 2026-07-28 STACKED-HEADING DEMOTION IN BANNERS (Mitch's CP test: Banner Content with H2+H2
   showed "no header variance" — correct observation, [62] deliberately excluded hero zones, AND
   hero h1/h2 are sized identically by design ([43a/b]), so a banner stack showed zero difference).
   In the hero, "body/lead treatment" = the Header Statement line: the demoted heading takes the
   hero lead's scale and weight — unlike body [62], SIZE moves here, because hero headings are
   size-unified and weight alone wouldn't read at 67px. Type two headings in Banner Content and you
   get the H1 + Header Statement combo automatically. */
.title-section.has-image :is(h1, h2, h3) + :is(h1, h2, h3, h4),
.title-section:is(.bg-dark-blue, .bg-deep-cobalt, .bg-teal, .bg-charcoal, .bg-rich-charcoal, .bg-deep-blue, .bg-blue, .bg-black) :is(h1, h2, h3) + :is(h1, h2, h3, h4) {
  /* [64c] FINAL per Mitch: "headers have a locked size per spec — it's just the colour that changes
     for the secondary heading." The [64]/[64b] size+weight demotion is superseded: the second
     heading keeps its locked size and weight everywhere; COLOUR alone demotes. This rule = dark and
     image banners (secondary -> dark-ground secondary); [64a] below = light banners (grey). */
  color: #c3cbd5;
}
/* [64a] colour: light banners match the lead grey; image banners + dark solid banners are excluded
   so the demoted line inherits the banner text colour (buff/white) exactly like the hero lead does. */
.title-section:not(.has-image):not(.bg-dark-blue):not(.bg-deep-cobalt):not(.bg-teal):not(.bg-charcoal):not(.bg-rich-charcoal):not(.bg-deep-blue):not(.bg-blue):not(.bg-black) :is(h1, h2, h3) + :is(h1, h2, h3, h4) {
  color: #55676e;
}

/* [65] 2026-07-28 nav login dropdown (client nav request: Ask Orion removed from the header global;
   Log In becomes a dropdown — Customer Login / Support Portal / Partner Portal; markup in
   _chunks/header.twig, both desktop + mobile loops). Brand styling for the Bootstrap menu; the
   chevron is Bootstrap's own .dropdown-toggle::after. */
.nav-login-dd .dropdown-menu { border: 1px solid rgba(0, 48, 74, .15); border-radius: 10px; padding: .35rem; min-width: 12.5rem; box-shadow: 0 14px 30px -18px rgba(0, 48, 74, .35); }
.nav-login-dd .dropdown-item { font-size: 1rem; padding: .5rem .85rem; border-radius: 7px; color: #00304A; font-weight: 500; }
.nav-login-dd .dropdown-item:hover, .nav-login-dd .dropdown-item:focus { background: #ece5d5; color: #00304A; }
.nav-login-dd .dropdown-toggle::after { vertical-align: .18em; margin-left: .4em; }
.mobile-cta .nav-login-dd .dropdown-menu { position: static; box-shadow: none; margin-top: .25rem; }

/* [66] 2026-07-28 STACKED HEADINGS SIT TIGHT (Mitch: "even with no breaks/padding in the source it
   looks silly — it should sit normally/relatively tight"). The demotion rules ([62]/[64]) only ever
   changed colour; the ugly part was MARGIN. Measured on the AP banner: H1 margin-bottom 41.9px meets
   H2 margin-top 67px — adjacent margins collapse to the LARGER, so a full 67px of dead space opened
   between two lines meant to read as one headline (body pairs: 28px). Closing both sides lets
   line-height alone space them, exactly like a single wrapped heading.
   :has() is already used in this file (see [46]). */
:is(.title-section, .block-x, .home-intro) :is(h1, h2, h3):has(+ :is(h1, h2, h3, h4)) {
  margin-bottom: 0;
}
:is(.title-section, .block-x, .home-intro) :is(h1, h2, h3) + :is(h1, h2, h3, h4) {
  margin-top: 0;
}

/* [67] 2026-07-28 featuresList "content above" images: centre + fit the boxed pane (Mitch on the
   Orchestrator page: "no real native way to change how it displays"). Diagnosis: CKEditor's resize
   writes `width:100%` onto the FIGURE (641px here) while the <img> keeps its natural size (360px),
   and the figure's text-align is `start` — so the editor's own "align centre" style has nothing
   left to centre and the image pins left with dead space beside it. Centring the IMG (not the
   figure) fixes it for every alignment the editor might set. max-height keeps a tall/large asset
   inside the bordered pane instead of stretching it; object-fit:contain preserves aspect on the
   way down. Applies to the top-content pane of featuresList only. */
.section-featuresList .top-content figure.image {
  text-align: center;
  margin-inline: auto;
}
.section-featuresList .top-content figure.image > img {
  /* [67a] same day: Mitch — "it could take up more real-estate, lots of whitespace around a large
     box". Measured: left tab list 937px vs right column 673px, so there was 264px of unused height
     AND 140px of dead space each side of the image. Now the image fills the pane width (641px here)
     instead of sitting at its natural 360px; for the square placeholder that makes the right column
     ~953px, near-matching the 937px tab list. max-height guards a portrait asset from running away;
     object-fit keeps aspect either way. */
  display: block;
  margin-inline: auto;
  width: 100%;
  max-width: 100%;
  height: auto;
  /* [67b] 70vh let the SQUARE placeholder render 641x641 — the pane got very tall and shoved the
     bullets down without the artwork looking any fuller (Mitch: "too big now ... didn't really fill
     the box"). A square asset can never fill a 16:9-ish pane; capping the height is the honest
     compromise. 400px: placeholder lands ~400x400, pane ~490 tall. A WIDE screenshot (the real
     asset) still fills the full 641 width at its own aspect and is unaffected by this cap. */
  max-height: 400px;
  object-fit: contain;
}
/* [67c] trim the pane's own padding a little so the image gets more of the box (was 30.72px). */
.section-featuresList .blocked.top-content:has(figure.image) {
  padding: 1.25rem;
}

/* [69] 2026-07-28 multiColumn list bullets: plain dot on normal content, Celona mark kept for
   Celona-as-the-solution boxes (Mitch on /data-centers: "are these celona favicon icons hardcoded?
   They don't need to be on Challenge / Operational impact, they can just be dot points. They can
   persist when talking about Celona as the solution like the blue box").
   ANSWER: yes, hardcoded in the theme - styles.css sets
   `.section-multiColumn ul:not(.hs-error-msgs) li:before { font-family:"icomoon"!important;
   content:"\e913" }`, so EVERY list in a multiColumn block gets the Celona mark automatically.
   Two things make this trickier than it looks: the li is `display:flex`, so normal list markers
   (list-style / ::marker) never render - the bullet HAS to be the ::before; and the theme locks the
   icon font with !important, so countering it needs !important too (sanctioned counter-lock case).
   Scoped by ground: dots on plain blocks, icon retained inside dark/branded block-x (the blue
   "Why the Customer Chose..." panel). Blast radius measured across 10 industry pages: 13 list items
   become dots, 6 keep the mark. */
.section-multiColumn .block-x:not(.bg-dark-blue):not(.bg-deep-cobalt):not(.bg-teal):not(.bg-charcoal):not(.bg-rich-charcoal):not(.bg-blue):not(.bg-deep-blue):not(.bg-black) ul:not(.hs-error-msgs):not(.inputs-list) > li {
 /* padding-left: 1.15rem;*/
}
.section-multiColumn .block-x:not(.bg-dark-blue):not(.bg-deep-cobalt):not(.bg-teal):not(.bg-charcoal):not(.bg-rich-charcoal):not(.bg-blue):not(.bg-deep-blue):not(.bg-black) ul:not(.hs-error-msgs):not(.inputs-list) li::before {
/*  content: "•";
  font-family: "DM Sans", sans-serif !important;
  font-size: 1.2em;
  width: auto;
  height: auto;
  left: 0;
  top: 1.15rem;*/
}

/* [70] 2026-07-29 blockColour panels: the NEAREST ground decides the ink (white-on-buff bug).
   Reported on /aerflex: the "On-site hardware comparison" panel rendered a WHITE h2 and a
   #c3cbd5 lead on warm linen (measured rgb(255,255,255) / rgb(195,203,213) on rgb(236,229,213)).
   CAUSE: [44] keys off the SECTION's dark class and guards only against a bg-* on .block-x
   itself, but `blockColour` puts its class on the intermediate .container-xxl.block panel, which
   [44] never inspects. A light padded panel inside a dark band therefore inherited the whole
   dark-band treatment. (The columns in the same block were fine: a column colourPicker DOES put
   bg-* on .block-x, which [44]'s guard catches.)
   WHY NOT A :not() GUARD ON [44], the [57] approach: adding :not(.bg-light-buff *) etc. to [44]
   would also kill the REVERSE nesting, which is legitimate and live on this same page - a
   .bg-dark-blue blockColour panel inside a .bg-light-buff section (block 11225, "Technical product
   video") depends on [44] for its white heading. :not() cannot express "nearest ancestor wins",
   so the ink is re-asserted on the panel instead: the colour class is COMPOUNDED onto .block, so
   this fires only when the padded panel IS the light ground. Specificity 0,4,1 beats [44]'s 0,3,1
   (and 0,5,0 beats [44]'s 0,4,0 for the lead) and it sits later in the file. The reverse case
   never matches (its panel is dark), so it is untouched.
   Grey secondary stays limited to buff/linen/white - the same three grounds [54b]/[56] allow -
   because #55676e fails AA on warm taupe (3.25:1) and light charcoal (3.9:1); on those two the
   lead keeps full ink. DEFAULTS NOT LOCKS: no !important, so editor fontColor and .text-light
   still win. */
:is(.bg-white, .bg-light-buff, .bg-warm-linen, .bg-warm-taupe, .bg-light-charcoal).block .block-x:not([class*="bg-"]) > :is(h1, h2, h3, h4, h5, h6),
:is(.bg-white, .bg-light-buff, .bg-warm-linen, .bg-warm-taupe, .bg-light-charcoal).block .block-x:not([class*="bg-"]) > :is(p, ul, ol) {
  color: #00304A;
}
:is(.bg-white, .bg-light-buff, .bg-warm-linen).block .block-x:not([class*="bg-"]) > .lead {
  color: #55676e;
}

/* [71] 2026-07-29 ICON AUTO-MONO, ALL WRAPPERS - completes [29] (Mitch: "I thought there were
   overlay rules depending on background colour, so if you added dark backgrounds the icons switch
   to white").
   [29] shipped the engine but scoped it to `.icon-wrap.icon-top` - the ONE layout where the icon
   sits above the card title (cards.twig:190). Measured live across 90 pages: 185 icon instances are
   icon-top and auto-recolour correctly, but **107 are a bare `.icon-wrap`** and **5 are `.wrap-icon`**,
   and those got NO filter at all:
     cards.twig:177          col-3 side-icon card layout
     featuresList.twig:32,85 feature icons (left list + panel)
     iconText CK block       .wrap-icon img
   They only look right today because someone hand-picked `*_white_512` variants for the dark bands -
   exactly the manual workaround [29] existed to remove - and they silently break the moment a section's
   background flips (the reverse already bit us: BUILD-LOG "the 5 dark-band placeholder pins render
   ink-on-navy").
   ALSO FIXED HERE: (a) `.bg-charcoal` and `.bg-black` were missing from [29]'s dark list though both are
   in [44]'s, so on those grounds text went white while icons stayed navy; (b) the same nearest-ground
   flaw [70] fixed for text - [29] matches ANY dark ancestor, so a light `blockColour` panel inside a
   dark band would invert its icons to white on a light panel.
   SAFE FOR THE HAND-PICKED WHITE ASSETS: the chain starts with `brightness(0)`, which flattens any
   source colour to black before rebuilding the target - so a white source lands on exactly the same
   result as an ink source (navy on light, white on dark) AND self-corrects if the ground changes.
   Nobody has to re-pick assets.
   BLAST RADIUS MEASURED FIRST: 35 unique assets are newly affected; 33 are pure mono (chroma 0-5),
   1 is faintly blue ink (chroma 20), and 1 is `pillar-4.svg` - a single-colour LIGHT TEAL (#6dc8bf)
   icon used once, on /wi-fi-solutions. That one WILL change from teal to navy. Flagged deliberately:
   if the teal was a design choice, exclude just that instance rather than reverting this section.
   The partner tier medals are not at risk - they render as photo-cards (`.pcardphoto .ph img`, already
   `filter:none` above), not in `.icon-wrap`; the `#pp-badges` guard below is belt-and-braces in case
   they are ever moved back to an icon slot.
   DEFAULTS NOT LOCKS: no !important anywhere. */
:root {
  --icon-mono-ink: brightness(0) saturate(100%) invert(12%) sepia(83%) saturate(1698%) hue-rotate(180deg) brightness(94%) contrast(101%);
  --icon-mono-reverse: brightness(0) invert(1);
}
/* every icon wrapper, light ground = brand navy */
:is(.icon-wrap, .wrap-icon) img {
  filter: var(--icon-mono-ink);
}
/* dark grounds = white/reverse (now incl. charcoal + black) */
:is(.bg-deep-blue, .bg-dark-blue, .bg-blue, .bg-teal, .bg-charcoal, .bg-rich-charcoal, .bg-black, .bg-deep-cobalt) :is(.icon-wrap, .wrap-icon) img {
  filter: var(--icon-mono-reverse);
}
/* nearest ground wins: a light blockColour panel inside a dark band keeps ink icons.
   Specificity 0,3,1 ties [29]'s dark rule and sits later in the file, so it wins. */
:is(.bg-white, .bg-light-buff, .bg-warm-linen, .bg-warm-taupe, .bg-light-charcoal).block :is(.icon-wrap, .wrap-icon) img {
  filter: var(--icon-mono-ink);
}
/* never flatten the coloured tier medals */
#pp-badges .icon-wrap img {
  filter: none;
}

/* [72] 2026-07-29 Table module styling (Mitch: "can the table get styled, maybe white with header
   colour"). Applies to the `table` CK block sitewide via the new `.celona-table` hook that table.twig
   now emits - the module previously inherited Bootstrap's transparent default, so on a Light Buff or
   Warm Linen band the table had no surface of its own and read as loose text in a box.
   Now: WHITE body, DARK BLUE header row, buff header text, hairline navy rules, and a subtle row
   hover. Driven through Bootstrap 5.3's own table custom properties (`--bs-table-bg`,
   `--bs-table-bg-type`, `--bs-table-color-type`) rather than overriding `background-color` on cells -
   BS 5.3 paints cell grounds with an `inset 0 0 0 9999px` box-shadow off `--bs-table-bg-type`, so
   setting the variable is the only way to recolour a row without an !important fight. No !important
   anywhere; the existing `.border.rounded-3.overflow-hidden` wrapper clips the dark header corners.
   Header keeps its `display-6` mono/uppercase treatment - that reads well as a dark band. */
table.celona-table {
  --bs-table-bg: #ffffff;
  --bs-table-color: #00304A;
  --bs-table-border-color: rgba(0, 48, 74, 0.12);
  --bs-table-hover-bg: rgba(0, 48, 74, 0.035);
  --bs-table-hover-color: #00304A;
  margin-bottom: 0;
}
table.celona-table > thead {
  --bs-table-bg-type: #00304A;
  --bs-table-color-type: #f5f3ec;
}
table.celona-table > thead > tr > th {
  border-bottom: 0;
  vertical-align: middle;
}
table.celona-table > tbody > tr:last-child > * {
  border-bottom: 0;
}
table.celona-table :is(th, td) {
  padding: 0.85rem 1rem;
}
table.celona-table > tbody > tr > td {
  /* SANCTIONED COUNTER-LOCK: the theme ships `table tr td { background: transparent !important }`,
     which beats Bootstrap's `--bs-table-bg` variable, so the body could never go white without
     matching the !important. (Measured 2026-07-29: td background-color resolved to rgba(0,0,0,0)
     with the variable correctly set to #ffffff.) Row hover still works - Bootstrap paints that with
     an inset box-shadow, which layers over the background rather than replacing it. */
  background-color: #ffffff !important;
}
/* links in cells need to read as links against a white ground */
table.celona-table td a {
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* [73] 2026-07-29 iconText image icons: un-clip, and make the Icon size field actually do something
   (Mitch on /split-ran: "the icons look like they're being cut off with circles outlines around them").
   The `iconText` CK block wraps its icon in `.wrap-icon.rounded-circle.d-inline-flex.p-3` with
   `overflow:hidden` - a chip built for a FONT GLYPH (`fs-1..fs-5` is a font-size class). Drop an IMAGE
   in and Bootstrap's `border-radius:50%` + `overflow:hidden` clip the square artwork, cutting its
   corners. Measured: wrapper 40x40, radius 50%, overflow hidden, background TRANSPARENT, border 0 -
   so nothing was ever being drawn; the "circle outline" the client saw was the icon's own artwork
   being sliced by the clip.
   FIX NEEDS NO !important: with no background and no border, the radius is invisible, so simply
   restoring `overflow: visible` un-clips it. (Countering `.rounded-circle`'s !important would have
   worked too but is unnecessary - prefer the smaller hammer.)
   Scoped with :has(img) so a Phosphor GLYPH in the same block keeps its circular chip, which is what
   that treatment is for. All 10 instances sitewide (split-ran 5, become-a-partner 3, contact-us 2) are
   image-bearing and were all clipped. */
.wrap-icon:has(img) {
  overflow: visible;
}
/* The Icon size dropdown emits fs-1..fs-5 - a FONT size, so it had no effect on image icons (every one
   rendered at the flat 40px from [1]). Map the field to real dimensions so the CP control works. */
.wrap-icon.fs-1 img { width: 56px; height: 56px; }
.wrap-icon.fs-2 img { width: 48px; height: 48px; }
.wrap-icon.fs-3 img { width: 40px; height: 40px; }
.wrap-icon.fs-4 img { width: 32px; height: 32px; }
.wrap-icon.fs-5 img { width: 28px; height: 28px; }


/* [74] iconText items stacked in a column need separation between them.
   CKEditor strips the style attribute from headings inside iconContent, so this cannot be
   done inline - see docs/celona-spacing-standard.md. Adjacent-sibling only, no !important,
   so it is a default a block can still override. */
.block-x > .row.align-items-start ~ .row.align-items-start{padding-top:34px}


/* [75] lean card images: collapse the dead space between image and title.
   The lean image renders 21:9 but three stacked paddings leave a ~74px hole under it:
   img margin-bottom 20px + .card-image-top padding-bottom 21.6px + .card-body padding-top 36px.
   Scoped to .cards-img-lean and to cards that HAVE an image block. No !important. */
.cards-img-lean .card-image-top .card-image{margin-bottom:0}
.cards-img-lean .card-image-top + div .card-body{padding-top:14px}


/* [76] buttons follow the iconText indent. A Hyper buttons block (.my-3) rendered after
   iconText rows in the same CK column starts at the column edge while the item copy is
   indented past the 71px icon column - links looked left-detached from their item.
   iconContent allows no nested entries, so the link cannot live inside the item. */
.block-x > .row.align-items-start ~ .my-3{margin-left:63px}


/* [77] cards-module heading alignment. The cards module indents its sectionContent 50px
   (.block-x padding-left) for the dash-lead motif. A heading + line intro should align with
   the card faces instead. Scoped to content that starts with an h2 so dash-leads elsewhere
   keep their indent. */
/* 2026-08-05 mobile-sweep fix: the pull must track block-x's ACTUAL inset per breakpoint
   (50px >=1200, 30px 992-1199, 0 below). The original unconditional -50px dragged these headings
   ~35px off the LEFT viewport edge on phones - clipped first characters on every line - across
   about-us, frequency, partnerprograms, plant-operations, industries-overview and more. Left-side
   clipping never inflates scrollWidth, which is how it survived the automated overflow audit. */
@media (min-width:1200px){
  .section-cards .block-x > h2{margin-left:-50px}
  .section-cards .block-x > h2 ~ p{margin-left:-50px}
}
@media (min-width:992px) and (max-width:1199.98px){
  .section-cards .block-x > h2{margin-left:-30px}
  .section-cards .block-x > h2 ~ p{margin-left:-30px}
}


/* [78] AerLoc comparison table (#aerloc-compare, block 36615). Column headers sit proud of
   the rows and the Celona column is highlighted. Scoped by sectionID - no other table moves. */
#aerloc-compare table th{font-size:17px;padding-top:18px;padding-bottom:18px}
#aerloc-compare table th:nth-child(n+2){text-align:center}
#aerloc-compare table th:last-child{box-shadow:inset 0 0 0 9999px #5aa7a0;color:#00304a}
#aerloc-compare table td:last-child{--bs-table-bg:rgba(90,167,160,.14);box-shadow:inset 0 0 0 9999px rgba(90,167,160,.14);font-weight:600;color:#00304a}


/* [79] Wi-Fi solutions comparison table (#wifi-compare) - same treatment as [78]. */
#wifi-compare table th{font-size:17px;padding-top:18px;padding-bottom:18px}
#wifi-compare table th:nth-child(n+2){text-align:center}
#wifi-compare table th:last-child{box-shadow:inset 0 0 0 9999px #5aa7a0;color:#00304a}
#wifi-compare table td:last-child{--bs-table-bg:rgba(90,167,160,.14);box-shadow:inset 0 0 0 9999px rgba(90,167,160,.14);font-weight:600;color:#00304a}

/* [80] 2026-07-30 LEGAL DOCUMENT indent ladder + CK-native tables.
   (Numbered 80 because a concurrent session took 74-79 while this was being built - taken from the
   LIVE file at upload time, per the concurrency rule.)
   /legal clones the Webflow legal page, whose clause hierarchy is carried entirely by padding-left on
   Webflow classes (.sub-point-title 18px / .sub-point 44px / .sub-sub-point 71px /
   .sub-subs-sub-point 110px - all at left:0 with no bullet glyphs; the numbering is literal bold text).
   Reproduced as prefixed classes so nothing collides with theme utilities - the source also used
   `mt-40`, which IS a margin utility name here, deliberately not reused.
   Indents in rem to hold the source's absolute ladder; clause headings pulled back from the theme's
   h4 scale (24px) toward the source's 16/18px so a 2-step hierarchy still reads against 1.2rem body
   copy. Halved below 768px so deep clauses don't strand text on phones. */
.legal-clause { padding-left: 0; margin-top: 2.25rem; }
.legal-subclause { padding-left: 1.125rem; margin-top: 1.5rem; }
.legal-p1 { padding-left: 2.75rem; }
.legal-p2 { padding-left: 4.4375rem; }
.legal-p3 { padding-left: 6.875rem; }
h4.legal-clause { font-size: 1.35rem; line-height: 1.4; }
h4.legal-subclause { font-size: 1.2rem; line-height: 1.4; }
@media (max-width: 767.98px) {
  .legal-subclause { padding-left: 0.5rem; }
  .legal-p1 { padding-left: 1.25rem; }
  .legal-p2 { padding-left: 2rem; }
  .legal-p3 { padding-left: 3rem; }
}
/* CKEditor-native tables (figure.table) get the [72] table treatment. The legal doc carries two, and
   there were no CK-native tables anywhere on the site before, so this is a safe forward default. */
.block-x figure.table { overflow-x: auto; margin: 1.5rem 0; }
.block-x figure.table > table {
  --bs-table-bg: #ffffff;
  --bs-table-color: #00304A;
  --bs-table-border-color: rgba(0, 48, 74, 0.12);
  width: 100%;
  border-collapse: collapse;
}
.block-x figure.table > table :is(th, td) {
  padding: 0.85rem 1rem;
  border: 1px solid rgba(0, 48, 74, 0.12);
  background-color: #ffffff;
  vertical-align: top;
}
/* Header row scoped to THEAD only. `tr:first-child` also matched tbody's first row (it is the
   first child of tbody), which painted the first data row buff-on-white and made it unreadable -
   caught on /legal's severity table. The tbody counter-lock below is the same sanctioned case as
   [72]: the theme ships `table tr td { background: transparent !important }`. */
.block-x figure.table > table > tbody > tr > td {
  background-color: #ffffff !important;
}
.block-x figure.table > table > thead > tr :is(th, td) {
  background-color: #00304A;
  color: #f5f3ec;
  font-weight: 700;
  border-color: #00304A;
}


/* [81] adjacent underline links in one buttons block sat flush - give them a gap. */
.my-3 .btn-link + .btn-link{margin-left:24px}


/* [82] featuresList on Warm Linen: long item titles wrapped 5 lines at the default 50/50
   split - widen the list column to 7/5. Scoped by band colour; the dark reference builds
   (5G LAN, Wi-Fi APs) keep their 50/50.
   AMENDED 2026-07-31 (see [85]): gated at >=768px. Left unconditional these widths also
   applied BELOW md - where .col-md-6 is meant to be 100% - so the panel column was pinned to
   41.667% of the VIEWPORT: 130px inside a 375px phone, the whole accordion squeezed into a
   third of the screen. Was live on all three warm-linen featuresList blocks (home 27823,
   /wi-fi-solutions 26843, /enterprise-wireless 37719). Desktop behaviour unchanged. */
@media (min-width:768px){
  .section-featuresList.bg-warm-linen .d-none.d-md-block.col-md-6{width:58.333%}
  .section-featuresList.bg-warm-linen .col-md-6.px-md-0{width:41.667%}
}

/* [83] 2026-07-30 /learn-more finishing rules (QR landing page, mobile-critical).
   Numbered [83] - a concurrent session took 74-82 while this page was being built; taken from the
   LIVE file at upload time, per the concurrency rule.

   (a) LIGHT CARD ON A DARK BAND was inverting its icon to white-on-white. [71] recolours icons from
   the nearest DARK ancestor, and a `cardColour` White card inside a Dark Blue band still has that dark
   section as an ancestor - so the TCO / contact-us icons vanished entirely. Same class of bug [70]
   fixed for text and [71] fixed for blockColour panels; this closes it for CARDS. Nearest ground wins:
   the colour class is compounded onto `.card`, so it only fires when the CARD is the light ground.

   (b) Case-study industry list in two columns - nine industries is a long single column on a page
   whose whole job is a fast scan after a QR hit. Collapses to one column on phones.

   (c) Frequency lockup pinned bottom-right inside each partner card. Targeted via the logo's own src
   so it needs no class that CKEditor could strip on a re-save. The card gets bottom padding so the
   mark can never collide with the button above it. NB the only Frequency lockup in Craft is the
   REVERSE (white) version, which is why those cards are Dark Blue. */
:is(.card.bg-white, .card.bg-light-buff, .card.bg-warm-linen, .card.bg-light-charcoal, .card.bg-warm-taupe) :is(.icon-wrap, .wrap-icon) img {
  filter: var(--icon-mono-ink);
}
#case-study-industries .block-x ul {
  column-count: 2;
  column-gap: 2.5rem;
}
#case-study-industries .block-x ul > li {
  break-inside: avoid;
}
@media (max-width: 575.98px) {
  #case-study-industries .block-x ul { column-count: 1; }
}
#frequency-programs .card {
  position: relative;
  padding-bottom: 5.5rem;
}
#frequency-programs .card figure:has(img[src*="celona-frequency-logo"]) {
  position: absolute;
  right: 1.5rem;
  bottom: 1.25rem;
  width: 165px;
  margin: 0;
}

/* [84] EdgeOS "Deployment options" (#edgeos-deployment) - card image aligned to its text column.
   Cause: .card-image-top has 21.6px horizontal padding while .card-body has 36px, so the image box
   was 14.4px wider than the copy on each side and the artwork hung past the text below it.
   Client note 2026-07-31: "images now look off-center relative to the text below - align each image
   with its text column."
   Scoped to this one section by design: on boxed cards (cardColour set) the image SHOULD bleed to
   the card edge, so this must not go sitewide. No !important - the id selector already outranks the
   theme's .card-image-top rule. */
#edgeos-deployment .card-image-top{padding-left:36px;padding-right:36px;}

/* [85] 2026-07-31 Home "Platform" section (featuresList block 27823) - bigger media panel at the
   same page depth. Client via Mitch: "are we able to enlarge the panel on the right (making it
   both taller and wider)... there is room to move the image box up so we don't make the page
   deeper." The platform variant is ONE block sitewide (home 27823 - verified by querying every
   featuresList for the platformStyle lightswitch), so .feature-platform is a safe scope; nothing
   else on the site moves.

   (a) WIDER, graded by breakpoint so the list titles never wrap. >=1400px: 50/50, taking back the
       width [82] gave the list (panel 500 -> 600 at 1440). 1200-1399px: 54/46. Below 1200 the
       split is left at [82]'s 7/5 - measured, anything wider there wraps "For the enterprise, on
       their terms" onto a second line, which is the exact defect [82] was fixing.
   (b) TALLER: [39b]'s fixed media frame goes 16:10 -> 3:2. Taller per unit width, and 3:2 is the
       AP21 render's native ratio (2560x1706) so the product stops being cropped at all.
       Panel 385 -> 473 tall at 1440, media frame 311 -> 399.
   (c) The growth is absorbed UPWARDS, not downwards. The heading band above ("/ The platform" +
       "Celona Orion") is empty to the right of the headline, so the panel column lifts by what it
       gained: section depth measured 489px before AND after at 1440, page height 4864px both.
       The lift stays inside the measured headroom to the h2 (88px at 1440, 84 at 1300) so the
       panel top lands level with the headline, never above it.

   ⚠ 2026-08-06: the "ONE block sitewide" premise above EXPIRED. The pricing estimator (44177) was
   built with platformStyle ON and inherited all of this - the -88px lift pulled its 531px chart up
   behind the band above and clipped the chart title. Fixed by turning platformStyle OFF on 44177,
   not by adding overrides. Re-check this claim before relying on it: query featuresList for the
   platformStyle lightswitch. Home 27823 is the only holder again as of today.

   Specificity is deliberate, not order-dependent: [82]'s list selector is (0,5,0) and its panel
   selector (0,4,0); routing through .feature-tabs-outer makes these (0,6,0) and (0,5,0).

   DEPENDS ON the two bands sharing a colour - the panel now overlaps the section above it. Both
   are Warm Linen today. If either Background Colour changes, revisit (c). */
@media (min-width:1200px){
  .feature-platform .feature-tabs-outer .feature-tabs .d-none.d-md-block.col-md-6{width:54%}
  .feature-platform .feature-tabs-outer .feature-tabs .col-md-6.px-md-0{width:46%;margin-top:-48px}
}
@media (min-width:1400px){
  .feature-platform .feature-tabs-outer .feature-tabs .d-none.d-md-block.col-md-6{width:50%}
  .feature-platform .feature-tabs-outer .feature-tabs .col-md-6.px-md-0{width:50%;margin-top:-88px}
}
.feature-platform .accordion-body figure.image,
.feature-platform .accordion-body video{aspect-ratio:3/2}

/* [86] Split RAN "Features & benefits" (#split-ran-features) - bullet lists aligned across each row.
   Cause: .card-title has no min-height, so a ONE-line heading starts its bullet list a full
   line-height (30.8px) higher than its two-line row-mates. Measured: row 1 "Expanded spectrum" list
   began at y2409 against y2440 for its neighbours; row 2 "Deterministic performance" began at y2789
   against y2758. The headings themselves were already level - it is the lists that broke.
   Client note 2026-07-30 16:59: "Heading & bullet point alignment issue across the feature cards."
   Reserving two lines of heading space puts every list on a common baseline (and squares up the two
   rows, which differed 333px vs 304px). em fallback first for browsers without the lh unit.
   Scoped: there are 9 .card-title on this page alone, so a global rule would move the Get started and
   Product portfolio cards too. No !important - the id selector already outranks .card-title. */
#split-ran-features .card-title{min-height:2.2em;min-height:2lh;}

/* [87] 2026-07-31 AerConnect "How it works" numbered steps (#aerconnect-how-steps, block 36061) -
   the 3-across step row. Client note 2026-07-30 17:56: "Unable to get the numbered steps
   horizontally oriented - they're stacking vertically; they should lay out horizontally."

   The stacking itself was CONTENT, not CSS: all three steps had been authored as a single rich-text
   blob (with <hr> rules between them) inside ONE width-3 column, so they could only ever stack.
   Fixed in the CP - three width-4 columns, one step each, plus Vertical align columns =
   align-items-start. Three earlier disabled attempts were left untouched as revert paths
   (cols 35746/35747/35748 on block 35742, and col 36064 here).

   This rule handles what that exposed: the theme's .block-x carries a 50px side inset, which is
   right for a wide w10/w12 column but eats 100px of a 435px third-width column. The copy wrapped at
   305px, so steps 02 and 03 ran to two lines while 01 stayed on one - unequal column heights, and
   with align-items-center the "01" eyebrow sat 14px below "02"/"03". Dropping only the RIGHT inset
   gives 355px, which puts all three bodies on one line and squares the columns up (all 122px).
   The LEFT inset is kept so the steps stay flush with the narrative column above them.
   >=992px only: below that the columns are col-12 and stack full-width, where the theme's
   symmetric inset is correct. Scoped by the sectionID anchor - .block-x is sitewide. */
@media (min-width:992px){
  #aerconnect-how-steps .block-x{padding-right:0}
}

/* [88] Wi-Fi access points "Typical use cases" (#wifi-use-cases) - body copy aligned across the cards.
   Same defect as [86] on Split RAN: .card-title has no min-height, so a one-line heading pulls its body
   paragraph a full line-height (30.8px) above its two-line neighbours.
   ⚠ ONLY REPRODUCES AT >=1728px VIEWPORT. At 1366-1600 all four headings wrap to two lines and the row
   is already aligned; from 1728 up "Industrial operations" and "Large industrial sites" fit on one line
   while "Robotics & AGVs/AMRs" and "Enterprise & public venues" still wrap - body tops 2437 vs 2467.
   Measured at 1366/1440/1536/1600/1728/1920/2560. Test wide before calling this class of bug fixed.
   Client note 2026-07-30 14:44: "The body text doesn't align across the cards because the headings are
   1 line in some cases and 2 lines in others."
   Reserving two lines of heading space aligns every width. Scoped - this page also has Product
   portfolio and Get started card grids that must not move. */
#wifi-use-cases .card-title{min-height:2.2em;min-height:2lh;}

/* [89] "Header Statement 2" (.lead-2) - a regular-weight size step between Header Statement and body.
   Added 2026-08-01 at Mitch's request; client asked for ~24-26px NOT bolded.
   The gap was real and measured: the Styles dropdown ran 30.3px (.lead) straight down to
   the 18px mono labels, and the only 24px options were h4/h5 at weight 700/600.
   Paired CKEditor entry: config/ckeditor/default.json -> "Header Statement 2" -> p.lead-2,
   listed immediately after "Header Statement" so the family reads together.
   Colour deliberately NOT set: inherits the section's automatic by-background colour, so it
   stays ink on light bands and lightens on dark ones without touching the [44]/[56]/[57]
   dark-band guards. No margin-top - the theme locks that with !important; bottom margin only.
   Computed: 25px @1536 / 24.6 @1440 / 23.7 @1280 / 20.6 @768 / 18.4px floor. */
.lead-2{font-size:clamp(1.15rem, 1rem + 0.6vw, 1.5625rem);font-weight:400;line-height:1.35;letter-spacing:-0.01em;margin-bottom:0.6em;}

/* [90] Starlink integration "What makes it different" (#starlink-differentiators) - bullet lists
   aligned across the 3-column icon run. Same defect as [86] Split RAN and [88] Wi-Fi APs: the item
   heading has no min-height, so "One console for the whole site" wraps to two lines while
   "WAN-aware operations" and "Live in hours" do not, dropping its bullets a line lower.
   Fixed at build time rather than waiting for it to come back as a review note.
   These are iconText items, not cards, so the selector targets the heading inside iconContent.
   em fallback first for browsers without the lh unit. */
#starlink-differentiators h3{min-height:2.2em;min-height:2lh;}


/* [91] HubSpot form field rhythm - restore [5] against a theme regression.
   styles.css (dev rebuild, 2026-08-03 11:07) added
   `.hs-form-field { margin-bottom: 0px !important; }`, which crushed the
   field spacing on EVERY legacy HubSpot form sitewide (found on /contact-us).
   Sanctioned counter-lock of a theme !important; remove if the dev drops
   the zero-margin rule from styles.css. (2026-08-03) */
.hs-form .hs-form-field { margin-bottom: 1.1rem !important; }

/* [92] About us "Momentum" (#about-momentum) - heading aligned to the metric row.
   Cause: multiColumn.twig line 86 applies the theme's text-well class .block-x only when
   `colWidth > 4`. The heading column is cw12 so it gets .block-x's 50px inline padding; the four
   metric panels are cw3 so they get none. Measured: h2 at x125, "7+" at x75.
   Mixing wide and narrow columns in one multiColumn always splits them like this.
   Aligning the HEADING down to the metrics rather than indenting the metrics up: the supplied
   graphic shows the stat row spanning the full band, and adding 50px to each of four narrow columns
   would push the captions into extra line wraps.
   Scoped - the heading column is the only .block-x inside this block. No !important needed; the id
   selector outranks the theme's .block-x rule. */
#about-momentum .block-x{padding-left:0;padding-right:0;}

/* [93] About us "Team" (#about-team) - headshot cards restyled to the supplied aesthetic
   (photo in a white rounded panel, Founder pill straddling the photo's bottom edge, name + role
   below on the band). Considered and REJECTED a new entry type for this: the supplied look is pure
   presentation over the standard card markup, one page uses it, and the existing namePhoto CK block
   is a different pattern (circular b/w speaker chip). If teams/headshots spread to more pages,
   promote this to a proper module then.
   Pill overlap itself is inline in each card's contentField (margin -46px); this section supplies
   what inline styles cannot reach - the image wrapper. */
/* Mitch 2026-08-03 final: the photo IS the box - no inner padding, no visible white frame. */
#about-team .card-image-top{background:#ffffff;border-radius:14px;padding:0;max-width:220px;overflow:hidden;}
/* text lives in the full-width card body (36px side padding), so 'center'/'left' referenced the
   CARD, not the photo panel - pill sat right of the panel centre and the name was indented.
   Constrain the body to the panel's own box so both align to the concept. */
#about-team .card-body{max-width:220px;padding-left:0;padding-right:0;padding-top:0;}
#about-team .card-title:empty{display:none;}
#about-team .card-body h3{margin-top:0;}
#about-team .card-image-top img.card-image{border-radius:10px 10px 0 0;display:block;margin-bottom:0;width:100%;}
/* the theme gives the card image a 20px bottom margin and wraps it in a .mb-3 div - both sit
   INSIDE the white panel, which is the whitespace under the shoulders */
/* .mb-3 is a Bootstrap utility (= !important), so the counter-lock is the sanctioned exception.
   .ph-wrapper forces aspect-ratio 4/3 on the image box - square headshots never fit it. */
#about-team .card-image-top > div{margin-bottom:0 !important;}
#about-team .ph-wrapper{aspect-ratio:auto !important;height:auto !important;margin-bottom:0;}
#about-team .card-image-top::after{content:none;} /* the theme's 56x1px dash, same kill as #pp-tiles */
/* Pill straddles the photo panel's bottom edge. CKEditor STRIPS position/top/z-index from inline
   styles (verified: only text-align and margin-bottom survived the save), so the offset must live
   here. Applies to the founders' pill AND the hidden spacer p on non-founder cards, keeping every
   name on the same baseline. margin-bottom:-42px stays inline (margins survive the sanitiser;
   note the theme locks margin-TOP with !important, which is why top is used, not a negative margin). */
#about-team .card-body p:first-child{position:relative;top:-15px;z-index:2;}
/* CTA pair needs air between the pills */
#about-cta .btn{margin:0 8px 8px;}


/* [94] lead-2 renders when chosen - everywhere (client via dev, added Fri;
   client re-confirmed 2026-08-03). Bare .lead-2 (0,1,0) loses to stronger
   module/column paragraph sizing in some contexts and collapses to body
   19.2px (found in multiColumn .block-x columns - the same text-well class
   [92] documents; EdgeOS contexts render it fine). An editor-chosen dropdown
   style must be authoritative, so the four type props are locked. NO colour:
   that stays with the band automation (EdgeOS renders band-ink today and
   must not change). Also makes STACKED picker styles deterministic - when
   CK leaves two ticked (p.lead.lead-2), lead-2 wins the size instead of
   skewing. Values = the dev's Friday lead-2 rule, unchanged. */
p.lead-2, .lead-2 {
  font-size: clamp(1.15rem, 1rem + 0.6vw, 1.5625rem) !important;
  font-weight: 400 !important;
  line-height: 1.35 !important;
  letter-spacing: -0.01em !important;
}

/* [95] Trivial breadcrumb trails hidden sitewide (Mitch 2026-08-03, "switch of breadcrumbs").
   There is NO native hide-breadcrumbs control: the bar is hardcoded per entry template
   (generalContent.twig renders section.breadcrumbs-wrap unconditionally) and the only lever is the
   redirect type's menuGroup switch, which removes a crumb ITEM (_breadcrumbs.twig:55) but leaves the
   bar. Completing that mechanism in CSS: when a trail has no intermediate crumb left - fewer than
   3 <li>, i.e. just "Home > This page" - the bar says nothing, so hide the whole band.
   Counting is expressible in pure CSS via :has(), no shared-template edit needed.
   Effect: /about-us (Company menuGroup'd), Platform children (Platform menuGroup'd) and level-1
   pages lose the redundant bar; real trails (Solutions > Manufacturing...) keep it. JSON-LD
   breadcrumb schema is emitted template-side and is unaffected. */
/* NB: :has() cannot nest inside :has() - the first cut of this rule was silently invalid. */
section.breadcrumbs-wrap:not(:has(.breadcrumbs li:nth-child(3))){display:none;}

/* [96] 2026-08-04 Customer-badge tiles in logo strips (Mitch: generic can't-name-them customer
   badges - "Fortune 100 / World's leading EV maker" etc. - are illegible at standard logo size).
   GLOBAL treatment keyed on the ASSET FOLDER: the Customer-Badges/ path survives into every
   transform URL, so any image served from that folder is targeted via [src*=] - no renaming,
   no CP field, no per-page CSS. Drop future badge assets into Customer-Badges/ and they inherit
   this automatically; real logomarks stay in Content/Logos/ and keep the theme sizing
   (styles.css caps logo imgs at 150px / width 80% / opacity .8; slides at
   --f-carousel-slide-width 14.2%->25%->33%).
   Badge slides take 1.5x the theme slide width by multiplying the theme's own variable, so the
   responsive steps carry through untouched; the badge img gets the slide's full run, a higher cap,
   and full opacity for text legibility. Covers gallerySection logo carousels (.f-logoCarousel),
   the logoListing module (.f-logo / .f-logo-static) and tiled logo listings (.logo-listing).
   Paired with gallerySection.twig logo transform 200x120 -> 400x240 (same pass, see
   CELONA-THEME-CHANGELOG) so enlarged badge text stays crisp on retina. */
.f-logo .f-carousel__slide:has(img[src*="Customer-Badges"]),
.f-logoCarousel .f-carousel__slide:has(img[src*="Customer-Badges"]),
.f-logo-static .f-carousel__slide:has(img[src*="Customer-Badges"]){
  width: calc(var(--f-carousel-slide-width, 14.2%) * 1.5);
}
.f-logo .f-carousel__slide img[src*="Customer-Badges"],
.f-logoCarousel .f-carousel__slide img[src*="Customer-Badges"],
.f-logo-static .f-carousel__slide img[src*="Customer-Badges"]{
  width: 94%;
  max-width: 260px;
  opacity: 1;
}
.logo-listing img[src*="Customer-Badges"]{
  max-width: 260px;
  opacity: 1;
}

/* [97] 2026-08-04 Resources listing (/resources, resourceFilters grid) - client aesthetic round:
   uniform cards + type pill + Multi-industry (Mitch, via screenshot spec).
   - Cards uniform: image locked to the 1200x620 crop ratio; body is a flex column with the meta
     row pinned to the bottom, so every card in a row closes at the same line.
   - Text truncates with a stop/fade, NOT a "learn more": title clamps at 3 lines; intro occupies
     a FIXED 4-line well (6.2em) and clamps there, with a mask fade over the tail of the well -
     short intros never fade (the fade zone is below where 3 lines end), long intros dissolve out.
   - Meta row: industry as quiet teal mono text bottom-left ("Multi-industry" when several tagged,
     per template logic), resource type as THE one teal pill bottom-right (white text) - single
     pill by design, client asked for cohesion without multiple bubbles.
   Companion template change: resourceFilters.twig (card body + Search Resource labels).
   Default navy type-tiles live in assets/Resource-Defaults (42264-42272). */
.grid-resources .card{display:flex;flex-direction:column;}
.grid-resources .card-image img{width:100%;aspect-ratio:1200/620;object-fit:cover;}
/* [97b] square/portrait product shots: whole device visible on a white stage (server-side
   letterbox fill is ignored by the image pipeline - bars came out black - so containment is
   done client-side; template adds .rc-contain below a 1.4 source ratio) */
.grid-resources .card-image img.rc-contain{object-fit:contain;background:#fff;padding:4% 6%;}
.grid-resources .rc-title{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden;height:3.9em;line-height:1.3;}
/* [97a] title well fixed at 3 lines so masonry cards close uniformly; Multi-industry never wraps */
.grid-resources .rc-intro{height:6.2em;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4;overflow:hidden;margin-bottom:0;
  -webkit-mask-image:linear-gradient(180deg,#000 68%,transparent 97%);mask-image:linear-gradient(180deg,#000 68%,transparent 97%);}
.grid-resources .rc-intro p{margin:0 0 .4rem;}
.grid-resources .rc-industry{font-size:.72rem;letter-spacing:.02em;white-space:nowrap;}
.grid-resources .rc-pill{background:#5aa7a0;color:#fff;border-radius:999px;padding:.2rem .6rem;
  font-size:.68rem;font-family:'Roboto Mono',monospace;white-space:nowrap;line-height:1.2;}
.grid-resources .rc-meta{flex-wrap:nowrap;gap:.4rem;}

/* [98] Pricing configurator tabs (#configurator-tabs) - the "adapted module" treatment Mitch approved
   from the v2 artifact (dd1df10d). The eyebrow field carries the "/ TAB 0n" numbering natively; this
   section supplies only the pill states: quiet default, white card + teal border when active.
   Scoped to this tabsSection - /orion and /aerloc keep the stock look. Selector notes: the module
   renders tab buttons as .nav-link inside the section; active = .active (Bootstrap tabs). */
/* measured: tabs are .tab-card divs; ACTIVE = the one WITHOUT .collapsed (aria-selected=true),
   and the THEME DIMS THE ACTIVE CARD to opacity .5 - the exact inversion of what a tab bar should do.
   First cut used .nav-link.active, which never matches this module. */
#configurator-tabs .nav-link.tab-card{opacity:.7;background:transparent;}
/* counter-locks: the theme dims the active card with a later rule, and .bg-light-buff is a
   Bootstrap-style utility (= !important), so the active state needs both locks. Idle stays soft. */
#configurator-tabs .nav-link.tab-card:not(.collapsed){opacity:1!important;background-color:#ffffff!important;box-shadow:0 1px 0 rgba(0,48,74,.08);}
#configurator-tabs .accordion-header.tab-card{opacity:.85;}
#configurator-tabs .accordion-header.tab-card:not(.collapsed){opacity:1!important;background-color:#ffffff!important;}
/* Constant depth: the client dislikes the page moving when tabs switch. Pinning the PANE WRAPPER
   (not the panes) to the tallest panel's height (tab 1, measured 664px compacted) means switching -
   and even Bootstrap's collapse-on-active-click quirk - never changes where the tool below sits.
   Desktop only: the mobile accordion stacks and must keep natural heights. */
@media (min-width:768px){#configurator-tabs .tab-content{min-height:664px;}}

/* [99] W021 Plant operations persona (/plant-operations) - 2026-08-04
   multiColumn.twig only adds .block-x horizontal padding when colWidth > 4, so the wide intro and
   closing columns sit inboard of the cw3 icon runs. Zero it for these bands so every left edge in
   the section lines up. Card titles run 1-3 lines; pin a floor so body copy starts on the same
   line across each grid (same treatment as [86]/[88]/[90]). */
#plant-blind-spots .block-x,
#plant-answer .block-x,
#plant-decision .block-x,
#plant-cta .block-x{padding-left:0;padding-right:0;}
/* left rule indented the callout text to x=89, aligning with nothing; a top rule keeps the
   copy on the section's left edge. Application headings run 1-2 lines - pin a floor so their
   body copy starts on the same line (the .col child selector excludes the callouts). */
#plant-answer .plant-callout{border-top:3px solid #5aa7a0;}
#plant-answer .col > h3{min-height:2.2em;min-height:2lh;}
/* Titles are read ACROSS in the feature and action grids, so pin a floor there (measured:
   features run 1-2 lines, actions 2-3). The resource grid is a listing read DOWN and its
   publication names run 2-5 lines - a floor there would only add blank space. */
#plant-features .card-title{min-height:2.2em;min-height:2lh;}
#plant-actions .card-title{min-height:2.2em;min-height:3lh;}

/* [100] Newsroom (/newsroom) - plain dated list, replacing the 3-up card grid - 2026-08-04
   Client call: replicate the celona.io press-release layout, "simple text". sectionListing has no
   sectionID field, so the hook is the template's own `.section-news` class (the news branch of
   sectionListing); it is the only news listing on the site. The tile markup is reused untouched -
   the date/heading/excerpt are placed by explicit grid areas, so DOM order (h3, p, hr, date)
   does not matter and no template change is needed. */
.section-news .article{flex:0 0 100%;max-width:100%;}
.section-news .img-wrap{display:none;}
.section-news .article-tile{background:transparent;border:0;border-radius:0;box-shadow:none;padding:0;}
.section-news .article-link{display:block;height:auto;padding:0;background:transparent;border:0;}
.section-news .article-link-inner{display:grid;grid-template-columns:130px minmax(0,1fr);
  column-gap:28px;row-gap:3px;padding:19px 0;border-top:1px solid rgba(0,48,74,.13);}
.section-news .article:last-of-type .article-link-inner{border-bottom:1px solid rgba(0,48,74,.13);}
.section-news .article-link-inner > h3{grid-area:1/2;font-size:19px;line-height:1.32;margin:0;}
.section-news .article-link-inner > p:not(.date){grid-area:2/2;margin:0;font-size:15px;}
.section-news .article-link-inner > .date{grid-area:1/1;margin:0;padding-top:2px;
  font-family:'Roboto Mono',monospace;font-size:13px;font-variant-numeric:tabular-nums;white-space:nowrap;}
.section-news .article-link-inner > .date .icon-calendar2{display:none;}
.section-news .article-link-inner > hr{display:none;}
.section-news .article-tile a:hover .article-link-inner > h3{text-decoration:underline;}
/* the news category group still holds only Craft's demo terms (Design / Web development) -
   hide the filter until a real taxonomy exists, then delete this one rule */
.section-news .news-categories{display:none !important;}  /* counter-locks Bootstrap's
   .d-flex utility, which is !important - the sanctioned exception, not a field-driven property */
@media (max-width:575px){
  .section-news .article-link-inner{grid-template-columns:minmax(0,1fr);row-gap:5px;}
  .section-news .article-link-inner > h3{grid-area:auto;}
  .section-news .article-link-inner > p:not(.date){grid-area:auto;}
  .section-news .article-link-inner > .date{grid-area:auto;order:-1;}
}

/* [101] News entry headlines - drop off the page-title scale - 2026-08-04
   Page titles are upscaled in `.section-title-intro` ([43a/b]), which suits a short page name but not a
   press-release headline: measured 67px @1536, 74px @1920, and 48px over NINE lines (400px tall) at
   390px. Press release titles run to 147 chars, so they get their own step: 28px mobile -> 40px capped.
   Scope is `:has(.news-detail)` - that row is printed only by _entrytypes/news.twig, so the Newsroom
   listing page's own h1 is untouched. The lead drops to the [89] 25px step so the headline still leads
   it (40/25 rather than 40/30). Specificity 0,2,1 beats the theme's 0,1,1 - no !important needed. */
.section-title:has(.news-detail) h1,
.section-title-intro:has(.news-detail) h1{
  font-size:clamp(1.75rem, 1.25rem + 1.6vw, 2.5rem);
  line-height:1.15;
  text-wrap:balance;
}
.section-title:has(.news-detail) .lead,
.section-title-intro:has(.news-detail) .lead{
  font-size:clamp(1.15rem, 1rem + 0.6vw, 1.5625rem);
}

/* [102] News pages: white ground, tighter hero-to-body gap, left-aligned date - 2026-08-04
   Global for news, per Mitch. Hooks: `:has(.news-detail)` = a news ENTRY (that row is printed only by
   _entrytypes/news.twig); `:has(.section-news)` = the Newsroom listing. Single-level :has only - it
   cannot nest.
   1. WHITE GROUND. The buff is painted by `.site-wrap` (#f5f3ec), not by any section - every section on
      a news page is transparent - so the wrapper is the only place to change it.
   2. DEAD SPACE. Measured 124px between the "Posted" row and the first body line: hero
      `margin-bottom:44px` + the body section's `padding-top:80px` (pt-md-6). Now ~40px total.
      Both are utility-class values carrying !important, so these counter-lock them - the sanctioned
      exception, not a field-driven property.
   3. The date row is `text-center` while the title, lead and body are all left-aligned. Left-aligns it. */
.site-wrap:has(.news-detail),
.site-wrap:has(.section-news){background-color:#ffffff;}

.section-title:has(.news-detail){margin-bottom:0 !important;}
.section-title:has(.news-detail) + section{padding-top:40px !important;}

.news-detail p{margin-bottom:0;}

/* [103] News entries: centred header, white ground enforced, prev/next band - 2026-08-04
   Mitch: "alignment issues jarring - I'd be inclined to centre anything above the line."
   Root cause of the jarring edges: the hero sits in `.container > .col-md-11.col-xl-10` while the body
   block sits in `.container-xxl` at sectionWidth 10, so their left edges never agreed. Centring the
   header removes the mismatch instead of chasing it - and it matches the template's own intent, since
   `.news-detail` was already `text-center`. Everything BELOW the rule stays left-aligned. */
.section-title:has(.news-detail) h1,
.section-title:has(.news-detail) .lead{text-align:center;}
.section-title:has(.news-detail) .lead{margin-left:auto;margin-right:auto;max-width:52ch;}
.section-title:has(.news-detail) hr{margin-left:auto;margin-right:auto;}
/* Breadcrumbs hidden on news entries. There is NO native toggle - no breadcrumb field or global
   exists; the only native lever is `menuGroup`, which drops a single ANCESTOR crumb, not the bar.
   CSS [95] cannot reach these because news.twig renders the crumbs INLINE in the hero rather than in
   a `section.breadcrumbs-wrap`. Hiding rather than removing the include is deliberate: the chunk also
   feeds `schema.pushBreadcrumb`, so the BreadcrumbList JSON-LD survives for SEO. */
.section-title:has(.news-detail) .breadcrumbs{display:none;}
/* The breadcrumb row was the only thing holding the hero off the header - hiding it left the h1 flush
   at a 0px gap. Restore the offset explicitly. 64px matches what the Newsroom page's own hero uses,
   so entry and listing now start at the same height. padding-top, not margin-top: the theme locks
   margin-top with !important. */
.section-title:has(.news-detail){padding-top:40px;}
@media (min-width:768px){.section-title:has(.news-detail){padding-top:64px;}}

/* White ground needs !important here: styles.css sets `.bg-light-buff, .site-wrap { ... !important }`,
   so specificity alone loses. Counter-locking a theme !important is the sanctioned exception. */
.site-wrap:has(.news-detail),
.site-wrap:has(.section-news){background-color:#ffffff !important;}

/* Prev/next band: dark blue ground with rounded white cards (was a flat light-grey band, square cards).
   `overflow:hidden` is required or the thumbnail column punches through the rounded corner.
   The "Prev/Next post" label was #ced4da on white - about 1.6:1, effectively invisible - so it moves to
   teal, which reads as an accent label and passes contrast. */
.section-news-prev-next{background-color:#00304A;}
.section-news-prev-next .project-tile{border-radius:14px;overflow:hidden;background-color:#ffffff;}
.section-news-prev-next .project-tile .h4{color:#5aa7a0;}
/* No press release carries its own image, so the 25% thumbnail column renders as an empty gap that
   shoves the prev card's text off-centre. Collapse the column when there is no image in it. */
.section-news-prev-next .fauxBG-parent:not(:has(img)){display:none;}

/* [104] multiColumn mixed-width left-edge fix - GLOBAL - 2026-08-04
   multiColumn.twig adds `.block-x` (50px inset) only when colWidth > 4. So any block mixing a wide
   column with narrow ones splits its left edges - measured 125px vs 75px on /supernetting and /aerloc.
   This targets ONLY sections that actually contain a narrow column, so blocks made entirely of wide
   columns keep their existing inset and nothing else on the site moves. `~=` matches a whole class
   token, so col-lg-4 does not also catch col-lg-40/col-lg-12.
   Supersedes the per-page versions in [92] and [99], which are now redundant but harmless. */
.section-multiColumn:has([class~="col-lg-1"], [class~="col-lg-2"], [class~="col-lg-3"], [class~="col-lg-4"],
                         [class~="col-md-1"], [class~="col-md-2"], [class~="col-md-3"], [class~="col-md-4"]) .block-x{
  padding-left:0;
  padding-right:0;
}

/* [105] Supernetting: outcome box, Benefit emphasis, key-differentiator top padding - 2026-08-04
   1. `.sn-result` - the two outcome sentences get their own panel so they read as the result of the
      three numbered steps rather than a fourth step. White on the Light Buff band, teal rule.
   2. `.kd-benefit` - the Benefit line was losing itself in the body copy on the Dark Blue band
      (Mitch: "it needs to pop"). Teal rule + inset lifts it out without changing a word.
   3. The first iconText in the Key differentiators columns sat hard against the lead above it -
      `.wrap-icon` carries no top spacing, so the column gets padding-top instead (theme locks
      margin-top with !important). */
.sn-result{
  background:#ffffff;
  border-left:3px solid #5aa7a0;
  border-radius:0 10px 10px 0;
  padding:22px 26px;
  margin-top:34px;
}
.sn-result .sn-result-label{
  font-family:'Roboto Mono',monospace;
  font-size:13px;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:#5aa7a0;
}
.kd-benefit{
  border-left:2px solid #5aa7a0;
  padding-left:14px;
  margin-top:10px;
}
#supernetting-keydiff .col > .wrap-icon:first-child,
#supernetting-keydiff .block-x > *:first-child{padding-top:0;}
#supernetting-keydiff .row > [class*="col"] > *:first-child{padding-top:12px;}

/* [106] AerLoc Key differentiators: icon row alignment + link colour - 2026-08-04
   Feedback 7.2.1 - the two columns' items have different copy lengths, so icons in row 2 sat 55px apart
   (3968 vs 4023). Pin a heading floor so each row's items start level. Read ACROSS, so a floor is right.
   Feedback 7.2.2 - the integration links rendered `btn-link text-white`, i.e. identical to the body copy
   on the Dark Blue band, so they did not read as links at all. Teal is the brand's link colour and is
   already used this way elsewhere; !important counter-locks the theme's `.text-white` utility. */
#aerloc-keydiff .wrap-icon + *,
#aerloc-keydiff h3{min-height:2.2em;min-height:2lh;}
#aerloc-keydiff a.btn.btn-link{color:#5aa7a0 !important;}
#aerloc-keydiff a.btn.btn-link:hover{color:#ffffff !important;text-decoration:underline;}
/* 7.2.1 cont. - the integration links must sit on ONE line (Mitch). Measured: three links total 446px
   in a 467px wrapper, so the default inter-button margins pushed them to 486px and Palo Alto wrapped -
   which was also what threw row 2's icons 24px out of line. Tighter column-gap plus the 16px step (an
   existing scale value, not an invented size) brings them to ~428px, inside the wrapper. */
#aerloc-keydiff .my-3{display:flex;flex-wrap:nowrap;align-items:baseline;column-gap:16px;}
#aerloc-keydiff .my-3 .btn{margin-left:0 !important;margin-right:0 !important;
  flex:0 0 auto;white-space:nowrap;font-size:16px;}
/* Row 2 alignment: with the links now on one line, the only remaining difference is the FIRST item's
   body copy - 3 lines on the left, 2 on the right. Floor the first item's body in each column to 3
   lines so both items occupy the same slot and row 2's icons start level. Only the first item is
   floored, so no blank space is added to the shorter items below. Row 3 is left-column only and has
   no counterpart to align to. */
#aerloc-keydiff .row.align-items-start:first-of-type .col > p:not([class]){min-height:3.4em;min-height:3lh;}

/* [107] AerLoc Architecture accordion - expanded-content placement - 2026-08-04
   accordionSection.twig wraps hiddenContent in `.block-x > .row > .col-xl-10`, which:
     - capped the content at 940px inside a 1200px band (~224px wasted on the right), squeezing the
       graphic; and
     - indented the copy to x=171 via block-x's 50px padding, aligning it with neither the item heading
       (186) nor the numeral (120).
   Full width, then a 65px left pad so the expanded copy sits directly under the item HEADING and the
   numeral hangs in the margin. Scoped to this section only - the template is shared with every other
   accordion on the site. */
#aerloc-architecture .accordion-body .col-xl-10{flex:0 0 100%;max-width:100%;}
#aerloc-architecture .accordion-body .block-x{padding-left:65px;padding-right:0;}
#aerloc-architecture .accordion-body{padding-top:4px;}
@media (max-width:767px){
  #aerloc-architecture .accordion-body .block-x{padding-left:0;}
}

/* [107b] AerLoc Architecture band onto the page grid - 2026-08-05
   `accordionSection.twig` renders sectionWidth 10 as `.col-10.feature-tabs-outer`, but `multiColumn`
   renders the SAME value as `.col-11` plus a responsive `.block-x` inset (50px >=1200, 30px 992-1199,
   0 below). So the accordion band and the six multiColumn bands on /aerloc were never on one grid -
   they merely landed 10px apart at 1440 by coincidence, and diverged by 42px at 991. Measured page
   grid: first text at 125 (1440) / 56 (991); the accordion sat at 135 / 98.
   Match col-11 and reproduce block-x's inset (15px base column padding + the block-x value). */
#aerloc-architecture .feature-tabs-outer{flex:0 0 91.666667%;max-width:91.666667%;}
@media (min-width:992px){#aerloc-architecture .feature-tabs-outer{padding-left:45px;}}
@media (min-width:1200px){#aerloc-architecture .feature-tabs-outer{padding-left:65px;}}

/* [108] Logo carousel with autoscroll OFF renders as a static CENTRED row - 2026-08-05
   Mitch: "Oil and Gas won't auto-scroll and if it does not, it should sit centred, whereas it sits like
   it should be scrolling."
   Background: the Fancyapps logo carousel only autoscrolls when its track fills the viewport TWICE (it
   needs that to build a seamless loop). Slides are `--f-carousel-slide-width:14.2%` = 7 per view, so 6-7
   logos come to roughly ONE viewport and nothing moves. /warehousing-and-logistics clears the bar with 9
   (its Customer-Badges slides are 1.5x wider = 1.92x); /manufacturing (7 = 1.21x) and /oil-and-gas
   (6 = 1.06x) never could. Autoscroll is now OFF on those two - Mitch: "if there is not enough logos,
   there is no need for that functionality."
   But switching it off is not enough: the carousel still centres SLIDE 0 as if it were mid-scroll, so the
   row sat off-centre and overflowed - Oil & Gas ran to 1640px in a 1440px viewport and clipped its last
   badge. This lays the slides out as one centred, shrink-to-fit row instead.
   Selector is data-driven, not page-scoped: the template only adds `img.autoscroll` when the autoscroll
   lightswitch is on, so this targets exactly the carousels that cannot scroll - including any future one.
   `transform` needs !important because Fancyapps writes it as an INLINE style; counter-locking a
   JS-applied value is the sanctioned exception (see the CSS-defaults-not-locks rule). */
.f-logoCarousel:not(:has(img.autoscroll)){
  display:block;
}
.f-logoCarousel:not(:has(img.autoscroll)) .f-carousel__viewport{
  display:flex;
  flex-wrap:wrap;
  justify-content:center;
  align-items:center;
  row-gap:24px;
  width:100%;
  max-width:100%;
  overflow:visible;
  transform:none !important;
}
/* Drop the carousel's percentage sizing altogether. `--f-carousel-slide-width:14.2%` resolves against a
   box the carousel itself sizes, and once the track is not being scrolled each slide ended up reserving
   TWICE its own width (measured: a 192px slide followed by a 193px void), spreading 6 logos across 2592px
   in a 1440px viewport. Sizing each logo to its own intrinsic width - still capped by the theme's
   `max-width` (150px standard / 260px Customer-Badges) - gives a natural centred row with no percentages
   to feed back, and wraps instead of clipping if a page ever has too many. */
.f-logoCarousel:not(:has(img.autoscroll)) .f-carousel__slide{
  position:static !important;
  flex:0 0 auto;
  width:auto !important;
  max-width:none;
  transform:none !important;
}
/* The `max-width` cap is what actually sizes these logos: several are SVGs with no intrinsic width, so
   `width:auto` alone lets them fill their box (one blew up to 733px during this fix). Caps trimmed from
   the theme's 150px/260px so a 7-logo row still fits one line at 1440px:
   4x130 + 3x210 + padding = 1290px. They wrap rather than clip if a page has more. */
.f-logoCarousel:not(:has(img.autoscroll)) .f-carousel__slide img{
  width:auto !important;
  max-width:130px;
}
.f-logoCarousel:not(:has(img.autoscroll)) .f-carousel__slide img[src*="Customer-Badges"]{
  /* 260px = the theme's own Customer-Badges cap (the badge-enlargement convention, see [96]) so a badge in
     a static row reads the same size as on the marquee pages (~244px there). The old 210px was sized to fit
     7 logos on one line at /manufacturing, which now scrolls via the template fix and no longer uses this
     rule - flagged by Mitch on /data-centers, where the lone hyperscalers badge rendered visibly small. */
  max-width:260px;
}

/* Breathing room between the logos. The slides only carry 10px of padding each side, so a static row read
   as cramped at 20px apart. Budget is set by the widest case: /manufacturing's 7 logos need
   4x130 + 3x210 + 7x20 = 1290px, so at a 1440px viewport there are ~150px to spend across 6 gaps, and more
   on wider screens. Stepped rather than fluid so the row can never wrap - flex-wrap is on as the
   anti-clipping fallback, and a wrapped lone logo looks like a bug. */
@media (min-width:992px){
  .f-logoCarousel:not(:has(img.autoscroll)) .f-carousel__viewport{column-gap:20px;}
}
@media (min-width:1600px){
  .f-logoCarousel:not(:has(img.autoscroll)) .f-carousel__viewport{column-gap:40px;}
}

/* [109] Mobile fixes, Phase 1 of the 2026-08-05 responsive audit - 2026-08-05
   Source: docs/celona-mobile-audit-2026-08-05.md (96 pages @375). This section = the mechanical,
   no-sign-off fixes only; the h1 clamp + mono-eyebrow floor are Phase 2, gated on client approval
   because the type system is locked. All selectors data-driven; no !important (defaults, not locks). */

/* 1. Wide tables become swipeable instead of unreachable. Audit found 4 pages whose tables run past the
   viewport with no scroll ancestor (/wi-fi compare, /product-lifecycle-updates, 2 datasheets); this
   catches every present and future columnTable/CK table the same way. */
@media (max-width: 767px){
  .site-wrap main table{
    display:block;
    overflow-x:auto;
    -webkit-overflow-scrolling:touch;
  }
}

/* 2. Touch targets on site chrome (audit: breadcrumb links 14px tall, footer nav links 16px, alert close
   22px - guideline is ~40px). Padding only - font sizes untouched here. Negative margin on breadcrumbs
   keeps the visual row height unchanged. */
@media (max-width: 991px){
  ol.breadcrumbs li a{
    display:inline-block;
    padding:13px 6px;
    margin:-13px -2px;
  }
  footer .footer-nav li a{
    display:inline-block;
    padding:10px 0;
  }
  .alert-dismissible .close{
    padding:14px 16px;
  }
}

/* 3. 12px legibility floor on non-type-system chrome (audit: footer copyright/legal 10.9px, resource
   NEW-badge + date 11.2px). The mono display-5/6/7 eyebrows also measure 11.2px but belong to the locked
   type scale - they ship with Phase 2's sign-off, not here. */
@media (max-width: 991px){
  footer .display-5,
  footer .display-5 a{
    font-size:12px;
  }
}
.resource-badge-new,
.resource-date{
  font-size:max(12px, 0.7rem);
}

/* ---------------------------------------------------------------------------
   [110] 2026-08-06  Video resource body alignment
   multiColumn.twig only adds .block-x's 50px inline padding when colWidth > 4.
   The video pages use a full-width (cw12) column, so the player and body copy
   sat 50px right of the page title, which is flush with the section column.
   Zero that padding for the video body block so header and content share one
   left edge. Same pattern (and same reason) as #about-momentum / #plant-cta.
   Anchored on the block's sectionID, so it touches nothing else.
   --------------------------------------------------------------------------- */
#video-body .block-x { padding-left: 0; padding-right: 0; }

/* ---------------------------------------------------------------------------
   [111] 2026-08-06  Resources index - global "Reset" control
   Lives in its own column, NOT inside the search input-group: attached to the
   search box a cross reads as "clear search" rather than a global reset
   (client feedback). Circular-arrow icon + "Reset" label, sized and baselined
   to sit level with the three filter controls beside it.
   Behaviour: JS [55]. Markup: resourceFilters.twig.
   --------------------------------------------------------------------------- */
.resource-filter-reset {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  width: 100%;
  min-height: 41px;              /* match the rendered .form-select / .form-control height */
  padding: .375rem .75rem;
  background: transparent;
  border: 1px solid #00304A;
  border-radius: 50rem;
  color: #00304A;
  font-size: .875rem;
  font-weight: 500;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
.resource-filter-reset:hover,
.resource-filter-reset:focus-visible {
  background: #00304A;
  color: #ffffff;
  border-color: #00304A;
}
.resource-filter-reset svg { flex: 0 0 auto; }
.resource-filter-reset-label { overflow: hidden; text-overflow: ellipsis; }

/* tight only on small tablets now the column is col-2 - drop the word, keep the icon */
@media (min-width: 768px) and (max-width: 991.98px) {
  .resource-filter-reset { justify-content: center; }
  .resource-filter-reset-label { display: none; }
}
/* stacked on mobile: no spacer label, sits under the search field */
@media (max-width: 767.98px) {
  .resource-filter-reset-col { margin-top: .75rem; }
  .resource-filter-reset { width: auto; }
}

/* ---------------------------------------------------------------------------
   [112] 2026-08-06  Footer group headings
   The footer is now derived from the nav (one column per nav GROUP). A group
   that is a real page renders its heading as <a>, which styles.css already
   styles; a pure nav grouping (Technologies, By industry, ...) has no page, so
   it renders as <span class="footer-nav-label"> and got none of that styling.
   Mirror `.footer-nav > li > a` exactly so the two heading kinds are identical
   apart from being clickable. Defaults, not locks.
   --------------------------------------------------------------------------- */
.footer-nav > li > .footer-nav-label {
  display: block;
  color: #5aa7a0;
  font-family: "Roboto Mono", monospace;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  margin-bottom: 16px;
  cursor: default;
}

/* ---------------------------------------------------------------------------
   [113] 2026-08-06  Footer type +1px
   Client: "footer text feels very small in comparison to rest of site."
   styles.css sets the column headings at 12px and the links/brand blurb at 14px;
   bump each by 1px. Also stops the copyright line wrapping "Privacy policy" onto
   its own row at desktop - it now has room to sit on one line.
   Defaults, not locks.
   --------------------------------------------------------------------------- */
/* styles.css scopes these as `footer .footer-details .footer-nav ...` (0,3,4),
   so a bare `.footer-nav ...` selector loses on specificity no matter the file
   order - match its scope rather than reach for !important. */
footer .footer-details .footer-nav > li > a,
footer .footer-details .footer-nav > li > .footer-nav-label { font-size: 13px; }
footer .footer-details .footer-nav > li ul a { font-size: 15px; }
footer .footer-brand { font-size: 15px; }
.copyright .display-5 { font-size: 13px; }

/* the copyright column was col-md-6, so the line wrapped; give it the room it
   needs and keep the links from breaking mid-phrase */
.copyright .text-md-end { flex: 0 0 auto; width: auto; margin-left: auto; }
.copyright .display-5 a { white-space: nowrap; }

/* ---------------------------------------------------------------------------
   [114] 2026-08-06  Footer heading -> first link gap, made consistent
   Client: "spacing under header e.g. PLATFORM is tight with Platform overview,
   Solutions has cleaner gap - they're inconsistent."
   Cause: styles.css already sets `margin-bottom:16px` on the column heading, but
   a heading that is a LINK renders as an inline <a>, and vertical margin is
   ignored on inline elements - so those columns collapsed to a 3px gap while the
   block-level <span> group headings correctly got 16px. A latent theme bug that
   the new label headings simply exposed.
   Make the linked headings block so the theme's own margin finally applies.
   --------------------------------------------------------------------------- */
footer .footer-details .footer-nav > li > a { display: block; }

/* [120] Pricing estimator (Pricing #9928, featuresList block 44177) - give the scenario
   charts more room - 2026-08-06. Client 10.4: "Can I get more room for the images?".
   featuresList hardcodes a 6/6 split (tab list | content pane); this rebalances THIS block
   only to 4/8, taking the chart from ~605px to ~805px at 1440. Scoped by the block id the
   template already emits (id="acc-services-<blockId>"), so no other featuresList moves.
   Below md the tab list is d-none and the pane is full width, hence the md+ media query.
   2026-08-10 EXTENDED to the four industry blocks - manufacturing 11905, oil-and-gas 17380,
   smart-ports 21422, warehousing 22496. Mitch: "the aesthetic should basically replicate the
   pricing page, given he says that looks perfect"; at 6/6 the charts were unreadable. Their
   sectionWidth was also moved 10 -> 11 to match, which widens the band past the surrounding
   modules on those pages - accepted deliberately ("I understand that's outside the width of
   content around it... but I think we need to replicate").
   2026-08-19 EXTENDED again to healthcare 30427 and mining 51962. Both sections were built after
   the 2026-08-10 sweep (they were the empty accordion shells at the time) so they never joined the
   list, and were still rendering 6/6 at sectionWidth 10 - chart 598px against 878px everywhere
   else. Mitch, looking at /healthcare: "close the gap b/w text and image so that the graph can be
   larger/more readable". Their sectionWidth was moved 10 -> 11 in the CP to match, as above. */
@media (min-width: 768px) {
  #acc-services-tab-44177 > .col-md-6:first-child,
  #acc-services-tab-11905 > .col-md-6:first-child,
  #acc-services-tab-17380 > .col-md-6:first-child,
  #acc-services-tab-21422 > .col-md-6:first-child,
  #acc-services-tab-22496 > .col-md-6:first-child,
  #acc-services-tab-30427 > .col-md-6:first-child,
  #acc-services-tab-51962 > .col-md-6:first-child { flex: 0 0 auto; width: 33.33333333%; }
  #acc-services-tab-44177 > .col-md-6:last-child,
  #acc-services-tab-11905 > .col-md-6:last-child,
  #acc-services-tab-17380 > .col-md-6:last-child,
  #acc-services-tab-21422 > .col-md-6:last-child,
  #acc-services-tab-22496 > .col-md-6:last-child,
  #acc-services-tab-30427 > .col-md-6:last-child,
  #acc-services-tab-51962 > .col-md-6:last-child { flex: 0 0 auto; width: 66.66666667%; }
}

/* The tab list drops to 4/12, so reclaim the template's inner .col-10 - otherwise the
   scenario tab labels get the full column width and stop wrapping mid-phrase. */
@media (min-width: 768px) {
  #acc-services-tab-44177 .feature-tab-container > .col-10,
  #acc-services-tab-11905 .feature-tab-container > .col-10,
  #acc-services-tab-17380 .feature-tab-container > .col-10,
  #acc-services-tab-21422 .feature-tab-container > .col-10,
  #acc-services-tab-22496 .feature-tab-container > .col-10,
  #acc-services-tab-30427 .feature-tab-container > .col-10,
  #acc-services-tab-51962 .feature-tab-container > .col-10 { flex: 0 0 auto; width: 100%; }
  /* NO vertical centring here. The theme's collapse panes don't contribute height to the row
     (row height = tab list), so centring the pane makes an 880x531 chart overflow the band -
     334px below it as align-items:center on the row, 56px above it as flex on the pane.
     Top-aligned is the template's native behaviour and the only one that stays inside the band. */
}

/* SVG scenario charts carry their own buff artboard - let them fill the pane. */
#acc-services-tab-44177 .feature-tab-content img,
  #acc-services-tab-11905 .feature-tab-content img,
  #acc-services-tab-17380 .feature-tab-content img,
  #acc-services-tab-21422 .feature-tab-content img,
  #acc-services-tab-22496 .feature-tab-content img { width: 100%; height: auto; }

/* [111] Cramped mobile text - the sweep's largest confirmed defect - 2026-08-05
   Measured (tools/celona-ops/cramped.js): 31 pages / 54 instances rendering body copy at 9-20 characters
   per line in 121-207px columns at 375px. Cause is always the same shape: several nested containers each
   take their own slice of width, and the copy is left with a fraction of the screen. Three chains traced,
   one rule set each. Target: no body text under ~25 chars/line at 375. */

/* (a) featuresList / accordion panes. Chain on /manufacturing: container 375 -> row 353 ->
   `.col-10.feature-tabs-outer` 294 (it stays 83% wide at mobile) -> nested col paddings 264 -> <ul>
   indent -> 158px. CSS [107b] already does this for #aerloc-architecture; generalise it. */
@media (max-width: 991.98px){
  .feature-tabs-outer{
    flex:0 0 100%;
    max-width:100%;
  }
}

/* (b) Card bodies. Chain on /microslicing: card 315 -> `.col-8` 209 (the text column is 66% at mobile and
   only becomes col-md-12 from md UP - inverted for mobile-first) -> card-body padding 16/36 -> inner col
   9/9 -> <ul> 32px -> 125px. Stacking the card's columns below 768 gives the copy the full card width,
   which also matches the house icon-card pattern (icon above title above body). */
@media (max-width: 767.98px){
  .section-cards .card,
  .section-carousel .card{
    flex-wrap:wrap;
  }
  .section-cards .card > [class*="col-"],
  .section-carousel .card > [class*="col-"]{
    flex:0 0 100%;
    max-width:100%;
  }
  /* the 36px right pad was for a desktop two-column card; symmetrical is right once stacked */
  .section-cards .card .card-body,
  .section-carousel .card .card-body{
    padding-right:16px;
  }
}

/* (c) Nested list indent. A 32px `ul` padding-left costs ~2 characters per line on a phone. */
@media (max-width: 767.98px){
  main ul,
  main ol{
    padding-left:18px;
  }
}

/* (d) Pull-quotes. Chain on /connected-worker: slide 314 -> wrapper 25/25 -> col 15/15 -> blockquote
   38.4px indent -> 207px. */
@media (max-width: 767.98px){
  main blockquote{
    padding-left:16px;
  }
}

/* ---------------------------------------------------------------------------
   [115] 2026-08-07  "Highlight card" upgraded: FILLED emphasis tile, background-aware
   Client (Pricing #9928, "The choices"): the highlighted Celona Orion tile has to
   pop far harder than a 3px outline. The treatment hangs off the native control
   (Lightswitch field 163, highlightCard -> .card-highlight from cards.twig), so
   it upgrades with the switch and needs no per-page CSS.

   TWO highlight languages, deliberately:
     - BOXED cards (a grid with a cardColour, e.g. Pricing's White tiles) now FILL.
     - OPEN cards (.card-open, the borderless icon grids) keep the soft tinted
       panel from [27] - a filled slab in a borderless grid reads as a mistake,
       and that softer language was signed off 2026-07-21. Untouched here except
       for the dark-band smarts below.

   The colour smarts, driven by the band the card sits on:
     - light band (Light Buff / Warm Linen / White / unset) -> Dark Blue fill, white ink
     - dark band (section, block or the card itself already Dark Blue) -> Light Buff
       fill, navy ink (navy on navy would vanish)
   Everything inside follows the fill through the --hi-* variables: ink icons
   invert, the grey lead layer lifts to a soft tint of the ink, list markers and
   the .card-top divider take a tint of the ink, and navy/buff buttons flip to the
   ink colour (teal buttons are legible on both fills, so they are left alone).

   !important is used only where it counter-locks an existing !important
   (Bootstrap's .bg-* utilities, styles.css's .bg-white colour list, the
   block-level .border-{colour} classes, the theme's icomoon li::before).
   --------------------------------------------------------------------------- */
.card.card-highlight {
  --hi-fill: #00304A;
  --hi-ink: #ffffff;
  --hi-ink-soft: rgba(255, 255, 255, .86);
  --hi-rule: rgba(255, 255, 255, .28);
  --hi-icon: brightness(0) invert(1);
  --hi-shadow: 0 14px 34px rgba(0, 48, 74, .20);
}

/* Dark context: a navy tile on a navy band is invisible, so invert the pair. */
.bg-dark-blue .card.card-highlight,
.card.card-highlight.bg-dark-blue {
  --hi-fill: #f5f3ec;
  --hi-ink: #00304A;
  --hi-ink-soft: rgba(0, 48, 74, .78);
  --hi-rule: rgba(0, 48, 74, .20);
  --hi-icon: none;
  --hi-shadow: 0 14px 34px rgba(0, 0, 0, .28);
}

/* --- the filled tile (boxed cards only) --------------------------------- */
.card.card-highlight:not(.card-open) {
  background-color: var(--hi-fill) !important;   /* counter-locks .bg-white etc. */
  border-color: var(--hi-fill) !important;       /* counter-locks .border-{colour} */
  border-width: 3px;
  border-style: solid;
  box-shadow: var(--hi-shadow);
  /* !important counter-locks styles.css's `.bg-white, .bg-light-buff, ... { color:
     rgba(var(--bs-dark-rgb)) !important }` list - without it a White/Buff card
     keeps navy ink and the copy disappears into the fill. */
  color: var(--hi-ink) !important;
  --bs-card-color: var(--hi-ink);
  --bs-card-title-color: var(--hi-ink);
}

/* .card-top's ::after divider inherits the card border colour */
.card.card-highlight:not(.card-open) .card-top { border-color: var(--hi-rule) !important; }

/* The type-system grey lead layer would go muddy on a filled tile. */
.card.card-highlight:not(.card-open) :where(.lead, .lead-1, .lead-2, .lead-3, .lead-4, small, .small) {
  color: var(--hi-ink-soft);
}

/* Body links (not buttons) follow the ink. */
.card.card-highlight:not(.card-open) .card-body a:not(.btn) {
  color: var(--hi-ink);
  text-decoration-color: var(--hi-rule);
}

/* icomoon list markers are set with !important by the theme. */
.card.card-highlight:not(.card-open) li::before { color: #5aa7a0 !important; }

/* Single-colour ink icons/SVGs would disappear into a dark fill. */
.card.card-highlight:not(.card-open) .icon-wrap img,
.card.card-highlight:not(.card-open) .card-image { filter: var(--hi-icon); }

/* Navy buttons on a navy fill (and buff on buff) would vanish: flip to the ink. */
.card.card-highlight:not(.card-open) .btn-dark-blue,
.card.card-highlight:not(.card-open) .btn-light-buff {
  background-color: var(--hi-ink);
  border-color: var(--hi-ink);
  color: var(--hi-fill);
}
.card.card-highlight:not(.card-open) .btn-outline-dark-blue,
.card.card-highlight:not(.card-open) .btn-outline-light-buff,
.card.card-highlight:not(.card-open) .btn-link {
  border-color: var(--hi-ink);
  color: var(--hi-ink);
}
.card.card-highlight:not(.card-open) .btn-outline-dark-blue:hover,
.card.card-highlight:not(.card-open) .btn-outline-light-buff:hover {
  background-color: var(--hi-ink);
  color: var(--hi-fill);
}

/* --- open cards: keep [27]'s soft panel, but give it the same smarts -------
   A 7% teal wash on a Dark Blue band is invisible. Nothing renders in that
   combination today (all five live open highlights sit on light bands), so this
   is purely future-proofing and changes no current page. */
.bg-dark-blue .card.card-open.card-highlight {
  background: rgba(255, 255, 255, .10) !important;
  border-color: rgba(255, 255, 255, .45) !important;
}

/* [112] Home + Platform overview feedback (HOME PAGE-Platform overview.docx) - 2026-08-05

   (1) Hero video. Mitch: "should be scaled to full screen width, this not optimised for that. Also on my
   superwide monitor it goes full page, can we pick a max width as well?"
   The earlier rule set `width:100vw; height:100svh; object-fit:cover`, so the frame was CROPPED to fill the
   viewport height (that is why the burnt-in text reads "...al AI and Age..." rather than the full line) and
   it ran edge to edge at any width. Now: still full-bleed, but capped at 2560px, re-centred at that cap,
   and sized by the video's own aspect ratio so the whole frame is visible. */
.orion-hero-video{
  max-width:2560px;
  margin-left:calc(50% - min(50vw, 1280px));
  height:auto;
  min-height:0;
  object-fit:contain;
}

/* (2) Platform accordion item titles. Mitch: "The 'Celona Orion' header looks smaller than the actual
   dropdowns. Can we scale down those e.g. Unified wireless etc."
   The section h2 is fluid (56px desktop -> 21.2px at 375) but the item titles are a fixed 24px `.h4`, so
   below ~700px the items render LARGER than the heading above them. Make them fluid and always a step
   under the h2. Scoped to the home block via its sectionID. */
/* The featuresList renders TWO item lists - a desktop tab column (`d-none d-md-block`) and a mobile
   accordion (`d-md-none`) - and it emits no id from sectionID, so the fix must target the mobile
   accordion header directly. At 375 those titles measured 21.5px against the section h2's 21.2px, i.e.
   the items were fractionally LARGER than the heading above them. */
@media (max-width: 767.98px){
  .feature-platform .accordion-header .h4,
  .feature-platform .accordion-header h4{
    font-size:17px;
  }
}

/* (3) Footer bottom bar. Mitch: "Footer social/text stack". The social buttons (35px) and the copyright
   line (16px) share a row but are not aligned to each other; below md they stack without centring. */
footer .footer-social{
  display:flex;
  align-items:center;
}
@media (max-width: 767.98px){
  footer .footer-social{
    justify-content:center;
  }
  footer .footer-social ~ *,
  footer .footer-social + div{
    text-align:center;
  }
}


/* (4) Platform overview hero - "Padding needed between buttons and graphic."
   The hero's text column and image column stack below 992, leaving the CTA pair only ~53px above the
   circular graphic. Applies to the shared `.title-intro-wrap` hero, so any stacked hero image gains the
   same breathing room. */
@media (max-width: 991.98px){
  .title-intro-wrap > [class*="col-lg-5"],
  .title-intro-wrap > [class*="col-lg-4"]{
    margin-top:40px;
  }
}

/* ---------------------------------------------------------------------------
   [116] 2026-08-07  /pricing "Purchasing" icon rows - wrapped-row rhythm + a
   2-up step so the copy never goes cramped
   Client: the `_01`-numeral card grid was "overused", so Purchasing was rebuilt
   as the iconText row pattern (precedent: /aerloc, /plant-operations, /moxn).
   Two things the 3-item precedent never had to handle, both fixed here and
   anchored on the block's sectionID so no other multiColumn is affected:

   1. FIVE items in a 3-wide grid wrap, and multiColumn columns carry no bottom
      spacing - a wrapped item's heading landed ~18px under the previous item's
      last line while the row-1 items sat 132px apart. 34px is the documented
      stacked-item value (docs/celona-spacing-standard.md section 2) and brings
      heading-to-heading to ~166px. Which items need it depends on how many are
      per row, hence one rule per range.
   2. The template emits `col-12 col-lg-4`, so 992-1199px renders 3-up at only
      313px per column -> a 220px copy box -> 18-21 chars/line. That is the
      cramped-text defect (gate: no body copy under ~25 chars/line). Measured
      3-up: 1024 -> 18-21 cpl, 1200 -> 21 cpl, 1440 -> 28 cpl. So step to 2-up
      below 1400; that gives 28-39 cpl at 1024-1399.
   --------------------------------------------------------------------------- */
/* >=1400: 3 per row -> items 4-5 are the wrapped row */
@media (min-width: 1400px) {
  #purchasing-terms .row.justify-content-start > [class*="col-"]:nth-child(n+4) { padding-top: 34px; }
}
/* 992-1399: 2 per row (avoids the cramped 313-366px column) -> items 3-5 wrap */
@media (min-width: 992px) and (max-width: 1399.98px) {
  #purchasing-terms .row.justify-content-start > [class*="col-"] { flex: 0 0 50%; max-width: 50%; }
  #purchasing-terms .row.justify-content-start > [class*="col-"]:nth-child(n+3) { padding-top: 34px; }
}
/* <992: the template already stacks (col-12) -> every item after the first */
@media (max-width: 991.98px) {
  #purchasing-terms .row.justify-content-start > [class*="col-"]:nth-child(n+2) { padding-top: 34px; }
}


/* [113] Footer bottom bar - mobile spacing - 2026-08-05
   Measured at 375px: the social buttons and the copyright/legal line had a gap of exactly **0px** - the
   text started on the icons' bottom edge - and only 40px of footer remained below it. Adds the gap and a
   little room underneath. `row-gap` on the flex row, so it only applies once the two stack. */
@media (max-width: 767.98px){
  footer .row:has(> .footer-social){
    row-gap:20px;
    padding-bottom:16px;
  }
  footer .footer-social + [class*="col"],
  footer .footer-social ~ .display-5{
    text-align:center;
  }
}
/* [114] /pricing mobile feedback - 2026-08-05

   (1) Hero H1. Mitch: "H1 need more space, so 3 words are not stacking." The hero h1 is 48px/44.4lh at
   375 in a 314px column, so "Celona Orion pricing" breaks across 3 lines on narrower handsets. This is
   the Phase 2 mobile type step from the responsive audit, applied to h1 only (the hero title - section
   h2s are untouched). Revert this rule if the client wants the locked 48px back on phones. */
@media (max-width: 767.98px){
  /* the hero rule is `:is(.section-header,.section-title-intro,.home-intro) h1` (0,1,1) at
     clamp(3rem,4.36vw,4.65rem) = 48px on a phone, so a bare `h1` selector loses. Match its shape. */
  h1,
  :is(.section-header, .section-title-intro, .home-intro) h1{
    font-size:clamp(2.125rem, 1.6rem + 2.6vw, 3rem);
    line-height:1.1;
  }
}

/* (2) Hero content/buttons centred on mobile. Mitch: "think we centre and content/buttons in the top
   sections". The h1 already centres but the CTA row was left-aligned, so the block read lopsided. */
@media (max-width: 767.98px){
  .title-intro-wrap{
    text-align:center;
  }
  /* `.text-start` is a Bootstrap utility (text-align:left !important) on the hero's inner block, so
     centring the wrapper alone does nothing - counter-lock it. */
  /* On /pricing the hero CTAs are NOT in the entry banner - they sit in the first multiColumn block
     (#pricing-intro), so `.title-intro-wrap` never matched them. Scope both. */
  .title-intro-wrap .block-x.text-start,
  .title-intro-wrap .text-start,
  #pricing-intro .block-x.text-start,
  #pricing-intro .text-start{
    text-align:center !important;
  }
  #pricing-intro .my-3,
  .title-intro-wrap .my-3,
  .title-intro-wrap .btn-wrap{
    display:flex;
    flex-direction:column;
    align-items:center;
    gap:12px;
  }
}

/* (3) "The choices" cards - centre their content (Mitch: "These boxes should centre content"). */
@media (max-width: 767.98px){
  #pricing-choices .card-body{
    text-align:center;
    align-items:center;
  }
  #pricing-choices .card-body .icon-wrap,
  #pricing-choices .card-body .row,
  #pricing-choices .card-body .col-12{
    text-align:center;
  }
}

/* (4) Pricing estimator - hide the duplicated heading and close the gap it left.
   The band already prints "/ PRICING ESTIMATOR" as its eyebrow, so the h2 repeated it verbatim. Hidden
   rather than deleted so the copy stays in the CP and this is one line to undo. */
@media (max-width: 767.98px){
  /* MOBILE ONLY - Mitch: "i just don't want it on mobile", desktop keeps the heading.
     RE-APPLIED 2026-08-07 after another session overwrote claude-updates.css from a stale copy. */
  #pricing-estimator .block-x > h2:first-child,
  #pricing-estimator h2{
    display:none;
  }
}

/* (5) TCO chart. Mitch: "Can the TCO image fill that box on mobile? it's illegible."
   The chart is a 1060x696 SVG rendered at 303px - vector, so not a resolution problem: it is drawn for
   desktop and shrinks to under a third of its intended size. Stripping the nested padding
   (20px + 20px on `.blocked`, 15px + 15px on the inner col) takes it 303 -> ~373px, the most width the
   viewport allows. NOTE: that is +23% and helps, but a genuinely legible chart on a phone needs either a
   simplified mobile artwork or tap-to-zoom - flagged, not solvable in CSS. */
@media (max-width: 767.98px){
  /* the chart sits in the following featuresList block (#pricing-estimator-items), NOT in the
     heading block - scoping it to #pricing-estimator matched nothing. */
  /* featuresList emits NO id from sectionID (same trap as the home platform block) - its real hook is
     the template-generated `#acc-services-tab-<blockId>`. */
  #acc-services-tab-44177 .blocked.top-content,
  #acc-services-tab-44177 .blocked.top-content > .row > .col-12{
    padding-left:0;
    padding-right:0;
  }
}

/* (6) "Purchasing made easy" - the h2 sat 8px above its first item on mobile.
   Mobile-only on purpose: the DESKTOP padding for #purchasing-terms is being handled in another session,
   so this must not touch it. */
@media (max-width: 767.98px){
  /* `.pt-2` is a Bootstrap utility and carries !important, so this has to counter-lock it - the
     sanctioned exception (see the CSS-defaults-not-locks note). */
  #purchasing-terms{
    padding-top:24px !important;
  }
}

/* [117] 2026-08-07 - ADDED AND RETIRED THE SAME DAY, number burnt (do not reuse).
   It put 28px above the /pricing numeral tile grids after "give the header more
   breathing room". Mitch then clarified the request was the PURCHASING band, and that
   144px on the subscription grid was "too much" - reverted to the theme default 116px.
   The breathing room he wanted is the Purchasing rows band's own sectionSpacing top,
   4 -> 5 (24 -> 48px): a CP field, no CSS. The two sectionIDs stay as harmless anchors. */

/* ---------------------------------------------------------------------------
   [118] 2026-08-07  Pricing estimator - mobile chart pane goes frameless
   Client: "if you're going full width, you should hide the border on mobile, and
   reduce padding top and bottom b/w text."
   Below md the tab list is `d-none` and the pane runs the full column, so the
   theme's `.accordion-body.feature-tab-content.border-charcoal` 1px frame + 8px
   radius sits hard against the screen edge and reads as a stray box; the pane's
   `.top-content` 20px/20px and the figure's `my-2` then stack ~56px of air
   between the scenario copy and the chart that carries its own buff artboard.
   Frame off and that air roughly halved, mobile only - the desktop pane keeps
   its frame, where it does read as a card. Scoped to this block's own id
   (`#acc-services-tab-44177`), same anchor as [110].
   `!important` on the border counter-locks the `.border-charcoal` block class.
   --------------------------------------------------------------------------- */
@media (max-width: 767.98px) {
  #acc-services-tab-44177 .accordion-body.feature-tab-content {
    border: 0 !important;
    border-radius: 0;
  }
  #acc-services-tab-44177 .accordion-body .top-content {
    padding-top: 0;
    padding-bottom: 8px;
  }
  #acc-services-tab-44177 .accordion-body figure {
    margin-top: 0;
    margin-bottom: 0;
  }
}

/* ---------------------------------------------------------------------------
   [119] 2026-08-07  Device listing - even tiles
   Client: "can we make these tiles even?" Measured across the 65 devices at
   1440: six different tile heights (474 / 500 / 527 / 545 / 553 / 606) and, as
   an Isotope masonry grid, nothing lines up. Three variable parts, floored here
   so every tile is identical (the image is already a fixed 249px letterbox):
     - title `h3.h5` runs 1-6 lines (32 tiles 1 line, 23 two, 8 three, 1 four,
       1 six) -> floored AND capped at 3 lines
     - the form-factor `<p>` is empty on some devices -> 1-line floor
     - the certified badge is the last child of `.card-body`, i.e. IN FLOW, so
       the 25 certified tiles were 53px taller -> lifted out to the top-right
       corner, where the theme already shows it on most tiles
   Plus `margin-top:auto` on the button so it always sits on the tile's baseline.
   Scoped to the device items (`.resource-list.certified/.compatible`, classes
   certifiedDevices.twig emits per device) - the /resources grid shares
   `.resource-list` but already measures dead even (30 tiles, all 430px).
   ⚠ The 3-line cap ellipsises two long product names (Sierra Wireless AirLink
   XR80 ..., and one 4-line title). Shortening those two titles in the CP is the
   better fix; then the cap never bites.
   --------------------------------------------------------------------------- */
.resource-list.certified .card,
.resource-list.compatible .card { position: relative; }

.resource-list.certified .card .card-body,
.resource-list.compatible .card .card-body { display: flex; flex-direction: column; }

.resource-list.certified .card .card-body > .h5,
.resource-list.compatible .card .card-body > .h5 {
  min-height: 3lh;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.resource-list.certified .card .card-body > p,
.resource-list.compatible .card .card-body > p { min-height: 1lh; }
/* one device carries four band chips, which wrap to a second line - floor the chip
   row at 2 lines so that tile is not the only 540px one among 64 at 522px */
.resource-list.certified .card .card-body > p.display-6,
.resource-list.compatible .card .card-body > p.display-6 { min-height: 2lh; }

.resource-list.certified .card .card-body > .btn,
.resource-list.compatible .card .card-body > .btn { margin-top: auto; }

.resource-list.certified .card .partner-badge,
.resource-list.compatible .card .partner-badge {
  position: absolute;
  top: 12px;
  right: 12px;
  width: 44px;
  height: auto;
}

/* ---------------------------------------------------------------------------
   [122] 2026-08-07  Celona Brain architecture tabs - give the diagrams the pane
   The three §8 visuals are 2667x1500 (16:9) with fine labels inside, and
   featuresList hardcodes a 6/6 split, so at 1440 each diagram rendered ~560px
   wide - the labels were unreadable. Same rebalance [110] does for the Pricing
   estimator's charts, on this block's own id, so no other featuresList moves:
   tab list 4/12, content pane 8/12. Below md the tab list is `d-none` and the
   pane is already full width, hence the md+ query.
   --------------------------------------------------------------------------- */
@media (min-width: 768px) {
  #acc-services-tab-46602 > .col-md-6:first-child { flex: 0 0 auto; width: 33.33333333%; }
  #acc-services-tab-46602 > .col-md-6:last-child  { flex: 0 0 auto; width: 66.66666667%; }
  /* the tab list drops to 4/12, so reclaim the template's inner .col-10 or the
     module titles wrap mid-phrase */
  #acc-services-tab-46602 .feature-tab-container > .col-10 { flex: 0 0 auto; width: 100%; }
}
/* let the diagram fill the pane - it carries its own light artboard */
#acc-services-tab-46602 .feature-tab-content img { width: 100%; height: auto; }

/* ---------------------------------------------------------------------------
   [123] 2026-08-07  Architecture tabs - teal `_0N` numerals + roomier bullets
   Client: keep the tabbed Architecture treatment (preferred over the accordion
   from a UI standpoint) but carry the `_01` teal numeral language the rest of
   the site uses, and "add line spacing to dot points so they take more
   real-estate in the left box".
   The numerals are CONTENT - the tab's `eyebrow` field, which the template
   prints in `.section-tab-wrap` above the title in Roboto Mono. Only the colour
   needs CSS. Scoped to the two blocks that carry numerals (Celona Brain 46759,
   AerLoc 46840) so /orion's tabs - whose eyebrows still duplicate their titles -
   are untouched until those are cleaned up too.
   Bullets: 4 items at line-height 28.8 and no margin filled 230px against a
   491px diagram, so the copy column read half-empty. 1.75 line-height + 1.75rem
   between items brings it to ~350px against the image.
   --------------------------------------------------------------------------- */
#brain-architecture .tab-card .section-tab-wrap,
#aerloc-architecture .tab-card .section-tab-wrap {
  color: #5aa7a0;
}
#brain-architecture .accordion-collapse li {
  line-height: 1.75;
  margin-bottom: 1.75rem;
}
#brain-architecture .accordion-collapse li:last-child {
  margin-bottom: 0;
}

/* ---------------------------------------------------------------------------
   [124] 2026-08-07  /orchestrator-ai Overview - align the heading with the video
   Client: "can we get alignment with header and video". The video column (cw8)
   renders inside a `.block-x .block` panel whose 50px padding pushed the video
   51px below the h2 in the cw4 text column, so the two columns started at
   different heights. Aligning the TEXT to the video (rather than stripping the
   panel's padding, which would make the video bleed to the panel edge) keeps
   the panel intact. lg+ only - the columns stack below that, where a top offset
   would just be a gap.
   Anchored on the block's sectionID.
   --------------------------------------------------------------------------- */
@media (min-width: 992px) {
  #orchestrator-overview .row > [class*="col-lg-4"] { padding-top: 50px; }
}

/* [125] 2026-08-10 - ADDED AND RETIRED THE SAME DAY, number burnt (do not reuse).
   It set `align-self:flex-start` on featuresList chart panes to stop the card
   stretching under the graphic. It never did anything: the card's parent is a
   `.col-xl-12` (display:block), so align-self has no effect on it. Measured after
   the [120] extension, the card is only ~75px taller than the graphic on ALL of
   manufacturing / smart-ports / pricing - that is the card's own 28.8px top and
   bottom padding, and /pricing (the signed-off reference) has the identical gap.
   There was no defect to fix. Removed rather than left as dead weight. */

/* [126] /in-building-cell-coverage "How it works" - two-column layer panels
   -------------------------------------------------------------------------
   Structure is all module fields, so the client keeps full CP control:
     - the tint comes from each layer column's own "Colour picker" (Light Buff)
     - the copy is ordinary CKEditor <p>/<h3>/<ul> they can edit normally
     - each "Learn more" button is its own centred, uncoloured column beneath
   This section only does what a field cannot: the panel proportions, the small-caps
   treatment, and the side-by-side split. Scoped to the block's Section ID.

   Proportions: the stock .block is 50px padding / 25px radius / no border, which
   reads soft and roomy next to the rest of the page. The original hand-built panel
   was ~22-26px / 12px / a hairline navy border at 15%, restored here.

   Typography is deliberately OUTSIDE the media query so the small caps hold on
   mobile too; only the two-column split is desktop-only.
   Built 2026-08-11 after CKEditor destroyed the hand-authored <div> markup twice
   on save - nothing here depends on markup the editor is able to strip. */
#how-it-works .block-x.block {
  padding: 1.5rem 1.65rem;
  border-radius: 12px;
  border: 1px solid rgba(0, 48, 74, .15);
}
/* the bold one-line paragraphs are the LAYER n label and the strapline; the
   original set both in teal small caps, so the client can keep writing them as
   ordinary bold text in the editor and still get the treatment */
#how-it-works .block-x.block p > strong:only-child {
  display: block;
  color: #5aa7a0;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  line-height: 1.45;
}
#how-it-works .block-x.block > p:first-child {
  margin-bottom: .35rem;
}
#how-it-works .block-x.block > h3 {
  margin-bottom: .3rem;
}
#how-it-works .block-x.block > p > i {
  font-size: 1.05rem;
  color: rgba(0, 48, 74, .8);
}

@media (min-width: 992px) {
  #how-it-works .block-x.block {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
    column-gap: 2.75rem;
    align-content: start;
    padding: 1.65rem 1.75rem;
  }
  #how-it-works .block-x.block > *:not(ul) {
    grid-column: 1;
  }
  /* the list is the last sibling with no wrapper, so it is lifted into a second
     column with an explicit span - a float starts below the preceding copy, and a
     generous span keeps it full-height however many paragraphs the client adds
     (empty implicit rows collapse to nothing) */
  #how-it-works .block-x.block > ul {
    grid-column: 2;
    grid-row: 1 / span 99;
    margin: 0;
    align-self: start;
  }
  #how-it-works .block-x.block > *:last-child {
    margin-bottom: 0;
  }
}

/* [127] 2026-08-12 Dark-band content links (client: "case study links are disappearing
   as they are using same color scheme"). Plain CK links keep Bootstrap's navy default
   (--bs-link-color), which vanishes on dark grounds - e.g. the /healthcare proof card's
   "Read the Stanford Health Care case study" link. The client patched that one instance
   with an inline color; this gives every dark-band link a background-dependent DEFAULT
   so the next one can't regress. No !important - inline colours, buttons and higher
   treatments still win (css-defaults-not-locks). Teal on navy/charcoal grounds (matches
   the client's own fix and the accent system); on Teal grounds teal would vanish, so
   those go buff-white. Excluded: buttons, light-filled panels/cards sitting on a dark
   band, highlight-card ink ([~2602] has its own system), celona-table (white body even
   on dark bands), HubSpot forms ([5]), resourcesShowcase. */
main :is(.bg-deep-blue, .bg-dark-blue, .bg-blue, .bg-charcoal, .bg-rich-charcoal, .bg-black, .bg-deep-cobalt)
  a:not(.btn):not([class*="btn-"]):not(.bg-white *):not(.bg-light-buff *):not(.bg-warm-linen *):not(.bg-warm-taupe *):not(.bg-light-charcoal *):not(.card-highlight *):not(.celona-table *):not(.hs-form *):not(.section-resourcesShowcase *):not(:has(> i.icon:only-child)) {
  color: #5aa7a0;
}
main :is(.bg-deep-blue, .bg-dark-blue, .bg-blue, .bg-charcoal, .bg-rich-charcoal, .bg-black, .bg-deep-cobalt)
  a:not(.btn):not([class*="btn-"]):not(.bg-white *):not(.bg-light-buff *):not(.bg-warm-linen *):not(.bg-warm-taupe *):not(.bg-light-charcoal *):not(.card-highlight *):not(.celona-table *):not(.hs-form *):not(.section-resourcesShowcase *):not(:has(> i.icon:only-child)):hover {
  color: #7fc0ba;
}
/* Teal ground: teal links would vanish; buff-white reads as the accent there. Placed
   after the dark rule so an inner teal panel on a navy band resolves to this one. */
main .bg-teal
  a:not(.btn):not([class*="btn-"]):not(.bg-white *):not(.bg-light-buff *):not(.bg-warm-linen *):not(.bg-warm-taupe *):not(.bg-light-charcoal *):not(.card-highlight *):not(.celona-table *):not(.hs-form *):not(.section-resourcesShowcase *):not(:has(> i.icon:only-child)) {
  color: #f5f3ec;
}
main .bg-teal
  a:not(.btn):not([class*="btn-"]):not(.bg-white *):not(.bg-light-buff *):not(.bg-warm-linen *):not(.bg-warm-taupe *):not(.bg-light-charcoal *):not(.card-highlight *):not(.celona-table *):not(.hs-form *):not(.section-resourcesShowcase *):not(:has(> i.icon:only-child)):hover {
  color: #ffffff;
}

/* [127b] 2026-08-12 HubSpot consent/legal links inside dark-band forms. [5] colours
   .hs-form .hs-richtext links teal, but the consent CHECKBOX label's privacy-policy
   link sits outside .hs-richtext and kept Bootstrap navy - invisible on the dark form
   bands (seen on /contact-us). [127] deliberately excludes .hs-form (the form skin
   owns its ground), so the skin gets its own dark-band link rule, scoped to the same
   band enumeration the [5]-era dark-form rules use. */
:is(.bg-deep-blue, .bg-dark-blue, .bg-blue, .bg-deep-cobalt) :is(.hs-form, .hs-form-private) a:not(.btn) {
  color: #5aa7a0;
}

/* [128] 2026-08-12 Consent disclaimer parity (Mitch: "the disclaimers just need to be
   styled the same" - and the LARGER treatment belongs on the checkbox version, since
   that is the one asking for an action). The implied-consent richtext renders at body
   size (1.2rem/19.2px) while the opt-in checkbox label rendered at 13.6px. Bring the
   checkbox label up to match; on dark form bands give it the same soft tone the
   richtext gets from the [5]-era skin. Pairs with JS [56], which shows exactly one of
   the two treatments per visitor by IP. */
.hs-form .hs-form-booleancheckbox-display > span {
  font-size: 1.2rem;
  line-height: 1.5;
}
:is(.bg-deep-blue, .bg-dark-blue, .bg-blue, .bg-deep-cobalt) .hs-form .hs-form-booleancheckbox-display > span {
  color: #c9d6da;
}

/* [128b] 2026-08-12 rogue bullet on form checkbox rows (Mitch, /contact-us consent
   checkbox). Two layers produced a marker inside HubSpot .inputs-list lists: [69]'s
   dot (guard excluded .hs-error-msgs but not .inputs-list - now patched in place) and,
   beneath it, the THEME's icomoon Celona-mark li:before that [69] was counter-locking.
   Form checkbox/radio lists should never carry decorative markers - suppress the theme
   layer too (sanctioned counter-lock, see [69]). */
.section-multiColumn ul.inputs-list li::before {
  content: none !important;
}

/* [129] Feature-tab CTA breathing room (2026-08-12, /orchestrator-ai): the buttons row inside
   .feature-tab-content sat flush against the panel's border corner - the Bootstrap row's -15px
   margin cancels the column padding and the panel itself has no padding, so the pill button
   overlaid the border. Inset the CTA row to match .blocked.bottom-content's 1.6rem content
   padding and give it clearance off the bottom border. */
.feature-tab-content > .row.mt-3 > .col-auto {
  padding-left: calc(15px + 1.6rem);
  padding-right: calc(15px + 1.6rem);
}
.feature-tab-content > .row.mt-3 {
  margin-bottom: 1.6rem;
}

/* [130] 2026-08-13 Lead-phrase list items rendered as broken two-column rows (client:
   "alignment is crook" on /frequency Why-Frequency-exists). Cause: theme sets
   .section-multiColumn ul > li { display:flex }, so a leading <strong> becomes its own
   flex column, splitting the sentence. Scope: any multiColumn li that STARTS with a
   <strong> flows as a normal sentence again. No !important needed (specificity wins). */
.section-multiColumn ul:not(.hs-error-msgs) > li:has(> strong:first-child) {
  display: list-item;
  line-height: 1.5;
}

/* [130] CookiePro "Cookie settings" footer button (2026-08-13). The button reopens the consent
   preference centre - required so a visitor can withdraw consent as easily as they gave it. It
   sits inline in the copyright line beside Terms/Privacy/Cookie policy, so it must READ as one of
   those links, not as a form control. OneTrust ships its own #ot-sdk-btn styling (padding, border,
   background, its own font-size) and uses !important on several of those, so this is a sanctioned
   counter-lock (see [69]). Scoped to .copyright so any other OneTrust button elsewhere is
   untouched. */
.copyright #ot-sdk-btn.ot-sdk-show-settings {
  background: none !important;
  border: none !important;
  padding: 0 !important;
  margin: 0;
  color: inherit !important;
  font-size: inherit !important;
  font-family: inherit;
  font-weight: inherit;
  line-height: inherit;
  text-decoration: underline; /* match the sibling policy links */
  cursor: pointer;
  vertical-align: baseline;
}
.copyright #ot-sdk-btn.ot-sdk-show-settings:hover,
.copyright #ot-sdk-btn.ot-sdk-show-settings:focus-visible {
  background: none !important;
  color: inherit !important;
  text-decoration: underline;
}

/* [131] 2026-08-17 Gated whitepaper layout (`.wpg-*`). Renders only when a resourceWhitepaper
   entry carries a `gatedFormId`, so the other 34 whitepapers are untouched. Built from the
   approved concept `whitepaper-gated-concept-v1.html`: cover + byline hero, two-column body
   with a sticky lead-capture card, auto-derived related cards.

   Colour and type come from the theme (bg-dark-blue / text-teal / .h2 / the CKEditor scale);
   nothing here re-declares brand values except the two rgba shadows and the bullet mark, which
   have no theme token. Per [CSS = defaults, not locks] there is no !important on any
   field-driven property. */

.wpg-hero {
  padding-top: 64px;
  padding-bottom: 64px;
}
/* Gated hero title size (client 2026-08-17: "the h1 is too big for that much volume").
   Measured before: 62.8px over SEVEN lines, 483px tall - the title alone owned the band.

   Why this is a rule and not a class: the theme has
   `:is(.section-header, .section-title-intro, .home-intro) h1 { font-size: clamp(3rem, 4.36vw, 4.65rem) }`
   which is (0,1,1) and therefore beats `.h3` (0,1,0). Putting `.h3` on the h1 - the documented
   "long headings drop a level" move - was silently inert. This selector is (0,2,1) so it wins
   on specificity alone; no !important, per [CSS = defaults, not locks].

   Cap is 2.5rem/40px, which is the theme's OWN desktop h1 size (the Bootstrap-layer heading
   block), so this is not a new step in the locked scale. Floor is 1.75rem/28px = the `.h3` step.
   Order matters: 40px title > 29.4px lead > 19.2px body, so hierarchy is preserved - dropping
   all the way to `.h3` would have made the title SMALLER than the lead paragraph under it. */
.wpg-hero .section-title-intro h1 {
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1.08;
  margin-bottom: 0;
  max-width: 18ch;
  text-wrap: balance;
}

.wpg-hero .h2 {
  margin-bottom: 0;
}
.wpg-hero .author {
  color: #fff;
}

/* hero CTA - the theme's pill button plus a down-arrow that nudges on hover */
.wpg-jump {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: 28px;
}
.wpg-jump .wpg-ico {
  width: 18px;
  height: 18px;
  transition: transform .18s ease;
}
.wpg-jump:hover .wpg-ico {
  transform: translateY(3px);
}

/* cover: the asset sits on a white card so a white-background PDF thumbnail still reads
   against the navy band */
.wpg-coverwrap {
  position: relative;
  display: block;
}
.wpg-cover {
  background: #fff;
  border-radius: 14px;
  padding: 14px;
  box-shadow: 0 18px 40px rgba(0, 0, 0, .28);
  overflow: hidden;
}
.wpg-cover img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 6px;
}
.wpg-tag {
  position: absolute;
  top: -12px;
  left: -12px;
  z-index: 2;
  background: #5aa7a0;
  color: #00304A;
  font-family: 'Roboto Mono', monospace;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  padding: 6px 12px;
  border-radius: 999px;
}

/* ---- body ---------------------------------------------------------------- */
.wpg-body {
  padding-top: 64px;
  padding-bottom: 64px;
}
.wpg-main > :first-child {
  margin-top: 0;
}
.wpg-main h2 {
  font-size: 2rem;
  margin-bottom: .6em;
}
.wpg-main h3 {
  font-size: 1.375rem;
  margin-top: 2rem;
  margin-bottom: .8em;
}
.wpg-main p {
  margin-bottom: 1.1em;
}

/* "What's inside" - a plain CKEditor <ul> picks up the Celona mark as its bullet, so an
   editor never has to hand-build icon rows. Scoped to .wpg-main only. */
.wpg-main ul {
  list-style: none;
  padding-left: 0;
  margin: 1.4em 0;
}
.wpg-main ul > li {
  position: relative;
  padding-left: 42px;
  margin-bottom: 1em;
  line-height: 1.55;
}
.wpg-main ul > li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .15em;
  width: 26px;
  height: 26px;
  background-image: url('data:image/svg+xml,<svg%20xmlns="http://www.w3.org/2000/svg"%20viewBox="197.09%2023.78%2096%2096"%20fill="%235aa7a0"><path%20d="M200.7366,71.7774c0,19.1472,12.156,35.4121,29.1529,41.6233v-16.3468c-8.5721-5.1669-14.3242-14.538-14.3242-25.2765s5.7521-20.1096,14.3242-25.2765v-16.347c-16.9969,6.2111-29.1529,22.4761-29.1529,41.6234ZM260.2908,30.1539v16.3468c8.5721,5.167,14.3243,14.5382,14.3243,25.2766s-5.7522,20.1096-14.3243,25.2766v16.3467c16.9969-6.2111,29.1529-22.4761,29.1529-41.6233s-12.156-35.4123-29.1529-41.6234Z"/><circle%20cx="245.0902"%20cy="71.7773"%20r="11.8345"/></svg>');
  background-repeat: no-repeat;
  background-size: contain;
}

/* the Gartner attribution/disclaimer block - small print, still legible */
.wpg-main .wpg-fineprint,
.wpg-main .fineprint {
  font-size: .8125rem;
  line-height: 1.5;
  opacity: .72;
  margin-top: 2.5rem;
}
.wpg-main .wpg-fineprint p,
.wpg-main .fineprint p {
  margin-bottom: .75em;
}

/* ---- lead-capture card --------------------------------------------------- */
.wpg-formcard {
  background: #fff;
  border-radius: 16px;
  overflow: hidden;
  box-shadow: 0 14px 38px rgba(0, 48, 74, .14);
}
@media (min-width: 992px) {
  .wpg-formcard {
    position: sticky;
    top: 110px; /* clears the fixed header */
  }
}
.wpg-fh {
  background: #00304A;
  padding: 22px 26px;
}
.wpg-fh .wpg-t {
  color: #fff;
  font-size: 1.25rem;
  font-weight: 700;
  line-height: 1.25;
}
.wpg-fh .wpg-s {
  color: #5aa7a0;
  font-size: .9375rem;
  margin-top: 4px;
}
.wpg-fb {
  padding: 24px 26px 26px;
}

/* HubSpot form inside the card. The theme already styles .hs-form-field site-wide; these
   rules only correct what breaks in a narrow card - full-width controls and a submit button
   that fills the column. Consent-disclaimer treatment is JS [56] + CSS [128], not here. */
.wpg-fb .hs-form-field {
  margin-bottom: 14px;
}
.wpg-fb .hs-input:not([type="checkbox"]):not([type="radio"]) {
  width: 100% !important; /* HubSpot ships inline width on its own inputs */
  max-width: 100%;
}
.wpg-fb .hs-button {
  width: 100%;
  justify-content: center;
}
/* NOTE: no font-size here on purpose. Section [4] sets `.hs-form label` to 0.85rem globally
   and the form must stay on that scale (client 2026-08-17). Weight/spacing only. */
.wpg-fb .hs-form-field > label {
  font-weight: 600;
  margin-bottom: 4px;
}

/* Consent disclaimer AT CARD SCALE (client 2026-08-17: "it's still huge").
   Measured in the gated card: consent checkbox span **19.2px**, vs form labels 13.6px, submit
   button 16px and the legal fine print 11px - i.e. the consent line was the largest text in the
   card, bigger even than the button.

   Not a regression from this build. It comes from [128] (2026-08-12), which deliberately raised
   `.hs-form .hs-form-booleancheckbox-display > span` to 1.2rem because the client wanted the two
   consent treatments "styled the same, larger version on the checkbox". That was sized for a
   WIDE form band (/contact-us, /become-a-partner) where 19.2px reads correctly. It does not
   travel into a narrow sidebar card.

   So: keep [128] exactly as it is everywhere else, and bring BOTH consent treatments to the
   card's own scale here - 0.85rem to match `.hs-form label` from section [4]. [128]'s parity
   principle is preserved (the checkbox and richtext versions still match each other), just at
   card size. [128] has no !important, so specificity alone wins: (0,3,1) over its (0,2,1). */
.wpg-fb .hs-form .hs-form-booleancheckbox-display > span,
.wpg-fb .hs-form .hs-richtext {
  font-size: 0.85rem;
  line-height: 1.45;
}

/* ---- related ------------------------------------------------------------- */
.wpg-related {
  padding-top: 56px;
  padding-bottom: 64px;
}
.wpg-related h3 {
  margin-bottom: 28px;
}
.wpg-cards {
  row-gap: 20px;
}
.wpg-card {
  display: flex;
  flex-direction: column;
  gap: 10px;
  height: 100%;
  padding: 22px 22px 24px;
  border: 1px solid rgba(0, 48, 74, .14);
  border-radius: 14px;
  text-decoration: none;
  transition: border-color .18s ease, transform .18s ease, box-shadow .18s ease;
}
.wpg-card:hover,
.wpg-card:focus-visible {
  border-color: #5aa7a0;
  transform: translateY(-3px);
  box-shadow: 0 12px 26px rgba(0, 48, 74, .12);
  text-decoration: none;
}
.wpg-card .wpg-k {
  font-family: 'Roboto Mono', monospace;
  font-size: .75rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: #5aa7a0;
}
.wpg-card .wpg-ct {
  font-size: 1.0625rem;
  font-weight: 700;
  line-height: 1.35;
  color: #00304A;
}

/* ---- mobile -------------------------------------------------------------- */
@media (max-width: 991.98px) {
  .wpg-hero {
    padding-top: 40px;
    padding-bottom: 44px;
  }
  .wpg-coverwrap {
    margin-top: 36px;
    max-width: 380px;
  }
  .wpg-body {
    padding-top: 44px;
    padding-bottom: 48px;
  }
  .wpg-formcard {
    margin-top: 40px;
  }
  .wpg-related {
    padding-top: 40px;
    padding-bottom: 48px;
  }
}

/* [131b] 2026-08-17 (rev 2026-08-17) Mandatory third-party legal text on a gated whitepaper.

   Client direction: "Disclaimer text is third party/mandatory, make it wide and much smaller",
   then "it's bigger than the form labels". It was - the previous pass used the registered
   CKEditor "Caption" style (`display-6`), which computes to ~0.925em / 14.8px, against the
   global HubSpot form scale of `label` 0.85rem (13.6px) and `.hs-richtext` 0.8rem (12.8px)
   from section [4]. So it out-sized every label in the form beside it.

   Now it is its own full-width band fed by the `gatedDisclaimer` PLAIN TEXT field (#196), not
   CKEditor - it cannot be flattened by a CP save and an editor cannot break it with markup.
   0.6875rem/11px puts it clearly below the smallest text in the form, which is what makes it
   read as boilerplate rather than content. Full container width, not the 7-column body: this
   is not Celona's copy and must not compete with it. */
.wpg-legal {
  padding-top: 0;
  padding-bottom: 56px;
}
.wpg-legal > .container-xxl > .row > [class*="col-"] {
  padding-top: 24px;
  border-top: 1px solid rgba(0, 48, 74, .12);
}
.wpg-legal p {
  font-size: 0.6875rem;
  line-height: 1.65;
  letter-spacing: .002em;
  color: rgba(0, 48, 74, .58);
  margin-bottom: .7em;
  max-width: none; /* deliberately WIDE - full band measure */
}
.wpg-legal p:last-child {
  margin-bottom: 0;
}

/* "About this report" as an eyebrow, not a heading (client 2026-08-17: the h2 competed with the
   hero title). `display-7` is the registered CK "Eyebrow - caps" style so it survives a CP save;
   the teal + `/` reading comes from the house eyebrow pattern used in the hero. This is a
   SECTION-level label, which is where that treatment belongs - the spacing standard warns against
   display-7 at ITEM level only. */
.wpg-main .display-7 {
  color: #5aa7a0;
  margin-bottom: 1.1rem;
}

/* the body band now hands off to the legal band, so it must not also pay a full bottom gap -
   two `bg-light-buff` bands in sequence would otherwise stack two paddings (spacing standard
   section 1, same-colour band pairs). */
.wpg-body {
  padding-bottom: 40px;
}

/* [132] TCO chart panes - the chart artboard fills the pane.
   These featuresList panes hold exactly one thing: a 3-year-cost chart PNG that already carries
   its own buff artboard (#F5F1E8) and its own internal padding. The pane's default .blocked inset
   (clamp(20px,2vw,50px) = 28.8px at desktop) plus the figure's 16px bottom margin therefore read
   as a white gutter between the teal border and the artboard - the band shows through, because the
   pane itself is transparent. Zero both and clip to the pane's radius so the chart meets the border.
   Client 2026-08-19: "full bleed to the box, I don't want a white background visible".

   SCOPE - why the guards matter: this module is shared. Other panes on the same pages deliberately
   keep that white space for copy and a "Read the case study" / "Watch the webinar" button
   underneath (surveyed across /manufacturing, /oil-and-gas, /smart-ports,
   /warehousing-and-logistics, /mining, /healthcare, /5g-lan). So the rule only fires on a pane that
   holds a TCO-Graphics image AND has no link and no paragraph: add a button or a line of copy to
   one of these panes and the intentional padding comes straight back. Targeting on the asset folder
   in the transform URL follows the Customer-Badges precedent in [96].

   The flex declaration has to out-specify the equal-height rule earlier in this file
   (.section-featuresList .col-md-6.px-md-0 .accordion-collapse.show .accordion-body{flex:1}), which
   otherwise stretches the pane to the taller left column and reopens the gap under the chart. */
.section-featuresList .col-md-6.px-md-0 .accordion-collapse.show .accordion-body:has(figure.image img[src*="TCO-Graphics"]):not(:has(a)):not(:has(p)) {
  flex: 0 0 auto;
  overflow: hidden;
}
.section-featuresList .feature-tab-content:has(figure.image img[src*="TCO-Graphics"]):not(:has(a)):not(:has(p)) .blocked {
  padding: 0;
  border-top: 0;
}
.section-featuresList .feature-tab-content:has(figure.image img[src*="TCO-Graphics"]):not(:has(a)):not(:has(p)) figure.image {
  margin: 0;
}
.section-featuresList .feature-tab-content:has(figure.image img[src*="TCO-Graphics"]):not(:has(a)):not(:has(p)) figure.image img {
  display: block;
  width: 100%;
  height: auto;
}
