/* Reusable homepage section templates. Shared shell/eyebrow utilities first. */

.baq-shell {
    max-width: 1180px;
    margin: 0 auto;
    padding: 0 34px;
}

/*
 * ---- standalone page-header block ----
 *
 * For a bare <h1>-only content block placed above a page's first
 * container (see About Bronwyn, whose H1 was lost in the container
 * conversion and re-added as its own block). Every other plain-content
 * page's H1 already reads fine sitting on the white page background,
 * because normal body copy follows it in the very same block; this page
 * is the only one where a standalone H1 block is immediately followed by
 * a container with a completely different background, which is what
 * made it read as orphaned rather than styling of the H1 itself (its
 * size/face/weight already match every other page's H1 exactly). This
 * class gives it a bit of vertical rhythm and a hairline rule so it
 * reads as a deliberate page-header band, not floating text. Scoped to a
 * wrapper class rather than to h1 generally, since this is only for the
 * standalone-block case.
 */
.baq-page-header {
    padding: 56px 34px 32px;
    border-bottom: 1px solid var(--baq-gold);
}

.baq-page-header h1 {
    margin-bottom: 0;
}

@media (max-width: 560px) {
    .baq-page-header {
        padding: 40px 21px 24px;
    }
}

/*
 * Specificity fix: repeating the class three times raises this rule to
 * (0,3,0), which beats every rule that was silently overriding it —
 * `.col-md-12 > .ccm-block-content > p` at (0,2,1) (the sitewide plain-
 * paragraph reading rule, wherever an eyebrow sits one block-wrapper
 * level deep) and `.baq-section-head p` at (0,1,1) (the route-finder's
 * own section-head reset) — without touching either of those rules or
 * reaching for !important. Confirmed directly: every .baq-eyebrow on the
 * site was rendering at 18px instead of this rule's own 13px before this
 * change.
 */
.baq-eyebrow.baq-eyebrow.baq-eyebrow {
    font-size: var(--baq-text-label-size);
    letter-spacing: 0.24em;
    text-transform: uppercase;
    font-weight: 500;
    font-family: var(--baq-font-body);
}

.baq-text-cta {
    display: inline-block;
    margin-top: 27px;
    font-size: var(--baq-text-label-size);
    letter-spacing: 0.15em;
    text-transform: uppercase;
    font-family: var(--baq-font-body);
    border-bottom: 1px solid var(--baq-gold);
    padding-bottom: 6px;
    color: var(--baq-ink);
}

/* ---- hero ---- */

.baq-hero {
    /*
     * True two-element split: .baq-hero-panel and .baq-hero-photo are
     * direct sibling flex children, not an overlay panel sitting on top
     * of a background-image on this section. align-items:stretch (not
     * center) so both siblings fill the same full height rather than the
     * panel just centering itself over a taller implicit photo box.
     */
    display: flex;
    flex-direction: row;
    align-items: stretch;
    min-height: 625px;
    /*
     * True black, not #1a1919: new-home-hero.webp's own background is a
     * solid black studio backdrop. Any residual sliver of row-height gap
     * between the panel's natural height and the photo's own aspect-ratio
     * height (see .baq-hero-photo below) now lands on the same black as
     * the photo itself instead of a visibly lighter charcoal seam — which
     * is what "grey bands that aren't the photo's own black" was actually
     * describing.
     */
    background-color: #000;
}

.baq-hero-panel {
    /*
     * The 784x844 cropped photo is close to square. To keep the photo
     * side close to its own ratio instead of a wide letterbox, this is a
     * near-equal flex split (not the old 33%-of-a-1180px-shell), which is
     * also why the .baq-shell wrapper around the panel is gone — both
     * siblings now size against the hero's own full width, not a capped
     * inner container. min-width is a floor, not a break from the split:
     * below it the panel has too little content width for its own text,
     * so it holds steady rather than shrinking into something unusable
     * right at the stacking boundary.
     */
    flex: 1 1 0;
    min-width: 340px;
    /*
     * Establishes this element as a query container so the h1's font-size
     * below can be sized in cqw (a percentage of THIS element's own
     * rendered width) instead of vw or a fixed px value tied to a
     * viewport breakpoint. Same effect in both two-column and stacked
     * layout, since it's keyed to the panel's actual width either way.
     */
    container-type: inline-size;
    background: rgb(5, 5, 5);
    color: var(--baq-paper);
    padding: 52px 50px;
    border-left: 1px solid var(--baq-gold);
    /*
     * Added for the portrait hero photo (new-home-hero.webp, 2:3): the
     * photo panel now sizes itself by its own aspect-ratio instead of
     * being handed a height by cover-crop, so at some widths the photo
     * is taller than this panel's own text, and at others it's shorter
     * (measured directly: photo taller at 1440/1243, panel taller at
     * 1024/768). align-items:stretch on .baq-hero still matches both
     * sides to the row's tallest, so this panel's dark box keeps filling
     * the full height either way — flex+justify-content:center here just
     * keeps the text centered in that box instead of pinned to the top
     * with an empty gap below it when the photo is the taller side.
     */
    display: flex;
    flex-direction: column;
    justify-content: center;
}

.baq-hero-photo {
    /* cover locks to the box's width here (box is wider than the 784x844
       source), which crops vertically. center keeps that crop balanced
       top/bottom instead of anchoring to the browser's 0% 0% default. */
    flex: 1 1 0;
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center;
}

.baq-hero-panel .baq-eyebrow {
    /* "PRIVATE BODY SCULPTING · PEWAUKEE" was wrapping to 3 lines at most
       widths; kept as one line rather than shortened the copy. */
    white-space: nowrap;
}

.baq-hero h1 em {
    /* Keeps "Body Sculpting" as one unit so it either fits on the H1's
       last line whole or wraps to its own line whole — not split with
       "Sculpting" orphaned alone. */
    white-space: nowrap;
}

.baq-hero-panel img {
    display: none; /* the img tag stays in $content for the regex extraction; hidden here since it's now .baq-hero-photo's background-image, not inline content */
}

.baq-hero h1 {
    /*
     * Fluid instead of fixed: scales continuously with .baq-hero-panel's
     * own rendered width (cqw = 1% of that container's width, set above,
     * via container-type:inline-size), instead of jumping between two
     * fixed px values (59px, 43px) at one hardcoded viewport number. The
     * old rule was correct at every width it happened to be tested at
     * (768/820/1024) and simply wrong at 976, because neither fixed value
     * reacted to the panel's own width — this reacts to every pixel of
     * it, in both the two-column and stacked layout, so there's no width
     * left for a fixed value to miss the way 976px was missed. 59px is
     * the original desktop size and stays the ceiling; 24px is the site's
     * display floor and stays the floor.
     *
     * The actual 976px fix is the stacking point moving to 991.98px (see
     * the @media block below) — that removes the 768-991px band (which
     * 976px falls in) from two-column layout entirely, since it's the one
     * band where the panel gets too narrow for 59px text regardless of
     * font-scaling headroom. This clamp is what makes the remaining
     * two-column range (992px and up) and the whole stacked range robust
     * against ever landing in that situation again, rather than relying
     * on 59px being safe purely because nothing narrower than 992px uses
     * it anymore:
     *
     * 13cqw chosen from measuring the h1's actual minimum content width:
     * "Body Sculpting" (kept nowrap below so it never splits) measures
     * 378.3125px wide at 59px font-size, i.e. 6.412px per font-size px.
     * At the panel's own content-box width (outer width minus its 100px
     * horizontal padding):
     *   - >=508.5px (panel outer >=608.5px, the 1200px+ band): 13cqw
     *     computes to >=66px, so the clamp ceiling (59px) governs —
     *     identical to the old fixed value, confirmed live at 1440px.
     *   - 418.5px (panel outer 518.5px, the 992-1199px band, the
     *     narrowest width that still uses two columns): 13cqw = 54.4px.
     *     Min content width needed = 378.3125*(54.4/59) = 348.8px.
     *     Actual available width there is ~393.5px — 44.7px of margin.
     *   - Lower still (298.5px, the old 398.5px-panel band that used to
     *     overflow by 104px): 13cqw = 38.8px, needing 248.9px against
     *     ~273.5px available — 24.6px of margin. That band no longer
     *     occurs in two-column mode after the breakpoint move, but the
     *     formula holds safely there too, as a margin of safety rather
     *     than a second single point of failure.
     */
    font-size: clamp(24px, 13cqw, 59px);
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.04;
    letter-spacing: -0.018em;
    color: var(--baq-paper);
}

.baq-hero h1 em {
    font-style: normal;
    color: #d7a4a8;
}

/* Same specificity fix as .baq-eyebrow above: raised to (0,3,0) so this
   rule's own max-width:430px wins over the sitewide reading rule's
   680px, which was silently overriding it (font-size happened to already
   agree with the reading rule's 18px, so only max-width was visibly wrong). */
.baq-hero-copy.baq-hero-copy.baq-hero-copy {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-base-size);
    line-height: var(--baq-text-base-line);
    color: #d7d0ca;
    margin-top: 25px;
    max-width: 430px;
}

.baq-hero-copy strong {
    color: var(--baq-paper);
    font-weight: 500;
}

.baq-hero-actions {
    display: flex;
    align-items: center;
    gap: 24px;
    margin-top: 29px;
    flex-wrap: wrap;
}

.baq-btn-primary {
    display: inline-block;
    font-family: var(--baq-font-body);
    background: var(--baq-paper);
    color: var(--baq-ink);
    padding: 15px 20px;
    font-size: var(--baq-text-label-size);
    letter-spacing: 0.13em;
    text-transform: uppercase;
    border: 1px solid var(--baq-paper);
}

.baq-btn-primary:hover,
.baq-btn-primary:focus-visible {
    background: transparent;
    color: var(--baq-paper);
}

.baq-quiet-link {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-meta-size);
    border-bottom: 1px solid var(--baq-gold);
    padding-bottom: 4px;
    color: var(--baq-ink);
}

.baq-hero .baq-quiet-link {
    color: var(--baq-paper);
}

/* ---- promise strip ---- */

.baq-promise {
    background: var(--baq-taupe);
    padding: 27px 0;
}

.baq-promise-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
}

/* === BAQ promise grid, 561-767px === */
@media (min-width: 561px) and (max-width: 767px) {
  .baq-promise-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* === end BAQ promise grid === */

.baq-promise-item {
    text-align: center;
    border-right: 1px solid rgba(20, 15, 12, 0.18);
    padding: 2px 22px;
}

.baq-promise-item:last-child {
    border-right: 0;
}

.baq-promise-item strong {
    font-family: var(--baq-font-display);
    font-size: var(--baq-display-floor);
    font-weight: var(--baq-weight-display-sm);
    display: block;
}

.baq-promise-item span {
    display: block;
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-label-size);
    letter-spacing: 0.17em;
    text-transform: uppercase;
    margin-top: 6px;
}

/* ---- split editorial (intro) ---- */

.baq-split {
    padding: 100px 0;
    background: var(--baq-bone);
}

.baq-split-grid {
    display: grid;
    grid-template-columns: 5fr 7fr;
    gap: 85px;
    align-items: start;
}

.baq-split h2 {
    font-size: 49px;
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.1;
    margin-top: 17px;
}

.baq-split-copy {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-base-size);
    line-height: var(--baq-text-base-line);
    color: #4f4945;
}

.baq-split-copy p + p {
    margin-top: 19px;
}

/* ---- three-route finder (see application/blocks/route_finder) ---- */

.baq-find {
    padding: 104px 0;
}

.baq-section-head {
    display: grid;
    grid-template-columns: 7fr 5fr;
    gap: 70px;
    align-items: end;
    margin-bottom: 44px;
}

.baq-section-head h2 {
    font-size: 50px;
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.08;
    margin-top: 14px;
}

.baq-section-head p {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-base-size);
    line-height: var(--baq-text-base-line);
    color: #625b55;
    padding-bottom: 5px;
}

.baq-route-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 18px;
}

.baq-route {
    min-height: 300px;
    background: var(--baq-charcoal);
    color: var(--baq-paper);
    padding: 30px;
    position: relative;
    border-top: 2px solid var(--baq-gold);
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
}

/*
 * Text flipped to ink: this card used to inherit .baq-route's paper
 * (white) text, which worked against the old dark rose (#b67c82) but
 * fails against the lighter #d0a0a5 (paper on it is 2.24:1). Ink on the
 * new rose is 8.71:1. One declaration here is enough — h3, p, the number
 * and the arrow all inherit color with nothing overriding it, the same
 * way .baq-route-light's single color:ink override already reaches all
 * four on that card.
 *
 * border-color: var(--baq-ink), not a border-top redeclaration — same
 * pattern .baq-route-light already uses below: only the color changes,
 * width (2px) and style (solid) still come from .baq-route's own
 * border-top. #e8cacb (the original border color here) was only 1.49:1
 * against the new rose and briefly went without any top-border accent at
 * all; ink restores it in line with the other two cards' motif and reads
 * at the same 8.71:1 the card's text already clears.
 */
.baq-route.baq-route-rose {
    background: var(--baq-rose);
    color: var(--baq-ink);
    border-color: var(--baq-ink);
}

.baq-route.baq-route-light {
    background: var(--baq-taupe);
    color: var(--baq-ink);
    border-color: var(--baq-ink);
}

.baq-route .baq-route-number {
    /*
     * Was Italiana at 21px, switched to DM Sans 500 because Italiana's
     * floor was 28px everywhere and that would have overpowered this
     * corner accent. Bodoni Moda at weight 600 holds up fine at the new,
     * lower display floor (see baq-tokens.css), so display type is back —
     * sized to the floor itself rather than the original 21px, to keep
     * every display-font instance on one consistent minimum.
     */
    position: absolute;
    top: 26px;
    right: 27px;
    font-family: var(--baq-font-display);
    font-weight: var(--baq-weight-display-sm);
    font-size: var(--baq-display-floor);
    opacity: 0.75;
}

.baq-route h3 {
    font-size: 34px;
    font-weight: var(--baq-weight-display-sm);
    line-height: 1.08;
    margin-bottom: 13px;
}

.baq-route p {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-secondary-size);
    line-height: 1.65;
    opacity: 0.78;
}

.baq-route .baq-route-arrow {
    font-size: 20px;
    margin-top: 22px;
}

/* ---- dark photo/text feature (protocol section) ---- */

.baq-dark-feature {
    background: var(--baq-charcoal);
    color: var(--baq-paper);
    padding: 105px 0;
}

.baq-dark-feature-grid {
    display: grid;
    grid-template-columns: 6fr 6fr;
    gap: 76px;
    align-items: center;
}

.baq-dark-feature-photo {
    min-height: 510px;
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
    position: relative;
}

.baq-dark-feature-photo img {
    display: none;
}

.baq-dark-feature h2 {
    font-size: 49px;
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.1;
    margin: 18px 0 23px;
    color: var(--baq-paper);
}

/* Specificity fix, same reasoning as .baq-quote above: raised to
   (0,3,0). Currently unused on any live page — the hand-built
   .baq-dark-feature section has been superseded by the
   baq_dark_two_column container everywhere it's actually placed (see
   .baq-dark-two-column .baq-lead below, which IS live) — fixed anyway
   for consistency, in case this hand-built section is ever reused. */
.baq-dark-feature .baq-lead.baq-lead {
    font-family: var(--baq-font-display);
    font-weight: var(--baq-weight-display-sm);
    color: #d9afb2;
    font-size: var(--baq-display-floor);
    line-height: 1.35;
    margin-bottom: 23px;
}

.baq-dark-feature p:not(.baq-lead):not(.baq-eyebrow) {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-base-size);
    line-height: var(--baq-text-base-line);
    color: #d3ccc6;
}

.baq-dark-feature-list {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 14px 26px;
    margin-top: 28px;
    border-top: 1px solid #555;
    padding-top: 25px;
    list-style: none;
    padding-left: 0;
}

.baq-dark-feature-list li {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-secondary-size);
    letter-spacing: 0.06em;
    color: #e8e1dc;
}

.baq-dark-feature .baq-text-cta {
    color: var(--baq-paper);
    border-color: var(--baq-gold);
}

/* ---- credibility ---- */

.baq-credibility {
    padding: 105px 0;
    background: var(--baq-taupe);
}

.baq-credibility-grid {
    display: grid;
    grid-template-columns: 5fr 7fr;
    gap: 78px;
    align-items: center;
}

.baq-credibility-photo {
    height: 485px;
    background-position: center 25%;
    background-size: cover;
    background-repeat: no-repeat;
    border: 14px solid var(--baq-ink);
}

.baq-credibility-photo img {
    display: none;
}

.baq-credibility h2 {
    font-size: 49px;
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.08;
    margin: 17px 0 22px;
}

/* Specificity fix: the extra .baq-quote raises this to (0,3,0), same
   reasoning as .baq-eyebrow above. Currently unused on any live page —
   the hand-built .baq-credibility section has been superseded by the
   baq_two_column container everywhere it's actually placed (see
   .baq-two-column .baq-quote below, which IS live) — fixed anyway for
   consistency, in case this hand-built section is ever reused. */
.baq-credibility .baq-quote.baq-quote {
    font-family: var(--baq-font-display);
    font-weight: var(--baq-weight-display-sm);
    font-size: var(--baq-display-floor);
    line-height: 1.38;
    color: #4d3435;
    margin-bottom: 22px;
}

/* Specificity fix, same reasoning as .baq-quote above: raised to
   (0,3,0) so max-width:590px wins over the reading rule's 680px.
   Currently unused on any live page, same as .baq-credibility .baq-quote
   above — fixed for consistency. */
.baq-credibility .baq-body-copy.baq-body-copy {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-base-size);
    line-height: var(--baq-text-base-line);
    max-width: 590px;
}

/* Specificity fix, same as .baq-eyebrow above: raised to (0,3,0). Was
   rendering at 18px instead of this rule's own 13px label size. */
.baq-signature.baq-signature.baq-signature {
    margin-top: 25px;
    padding-left: 16px;
    border-left: 1px solid var(--baq-gold);
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-label-size);
    letter-spacing: 0.16em;
    text-transform: uppercase;
}

/*
 * ---- two-column container (baq_two_column) ----
 *
 * Scoped to classes the container template itself emits
 * (application/themes/baq/elements/containers/baq_two_column.php), not to
 * .baq-credibility or any Concrete-generated identifier. Values here are a
 * deliberate duplicate of the .baq-credibility rules above (kept untouched)
 * so the two are independent: this container can be reused elsewhere on the
 * site with a different type scale later without touching the original
 * hand-built section, and vice versa.
 *
 * --baq-two-column-ratio / --baq-two-column-bg are the configurable knobs:
 * an editor can override either per placement from that block's own Custom
 * Style (Design) panel (e.g. --baq-two-column-ratio: 7fr 5fr;) without a
 * second, mirrored container file.
 */

.baq-two-column {
    padding: 105px 0;
    background: var(--baq-two-column-bg, var(--baq-taupe));
}

.baq-two-column-grid {
    display: grid;
    grid-template-columns: var(--baq-two-column-ratio, 5fr 7fr);
    gap: 78px;
    align-items: center;
}

.baq-two-column-photo {
    position: relative;
    height: 485px;
    border: 14px solid var(--baq-ink);
    overflow: hidden;
}

/* Applied by the container template (baq_two_column.php) when the Photo
   area has no block in it at all, so the text column runs full width
   instead of sitting next to an empty bordered panel. */
.baq-two-column-grid--text-only {
    grid-template-columns: 1fr;
}

/*
 * The photo panel is a standard Image block (a real <img>), not a CSS
 * background like .baq-credibility-photo. object-fit replicates the same
 * crop at the same box height instead of a background-image hack.
 *
 * position:absolute + inset:0 is deliberate, not decorative: the grid
 * container area wraps the block in its own nested .container/.row/
 * col-md-12/picture chain, and that nested Bootstrap .container does not
 * reliably resolve to 100% of .baq-two-column-photo's width (it's sized
 * against the grid-container feature's own layout, which lands narrower
 * than the photo panel). Taking the img out of flow and anchoring it to
 * the nearest positioned ancestor (.baq-two-column-photo itself) sizes it
 * against that ancestor directly and skips the nested chain's own width
 * entirely, which plain width/height:100% on the img does not.
 */
.baq-two-column-photo img {
    position: absolute;
    inset: 0;
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center 25%;
}

.baq-two-column h2 {
    font-size: 49px;
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.08;
    margin: 17px 0 22px;
}

/* Specificity fix, same reasoning as .baq-credibility .baq-quote above:
   raised to (0,3,0). This one IS live — used on the homepage's
   credibility section and twice on About Bronwyn — and was confirmed
   rendering as plain 18px DM Sans instead of this rule's own 24px BAQ
   Elegante display face before this fix. */
.baq-two-column .baq-quote.baq-quote {
    font-family: var(--baq-font-display);
    font-weight: var(--baq-weight-display-sm);
    font-size: var(--baq-display-floor);
    line-height: 1.38;
    color: #4d3435;
    margin-bottom: 22px;
}

/* Specificity fix, same reasoning as .baq-credibility .baq-body-copy
   above: raised to (0,3,0) so max-width:590px wins over the reading
   rule's 680px. This one IS live, same pages as .baq-two-column .baq-quote
   above. */
.baq-two-column .baq-body-copy.baq-body-copy {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-base-size);
    line-height: var(--baq-text-base-line);
    max-width: 590px;
}

/*
 * ---- hero container (baq_hero) ----
 *
 * .baq-hero / .baq-hero-panel / .baq-hero-copy / .baq-hero-actions / h1
 * rules are all reused verbatim from above — unchanged. Only the photo
 * side is new: the original was a bare background-image with no <img> in
 * the box; this gives it a real, absolutely-positioned <img> instead,
 * same technique as every other converted photo panel.
 */
.baq-hero-photo {
    position: relative;
    overflow: hidden;
    /*
     * new-home-hero.webp is portrait, 1016x1524, a true 2:3 — set directly
     * from the source rather than measured off a render, so the box's
     * ratio always matches the actual file. With a definite width from
     * the row's own flex split, aspect-ratio gives this flex item a
     * definite height too, which is what lets align-items:stretch on
     * .baq-hero leave this box at its own ratio instead of distorting it
     * to match the panel — confirmed live at all five widths tested
     * (1440/1243/1024/768/390), see the verification report.
     */
    aspect-ratio: 2 / 3;
    /*
     * align-self:center, not the row's default stretch: confirmed live at
     * 1024px that stretch was forcing this box ~15px taller than 2:3 (the
     * panel's own text is taller than the photo at that width), which
     * object-fit:contain then had to letterbox inside the image itself.
     * Exempting just this side from stretch keeps the box at exactly its
     * own ratio always — true zero crop AND zero letterbox — while the
     * panel (no align-self override) still stretches to fill whatever the
     * row's tallest side ends up being. Any resulting gap now lands on
     * .baq-hero's true-black background (see above) instead of a lighter
     * charcoal, and only occurs at all in the 992-1199px band where it's
     * a few px, since the band where it used to be ~367px (768-991px) is
     * now stacked instead (see the @media block below).
     */
    align-self: center;
}

.baq-hero-photo img {
    position: absolute;
    inset: 0;
    display: block;
    width: 100%;
    height: 100%;
    /* contain, not cover: the box is now sized to the image's own ratio,
       so there is nothing to crop — contain is the belt-and-suspenders
       choice that guarantees no crop even on a sub-pixel rounding
       mismatch, rather than relying on cover to happen to line up. */
    object-fit: contain;
    object-position: center;
}

/*
 * ---- dark two-column container (baq_dark_two_column) ----
 *
 * Duplicates .baq-dark-feature's values under its own classes (same
 * reasoning as .baq-two-column duplicating .baq-credibility): independent
 * of the original hand-built section, reusable anywhere this dark
 * photo/text shape fits later. .baq-eyebrow, .baq-dark-feature-list/li
 * and the base .baq-text-cta rule are reused verbatim — none of those
 * are scoped to .baq-dark-feature.
 *
 * .baq-photo-label (the caption overlay on the photo) was removed
 * sitewide, not just here — the photo speaks for itself. The rule itself
 * is gone from this file; nothing below references it.
 */
.baq-dark-two-column {
    background: var(--baq-charcoal);
    color: var(--baq-paper);
    padding: 105px 0;
}

.baq-dark-two-column-grid {
    display: grid;
    grid-template-columns: 6fr 6fr;
    gap: 76px;
    align-items: center;
}

.baq-dark-two-column-photo {
    position: relative;
    min-height: 510px;
    overflow: hidden;
}

/* Same reasoning as .baq-two-column-grid--text-only above, applied by
   baq_dark_two_column.php when its Photo area has no block in it. */
.baq-dark-two-column-grid--text-only {
    grid-template-columns: 1fr;
}

.baq-dark-two-column-photo img {
    position: absolute;
    inset: 0;
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
}

.baq-dark-two-column h2 {
    font-size: 49px;
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.1;
    margin: 18px 0 23px;
    color: var(--baq-paper);
}

/* Specificity fix, same reasoning as .baq-dark-feature .baq-lead above:
   raised to (0,3,0). This one IS live today — the homepage's "The BAQ
   protocol" section (a baq_dark_two_column instance) uses a .baq-lead
   paragraph, and it was confirmed rendering at 18px DM Sans instead of
   this rule's own 24px BAQ Elegante display face before this fix. */
.baq-dark-two-column .baq-lead.baq-lead {
    font-family: var(--baq-font-display);
    font-weight: var(--baq-weight-display-sm);
    color: #d9afb2;
    font-size: var(--baq-display-floor);
    line-height: 1.35;
    margin-bottom: 23px;
}

.baq-dark-two-column p:not(.baq-lead):not(.baq-eyebrow) {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-base-size);
    line-height: var(--baq-text-base-line);
    color: #d3ccc6;
}

.baq-dark-two-column .baq-text-cta {
    color: var(--baq-paper);
    border-color: var(--baq-gold);
}

/*
 * ---- two-text container (baq_two_text) ----
 *
 * Covers both baq_split_editorial and baq_first_session_cta's shape: two
 * text columns, no photo. Every value that differs between those two
 * (ratio, gap, alignment, section padding, grid-box padding/border,
 * heading size/margin) is a custom property with a fallback defaulting to
 * the split_editorial shape; the first_session_cta placement overrides
 * the lot via a custom class through that block's own Custom Style
 * panel. .baq-split-copy, .baq-first-side and its child rules, and
 * .baq-text-cta are reused verbatim — none of those are scoped to
 * .baq-split/.baq-first, they're either bare or scoped to the panel class
 * itself, which lives in the content block's own markup.
 */
.baq-two-text {
    padding: var(--baq-two-text-padding, 100px 0);
    background: var(--baq-two-text-bg, var(--baq-bone));
}

.baq-two-text-grid {
    display: grid;
    grid-template-columns: var(--baq-two-text-ratio, 5fr 7fr);
    gap: var(--baq-two-text-gap, 85px);
    align-items: var(--baq-two-text-align, start);
}

.baq-two-text h2 {
    font-size: var(--baq-two-text-heading-size, 49px);
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.1;
    margin-top: var(--baq-two-text-heading-margin-top, 17px);
}

/*
 * ---- first_session_cta variant of baq_two_text ----
 *
 * Assigned via that block instance's Custom Style (Design) panel custom
 * class (Concrete\Core\Entity\StyleCustomizer\Inline\StyleSet::
 * setCustomClass), not a second container file.
 *
 * Plain overrides, not custom properties, for border/padding: the base
 * .baq-two-text-grid rule deliberately declares no `padding` of its own
 * (only .baq-shell's 0/34px applies there, matching split_editorial's
 * inset grid content exactly) — a `padding` fallback of `0` on the base
 * rule would win the cascade over .baq-shell's horizontal padding on the
 * same element and bleed split_editorial's grid to the full section width.
 * first_session_cta's own .baq-first-box already bleeds that way in the
 * original (confirmed by direct measurement), so this variant reproduces
 * it deliberately, scoped to only this one instance.
 *
 * background: taupe, not the base rule's bone fallback — same token the
 * credibility container (.baq-two-column) uses, so the homepage's last
 * two sections (this one and the testimonial box, both bone before) no
 * longer read as one continuous band. A literal value here rather than
 * a --baq-two-text-bg override, consistent with how this variant already
 * overrides everything else below.
 */
.baq-first-cta-variant .baq-two-text {
    padding: 94px 0;
    background: var(--baq-rose);
}

/*
 * padding-top/padding-bottom, not the `padding: 45px 0` shorthand used
 * before: this element also carries .baq-shell (padding: 0 34px), and
 * the shorthand — even set to `0` on the horizontal axis — still counts
 * as a declaration of padding-left/padding-right, which at equal-or-higher
 * specificity overrides .baq-shell's 34px and bleeds the content flush to
 * the section edge. That's exactly the bug this file's own comment above
 * .baq-two-text-grid was written to avoid, just reintroduced here by this
 * variant. Longhand top/bottom-only properties leave padding-left/right
 * undeclared on this rule, so .baq-shell's 34px (21px under 560px, same
 * as everywhere else) is what actually applies.
 */
.baq-first-cta-variant .baq-two-text-grid {
    grid-template-columns: 7fr 5fr;
    gap: 70px;
    align-items: center;
    padding-top: 45px;
    padding-bottom: 45px;
    border-top: 1px solid var(--baq-ink);
    border-bottom: 1px solid var(--baq-ink);
}

.baq-first-cta-variant .baq-two-text h2 {
    font-size: 45px;
    margin-top: 14px;
}

/* ---- first-session CTA ---- */

.baq-first {
    background: var(--baq-bone);
    padding: 94px 0;
}

.baq-first-box {
    display: grid;
    grid-template-columns: 7fr 5fr;
    align-items: center;
    border-top: 1px solid var(--baq-ink);
    border-bottom: 1px solid var(--baq-ink);
    padding: 45px 0;
    gap: 70px;
}

.baq-first h2 {
    font-size: 45px;
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.1;
    margin-top: 14px;
}

/*
 * No border-left here anymore. --baq-rule against taupe computed to
 * 1.34:1; against rose it's ~2.00:1 — both well under the 3:1 floor for
 * a visible graphical divider. A line nobody can see isn't doing
 * anything, so it's removed rather than recolored; the padding-left
 * alone still keeps the two panels visually separated.
 */
.baq-first-side {
    padding-left: 42px;
}

/*
 * Was plain `.baq-first-price` (0,1,0) — lost to `.baq-first-side p`
 * (0,1,1) below, which is a more specific selector for any <p>, class or
 * not. The price was silently rendering at 12px instead of 43px. Scoping
 * this selector to its actual container fixes that outright.
 */
.baq-first-side .baq-first-price {
    font-family: var(--baq-font-display);
    font-weight: var(--baq-weight-display-lg);
    font-size: 43px;
    margin-bottom: 9px;
}

.baq-first-side p {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-secondary-size);
    line-height: 1.65;
    color: var(--baq-ink);
    margin-bottom: 22px;
}

.baq-first-side .baq-btn-primary {
    background: var(--baq-ink);
    color: var(--baq-paper);
    border-color: var(--baq-ink);
}

/* ---- responsive ---- */

@media (max-width: 820px) {
    .baq-split-grid,
    .baq-dark-feature-grid,
    .baq-credibility-grid {
        grid-template-columns: 1fr;
    }

    .baq-route-grid {
        grid-template-columns: 1fr 1fr;
    }

    .baq-two-column-grid {
        grid-template-columns: 1fr;
    }

    .baq-dark-two-column-grid,
    .baq-two-text-grid {
        grid-template-columns: 1fr;
    }

    /* first_session_cta stays two columns until 560px, same as the original .baq-first-box */
    .baq-first-cta-variant .baq-two-text-grid {
        grid-template-columns: 7fr 5fr;
    }
}

/*
 * Stacking point moved from max-width:767.98px to max-width:991.98px.
 *
 * The old value was itself arbitrary relative to what actually controls
 * this row's width: an ancestor Bootstrap .container, whose max-width
 * steps at fixed bands (540px/720px/960px/1140px at the 576/768/992/1200
 * viewport breakpoints), not a smooth function of viewport width. That
 * means .baq-hero's own rendered row width also steps at those same
 * points — measured directly: ~1116px total for any viewport >=1200px,
 * ~936px for 992-1199px, and ~696px for 768-991px. The 768-991px band
 * (which includes 976px) was two-column under the old rule, giving a
 * 398.5px panel — too narrow for the 59px H1 (needs 378.3125px just for
 * the unbreakable "Body Sculpting" run, before any of the rest of the
 * line) — while the 992-1199px band, at 518.5px, was and remains fine.
 *
 * 991.98px is not a second guess independent of that: it's the exact
 * edge of Bootstrap's own lg breakpoint, so it reclassifies the entire
 * 768-991px band as stacked (full-width, no row-height sharing with the
 * photo, so no letterbox-style gap either) while leaving 992px and up
 * untouched. There is no viewport value this can fail to cover the way
 * 767.98px failed to cover 768-991px, because it's aligned to the same
 * breakpoint system that creates the bands in the first place, rather
 * than an independently chosen number. The h1 clamp above is the second,
 * independent layer that keeps this safe even if that weren't true.
 */
@media (max-width: 991.98px) {
    .baq-hero {
        flex-direction: column;
        min-height: 0;
    }

    .baq-hero-photo {
        order: -1;
        flex: none;
        width: 100%;
        /* was padding-top:62% (a fixed ratio sized for the old 784x844
           crop). The new photo is portrait (2:3), so the box now follows
           the same aspect-ratio declared in the desktop rule instead of a
           different hardcoded percentage — one ratio, not two to keep
           in sync. */
    }

    .baq-hero-panel {
        flex: none;
        width: 100%;
        min-width: 0;
        background: var(--baq-ink);
        border-left: 0;
        padding: 37px 28px;
    }

    /*
     * Removes nowrap at the same point the hero already stacks at, not a
     * new one invented for this purpose. Only safe to do now that
     * .baq-eyebrow is fixed back to its own 13px (see the specificity fix
     * above) — at the 18px it was rendering at before, this same change
     * would have wrapped to 3 lines on real phone widths (360/390),
     * which is why it wasn't done until that was fixed. At the correct
     * 13px, confirmed by direct measurement: 2 lines at 360/390/414, 1
     * line at 560 and above within this stacked range.
     */
    .baq-hero-panel .baq-eyebrow {
        white-space: normal;
    }

    /*
     * The object-position:center 35% bias that lived here was specific to
     * cropping the old 784x844 photo — now that .baq-hero-photo is sized
     * to the new image's own 2:3 ratio and object-fit is contain, there is
     * no crop to bias at any width, so this override is removed rather
     * than carried forward describing a crop that no longer happens.
     */
}

@media (max-width: 560px) {
    .baq-shell {
        padding-left: 21px;
        padding-right: 21px;
    }

    .baq-promise-grid,
    .baq-route-grid,
    .baq-section-head,
    .baq-first-box,
    .baq-first-cta-variant .baq-two-text-grid {
        grid-template-columns: 1fr;
    }

    .baq-promise-item {
        border-right: 0;
        border-bottom: 1px solid rgba(20, 15, 12, 0.18);
        padding: 15px 0;
    }

    .baq-promise-item:last-child {
        border-bottom: 0;
    }

    .baq-split,
    .baq-find,
    .baq-dark-feature,
    .baq-credibility,
    .baq-first {
        padding: 72px 0;
    }

    .baq-split-grid,
    .baq-section-head,
    .baq-dark-feature-grid,
    .baq-credibility-grid {
        gap: 35px;
    }

    .baq-split h2,
    .baq-section-head h2,
    .baq-dark-feature h2,
    .baq-credibility h2,
    .baq-first h2 {
        font-size: 39px;
    }

    .baq-dark-feature-photo,
    .baq-credibility-photo {
        min-height: 390px;
        height: 390px;
    }

    .baq-first-side {
        padding: 28px 0 0;
    }

    .baq-two-column {
        padding: 72px 0;
    }

    .baq-two-column-grid {
        gap: 35px;
    }

    .baq-two-column h2 {
        font-size: 39px;
    }

    .baq-two-column-photo {
        min-height: 390px;
        height: 390px;
    }

    .baq-dark-two-column,
    .baq-two-text {
        padding: 72px 0;
    }

    .baq-dark-two-column-grid {
        gap: 35px;
    }

    .baq-two-text-grid {
        grid-template-columns: 1fr;
    }

    .baq-dark-two-column h2,
    .baq-two-text h2 {
        font-size: 39px;
    }

    .baq-dark-two-column-photo {
        min-height: 390px;
        height: 390px;
    }
}

/*
 * ---- plain content-block reading typography ----
 *
 * Brings the site's intended 18px/1.65 reading experience to plain
 * "content" blocks (no custom template) on interior pages, without
 * touching any of the six baq_* section templates.
 *
 * Scoping note, updated: originally scoped to `.col-md-12
 * .ccm-block-content` alone. That wrapper is emitted by the theme's own
 * blocks/content/view.php, not by core or by the block itself — when the
 * theme fork omitted that file, `.ccm-block-content` silently stopped
 * appearing at all and this rule stopped matching anything, sitewide,
 * with no error. Restored the missing file, but the selector itself
 * should not depend on a single theme file staying in place to keep
 * working, so this now targets a plain block's `<p>`/`<ul>`/`<ol>`/`<li>`/
 * `<blockquote>` as a DIRECT CHILD of `.col-md-12` (today's fallback
 * shape when no wrapper exists) OR as a direct child of a
 * `.ccm-block-content` that is itself a direct child of `.col-md-12`
 * (the wrapper's normal shape once present) — either way, matching only
 * one level deep.
 *
 * This is what keeps it away from the six baq_* templates and the
 * Express Form block: every one of the six always wraps its own content
 * in `<section class="baq-...">` as the immediate child of `.col-md-12`
 * (confirmed directly against the live DOM, including each template's
 * degraded/fallback-rendering paths), and the Express Form block wraps
 * in `.ccm-block-express-form`, not `.ccm-block-content` — so a `>`
 * child combinator can never reach into either, regardless of how deep
 * their own markup nests. The FAQ accordion wraps in
 * `.accordion.ccm-block-accordion` for the same reason. The footer's
 * plain-content address block sits outside `.col-md-12` entirely, so it
 * stays untouched either way.
 */

.col-md-12 > p,
.col-md-12 > ul,
.col-md-12 > ol,
.col-md-12 > li,
.col-md-12 > .ccm-block-content > p,
.col-md-12 > .ccm-block-content > ul,
.col-md-12 > .ccm-block-content > ol,
.col-md-12 > .ccm-block-content > li {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-base-size);
    line-height: var(--baq-text-base-line);
}

.col-md-12 > p,
.col-md-12 > ul,
.col-md-12 > ol,
.col-md-12 > blockquote,
.col-md-12 > .ccm-block-content > p,
.col-md-12 > .ccm-block-content > ul,
.col-md-12 > .ccm-block-content > ol,
.col-md-12 > .ccm-block-content > blockquote {
    max-width: var(--baq-reading-measure);
}

/*
 * ---- content heading measure ----
 *
 * h2/h3/h4 inside a plain content block ran the full 1116px column width
 * instead of the 680px reading measure above them, on every content page
 * (confirmed on both /prep-and-aftercare and a blog post, identical
 * markup shape). Same selector shape as the paragraph rule above, plus
 * two exclusions the paragraph rule doesn't need:
 *
 * `:not(section[class*="baq-"] *)` — every one of the five baq_*
 * container templates (baq_hero, baq_two_column, baq_dark_two_column,
 * baq_two_text, baq_promise_strip) builds its editable regions with
 * `ContainerArea(...)->enableGridContainer()`, and enableGridContainer()
 * wraps that region in its OWN full `.container > .row > .col-md-12`,
 * nested inside the section. So a heading typed into, say, baq_two_text's
 * "Head" area sits at `section.baq-two-text ... .col-md-12 >
 * .ccm-block-content > h2` — confirmed live (baq_two_text's own H2,
 * homepage) — which the plain `.col-md-12 > .ccm-block-content > h2`
 * selector matches just as readily as real page content, because nothing
 * in that selector distinguishes a page-level `.col-md-12` from one
 * nested inside a section three levels down. This exclusion rules out
 * ANY heading anywhere under a `section` whose class contains "baq-",
 * regardless of how many container/row/col-md-12 layers separate them.
 *
 * `:not([class*="baq-"])` — independent safety net for a heading that
 * carries a baq- class without being inside a baq- section at all (e.g.
 * hand-added in a plain content block).
 *
 * The homepage hero H1, the testimonial box and the footer don't need
 * either exclusion: all three sit outside `.col-md-12` entirely
 * (confirmed by direct template inspection), so the base selector never
 * reaches them regardless.
 *
 * Only max-width is set here, not font-size/line-height/font-family —
 * headings keep their own heading styling, they just stop overrunning
 * the column.
 */
.col-md-12 > h2:not([class*="baq-"]):not(section[class*="baq-"] *),
.col-md-12 > h3:not([class*="baq-"]):not(section[class*="baq-"] *),
.col-md-12 > h4:not([class*="baq-"]):not(section[class*="baq-"] *),
.col-md-12 > .ccm-block-content > h2:not([class*="baq-"]):not(section[class*="baq-"] *),
.col-md-12 > .ccm-block-content > h3:not([class*="baq-"]):not(section[class*="baq-"] *),
.col-md-12 > .ccm-block-content > h4:not([class*="baq-"]):not(section[class*="baq-"] *) {
    max-width: var(--baq-reading-measure);
}

.col-md-12 > blockquote,
.col-md-12 > .ccm-block-content > blockquote {
    font-family: var(--baq-font-display);
    font-weight: var(--baq-weight-display-sm);
    font-size: var(--baq-display-floor);
    line-height: 1.4;
    margin: 28px 0;
    padding-left: 20px;
    border-left: 2px solid var(--baq-gold);
}

/*
 * ---- express_form submit button ----
 *
 * The block emits plain Bootstrap markup (<button class="btn btn-primary">)
 * with no BAQ class of its own, so it renders in the Atomik skin's stock
 * `.btn-primary` blue. Scoped to `.ccm-block-express-form`, the wrapper
 * the block's own view.php renders unconditionally, so this can't reach
 * a Bootstrap button anywhere else on the site.
 *
 * Values are reused, not invented: padding/font-size/letter-spacing/
 * text-transform match `.baq-reserve-btn` (the header button, the site's
 * most-seen instance of this button family). The paper/ink pairing is
 * inverted from that base recipe on purpose: `.baq-reserve-btn` and
 * `.baq-btn-primary` are both a light button on a dark ground (header bar,
 * dark hero panel), and this button sits on the page's plain paper
 * background instead — the same situation `.baq-first-side .baq-btn-primary`
 * already solves by swapping to an ink background with paper text. That
 * existing swap is reused here rather than the literal base colors, which
 * would render as a paper button on a paper page.
 *
 * The hover color is derived, not copied verbatim, for the same reason:
 * the base pattern's hover (transparent + paper text) only reads because
 * it's still on a dark ground. On this light ground the equivalent is
 * transparent + ink text, which is what actually stays legible here.
 *
 * Bootstrap 5.3's `.btn` reads everything through `--bs-btn-*` custom
 * properties (confirmed in the compiled skin CSS), so overriding those
 * on this scoped selector is enough to win over `.btn-primary` without
 * `!important` — specificity (0,3,0) against its (0,1,0).
 */

.ccm-block-express-form .btn.btn-primary {
    --bs-btn-font-family: var(--baq-font-body);
    --bs-btn-font-size: var(--baq-text-label-size);
    --bs-btn-font-weight: 400;
    --bs-btn-padding-x: 16px;
    --bs-btn-padding-y: 13px;
    --bs-btn-color: var(--baq-paper);
    --bs-btn-bg: var(--baq-ink);
    --bs-btn-border-color: var(--baq-ink);
    --bs-btn-border-radius: 0;
    --bs-btn-hover-color: var(--baq-ink);
    --bs-btn-hover-bg: transparent;
    --bs-btn-hover-border-color: var(--baq-ink);
    --bs-btn-active-color: var(--baq-ink);
    --bs-btn-active-bg: transparent;
    --bs-btn-active-border-color: var(--baq-ink);
    --bs-btn-focus-box-shadow: none;
    letter-spacing: 0.12em;
    text-transform: uppercase;
}

/*
 * Neither `.baq-reserve-btn` nor `.baq-btn-primary` has a real focus ring
 * of its own (their :focus-visible is just the hover color swap) — added
 * here deliberately since this is a form, reusing the site's own existing
 * focus-ring convention (`.baq-nav-check:focus-visible + label`) rather
 * than inventing a new one.
 */
.ccm-block-express-form .btn.btn-primary:focus-visible {
    outline: 2px solid var(--baq-gold);
    outline-offset: 2px;
}

/*
 * ---- .baq-btn-primary on a plain content block (light ground) ----
 *
 * `.baq-btn-primary`'s base recipe is paper background / ink text, meant
 * for a dark ground (the hero panel). `.baq-first-side .baq-btn-primary`
 * already inverts it to ink/paper for its lighter `--baq-bone` box, but
 * that inversion is coupled to `.baq-first-side`'s own layout (a left
 * border and left padding this isn't paired with here) rather than being
 * a freestanding class any plain content block can reach. Plain content
 * blocks always sit on the page's own paper background, so a bare
 * `.baq-btn-primary` here would render paper-on-paper, invisible. This
 * scopes the same existing ink/paper inversion to any plain content block
 * instead, so the markup only ever needs `class="baq-btn-primary"` — no
 * new class, and no new color values, just the existing pairing applied
 * without the CTA-box layout attached to it.
 *
 * Hover is derived the same way it was for the express_form button: the
 * base pattern's hover (transparent + paper text) only reads on a dark
 * ground. Here the equivalent is transparent + ink text.
 */
.col-md-12 .ccm-block-content .baq-btn-primary {
    background: var(--baq-ink);
    color: var(--baq-paper);
    border-color: var(--baq-ink);
}

.col-md-12 .ccm-block-content .baq-btn-primary:hover,
.col-md-12 .ccm-block-content .baq-btn-primary:focus-visible {
    background: transparent;
    color: var(--baq-ink);
}

/*
 * ---- plain inline links in body copy ----
 *
 * Bare <a> tags in prose have no color rule anywhere in this theme (no
 * `a {}` / `a:link` exists in this file or in baq-header-footer.css), so
 * they fall back to Atomik's stock link blue, #2d7ac0 — 4.44:1 on paper,
 * below the 4.5:1 AA floor for normal text, and unrelated to anything
 * else in the palette. #8f5a60 (a darkened --baq-rose) replaces it:
 * 5.44:1 on paper, 4.54:1 on --baq-bone, both clearing 4.5:1. A live
 * sitewide crawl (all 30 pages) found no plain inline link on a dark
 * background, so no separate dark-ground variant is needed.
 *
 * Scoped to `.container .ccm-block-content a` and `.container
 * .accordion-body a` — the two structural wrappers that actually hold
 * prose links (container sections like .baq-two-column/
 * .baq-dark-two-column render their text through `.ccm-block-content` the
 * same as a plain content block, so this already reaches "container text
 * areas" without a separate selector), gated on a `.container` ancestor.
 * That gate is load-bearing, not decorative: blocks/content/view.php
 * emits the same `.ccm-block-content` wrapper for ANY content block
 * anywhere, including the footer's own address/phone block, which is
 * NOT inside `.container` (confirmed against the live DOM) — a bare
 * `.ccm-block-content a` selector reached in and overrode the footer's
 * own `.baq-footer a { color: #cbc4be }` rule on specificity alone
 * (0,1,1 beats 0,1,0), breaking its contrast; requiring `.container`
 * closes that gap structurally. The header nav and testimonial box are
 * excluded the same way — neither lives inside `.container` either. The
 * FAQ accordion's own toggle is a <button>, never an <a>, so it can't
 * match this selector at all regardless of scoping.
 *
 * `.baq-text-cta`, `.baq-btn-primary`, `.baq-reserve-btn` and
 * `.baq-quiet-link` links are already confirmed to sometimes nest inside
 * `.ccm-block-content` (see the `.baq-btn-primary` override just above),
 * where a bare `.ccm-block-content a` would in fact outrank their own
 * class rule on specificity alone. Excluded with :not() instead, so the
 * selector structurally cannot match those elements — not relying on
 * losing a specificity fight that a future rule change could flip.
 *
 * Hover darkens further (#72484d, 7.51:1 on paper / 6.26:1 on bone) so
 * the state reads as a color change, not just a rounding difference.
 * Focus-visible adds a 2px outline in that same hover color, the same
 * focus-ring convention already used elsewhere in this theme (e.g. the
 * express_form submit button above) rather than inventing a new one.
 * Underline stays in all three states, so color is never the only
 * indicator.
 */
.container .ccm-block-content a:not(.baq-text-cta):not(.baq-btn-primary):not(.baq-reserve-btn):not(.baq-quiet-link),
.container .accordion-body a:not(.baq-text-cta):not(.baq-btn-primary):not(.baq-reserve-btn):not(.baq-quiet-link) {
    color: #8f5a60;
    text-decoration: underline;
}

.container .ccm-block-content a:not(.baq-text-cta):not(.baq-btn-primary):not(.baq-reserve-btn):not(.baq-quiet-link):hover,
.container .accordion-body a:not(.baq-text-cta):not(.baq-btn-primary):not(.baq-reserve-btn):not(.baq-quiet-link):hover {
    color: #72484d;
    text-decoration: underline;
}

.container .ccm-block-content a:not(.baq-text-cta):not(.baq-btn-primary):not(.baq-reserve-btn):not(.baq-quiet-link):focus-visible,
.container .accordion-body a:not(.baq-text-cta):not(.baq-btn-primary):not(.baq-reserve-btn):not(.baq-quiet-link):focus-visible {
    outline: 2px solid #72484d;
    outline-offset: 2px;
    text-decoration: underline;
}

/*
 * ---- baq-split-grid / baq-first-box degradation ----
 *
 * Both templates echo their block content raw into a fixed two-column
 * grid with no PHP-side structure check. If a WYSIWYG save merges the
 * two authored divs into one, the lone child would otherwise sit in the
 * grid's first column only, leaving the second column as dead space.
 * Spanning a lone child across both tracks keeps it reading as a normal
 * single-column block instead. If a save instead leaves three children
 * behind, the third already wraps to its own row under grid auto-flow;
 * spanning that third item full-width reads as an intentional line
 * underneath the two columns rather than an orphaned half-width leftover.
 */
.baq-split-grid > *:only-child,
.baq-first-box > *:only-child {
    grid-column: 1 / -1;
}

.baq-split-grid > *:nth-child(3):last-child,
.baq-first-box > *:nth-child(3):last-child {
    grid-column: 1 / -1;
}

/*
 * ---- .baq-cta-center on a plain content block ----
 *
 * Replaces inline style="text-align:center; margin: 2rem 0;" on the two
 * plain-content CTA paragraphs (Contact, Booking) — a WYSIWYG save strips
 * inline style attributes on the standard CKEditor profile this site
 * runs, so the centering has to live in CSS instead. Values are copied
 * verbatim from the inline style so nothing moves. Scoped the same way
 * as the .baq-btn-primary plain-content-block rule above.
 */
.col-md-12 .ccm-block-content .baq-cta-center {
    text-align: center;
    margin: 2rem 0;
}

/*
 * ---- Layout-block pilot: About Bronwyn bID 82 replacement (bID 88) ----
 *
 * Scoped entirely to .baq-credibility-pilot, a custom class assigned to
 * this one Layout block instance through Concrete's own Design/Style
 * system (Entity\StyleCustomizer\Inline\StyleSet), not to Concrete's
 * generated .ccm-layout-column-* classes directly. Those are the Layout
 * block's own implementation detail and could change in a future core
 * update; every rule below still has to reference them to style the
 * actual DOM, but qualifying each one with this unique class means only
 * this one instance goes stale if they ever do, not every Layout block
 * sitewide.
 *
 * .container is Bootstrap's own class (stepped breakpoint max-widths:
 * 540/720/960/1140/1320), not this site's .baq-shell convention
 * (max-width:1180px; padding:0 34px) -- confirmed by direct measurement
 * they diverge at this viewport (1140px vs. 1180px) and would diverge
 * further at wider ones. Overridden here to match .baq-shell exactly so
 * this section's width tracks its neighbors instead of Bootstrap's own
 * container steps.
 *
 * Confirmed live and unstyled before this CSS: Concrete's own custom
 * column width (set via setAreaLayoutColumnWidth) does not render as any
 * usable frontend width for an anonymous visitor at all -- the column
 * div was measured at a literal 42px wide (the raw number, not a
 * percentage) with no supporting CSS. The grid layout below fully
 * replaces that mechanism rather than trying to make it work.
 *
 * The Image block's <img> replaces the old CSS background-image treatment.
 * object-fit:cover with the same height/border reproduces it visually
 * from a real <img> tag instead of a div background.
 */

.baq-credibility-pilot {
    background: var(--baq-taupe);
    padding: 105px 0;
}

.baq-credibility-pilot .container {
    max-width: 1180px;
    padding: 0 34px;
    margin: 0 auto;
}

.baq-credibility-pilot .ccm-layout-column-wrapper {
    display: grid;
    grid-template-columns: 5fr 7fr;
    gap: 78px;
    align-items: center;
}

/*
 * Concrete's generated per-instance stylesheet also adds a float-based
 * clearfix (::before/::after with content:"" and display:table) to this
 * wrapper, left over from the Layout block's legacy float layout. Under
 * display:grid those pseudo-elements become real grid items -- content:""
 * still generates a box -- silently consuming the first grid cell and
 * pushing the two real columns out of position (confirmed directly: the
 * image column measured the second track's width and sat in the second
 * position, with the content column wrapping to a second implicit row at
 * the first track's width). Removing them is safe: clearfix has no
 * purpose once the wrapper is a grid container.
 */
.baq-credibility-pilot .ccm-layout-column-wrapper::before,
.baq-credibility-pilot .ccm-layout-column-wrapper::after {
    content: none;
    display: none;
}

.baq-credibility-pilot .ccm-layout-column,
.baq-credibility-pilot .ccm-layout-column-inner {
    /*
     * !important is deliberate: Concrete generates a per-instance
     * stylesheet with a double-ID selector
     * (#ccm-layout-column-wrapper-{arLayoutID} div#ccm-layout-column-{id})
     * hardcoding this column to the raw pixel number stored via
     * setAreaLayoutColumnWidth (42/58, not a percentage) -- specificity
     * (2,0,0), which beats any class-based rule regardless of source
     * order. Confirmed directly in the live stylesheet, not assumed.
     * Hardcoding this instance's own generated IDs here instead would be
     * more fragile, not less -- those IDs are exactly the kind of
     * Concrete-generated implementation detail this whole approach is
     * meant to avoid depending on.
     */
    width: 100% !important;
    min-width: 0;
}

.baq-credibility-pilot picture {
    display: block;
    width: 100%;
}
.baq-credibility-pilot .ccm-image-block {
    display: block;
    width: 100%;
    height: 485px;
    object-fit: cover;
    object-position: 50% 25%;
    border: 14px solid var(--baq-ink);
}

.baq-credibility-pilot .baq-eyebrow {
    margin: 0 0 16px;
    color: var(--baq-ink);
}

.baq-credibility-pilot h2 {
    font-size: 49px;
    font-weight: var(--baq-weight-display-lg);
    line-height: 1.08;
    margin: 17px 0 22px;
    color: var(--baq-ink);
}

.baq-credibility-pilot .baq-quote {
    font-family: var(--baq-font-display);
    font-weight: var(--baq-weight-display-sm);
    font-size: var(--baq-display-floor);
    line-height: 1.38;
    color: #4d3435;
    margin: 0 0 22px;
}

.baq-credibility-pilot .baq-body-copy {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-base-size);
    line-height: var(--baq-text-base-line);
    max-width: 590px;
    margin: 0 0 16px;
    color: var(--baq-ink);
}

@media (max-width: 820px) {
    .baq-credibility-pilot .ccm-layout-column-wrapper {
        grid-template-columns: 1fr;
    }
}

/*
 * ---- blog entry (blog_entry.php page template) ----
 *
 * .baq-page-header is reused verbatim from the standalone-H1 pattern
 * above (About Bronwyn) — same padding/border-bottom treatment, this
 * time generated by the template from the page name instead of typed
 * into a content block.
 */

.baq-blog-entry-meta {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-meta-size);
    color: var(--baq-charcoal);
    opacity: 0.75;
    margin-top: 8px;
}

/*
 * Was `margin: 32px 34px` with the image centered via `margin: 0 auto`
 * inside it (below). That put the image's left edge 218px right of the
 * text column: the wrapper's own 34px side margins pulled it in from
 * .col-md-12's edge before centering even started. The reading column
 * (p/h2 above) has no side margin of its own — it just sits flush at
 * .col-md-12's inner edge and lets max-width do the work. Matching that
 * here: drop the wrapper's horizontal margin so its content box runs the
 * full column width, then left-align the image (no more auto-centering)
 * so its own max-width is what limits it, exactly like a paragraph.
 * Both now read the same --baq-reading-measure variable, so they can
 * never drift apart again.
 */
.baq-blog-entry-thumb {
    margin: 32px 0;
}

.baq-blog-entry-thumb img {
    display: block;
    width: 100%;
    max-width: var(--baq-reading-measure);
    height: auto;
    margin: 0;
}

.baq-blog-entry-nextprev {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    gap: 16px 24px;
    max-width: 680px;
    margin-top: 48px;
    padding-top: 24px;
    border-top: 1px solid var(--baq-rule);
}

.baq-blog-entry-nextprev-link {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-secondary-size);
    color: var(--baq-ink);
    border-bottom: 1px solid var(--baq-gold);
    padding-bottom: 2px;
}

.baq-blog-entry-nextprev-next {
    margin-left: auto;
    text-align: right;
}

/*
 * Tripled, same reasoning as .baq-hero-copy and the others above: this
 * <p> sits as a direct child of .col-md-12 (no .ccm-block-content
 * wrapper, since it's template output, not a content block), which is
 * exactly what the sitewide reading rule targets — raised to (0,3,0) so
 * this rule's own label-sized, non-680px-constrained styling wins
 * instead of rendering as an 18px/1.65/680px reading paragraph.
 */
.baq-blog-entry-back.baq-blog-entry-back.baq-blog-entry-back {
    font-family: var(--baq-font-body);
    font-size: var(--baq-text-label-size);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    margin-top: 24px;
    max-width: none;
}

@media (max-width: 560px) {
    .baq-blog-entry-nextprev {
        flex-direction: column;
        gap: 12px;
    }

    .baq-blog-entry-nextprev-next {
        margin-left: 0;
        text-align: left;
    }
}

/* === BAQ booking widget (vendor: Vagaro popup). Swap point. === */
.baq-booking { margin: 0 0 28px; }
.baq-booking .vagaro { width: auto !important; margin: 0 !important; text-align: left !important; }
.baq-booking .vagaro > a { display: none; }
.baq-booking .vagaro-container {
  width: auto !important;
  max-width: none !important;
  margin: 0 !important;
  text-align: left !important;
}
.baq-booking .loader-btn-html {
  display: inline-block;
  background: var(--baq-ink) !important;
  border: 1px solid var(--baq-ink) !important;
  color: var(--baq-paper) !important;
  border-radius: 0 !important;
  padding: 15px 20px !important;
  font-family: var(--baq-font-body) !important;
  font-size: var(--baq-text-label-size) !important;
  font-weight: 400 !important;
  letter-spacing: 0.13em !important;
  line-height: 1.2 !important;
  text-transform: uppercase !important;
  text-decoration: none !important;
  box-shadow: none !important;
}
.baq-booking .loader-btn-html:hover,
.baq-booking .loader-btn-html:focus-visible {
  background: transparent !important;
  color: var(--baq-ink) !important;
}
/* === end BAQ booking widget === */

/* === BAQ booking modal frame (vendor: Vagaro popup). Swap point. === */
.vagaro-popup{position:fixed !important;top:0 !important;left:0 !important;right:0 !important;bottom:0 !important;margin:auto !important;transform:none !important;width:min(920px,94vw) !important;max-width:min(920px,94vw) !important;height:min(860px,92vh) !important;max-height:92vh !important;border-radius:0 !important;/* display must NOT be !important: Vagaro keeps the modal hidden with an inline
   display:none and clears that property on open. An !important rule here beats
   the inline style, so the modal rendered open and empty on page load. Plain
   display:flex loses to inline display:none when closed, and applies when open. */
display:flex;flex-direction:column !important;box-shadow:0 24px 60px rgba(11,10,10,.30) !important;}
.vagaro-popup::before{content:'' !important;position:fixed !important;top:0 !important;left:0 !important;right:0 !important;bottom:0 !important;background:rgba(11,10,10,.55) !important;z-index:-1 !important;pointer-events:none !important;}
.vagaro-popup .vagaro-header{flex:0 0 auto !important;width:100% !important;background:var(--baq-ink) !important;color:var(--baq-paper) !important;font-family:var(--baq-font-body) !important;font-size:13px !important;letter-spacing:.13em !important;text-transform:uppercase !important;padding:0 18px !important;height:52px !important;line-height:52px !important;}
.vagaro-popup .vagaro-header div{color:var(--baq-paper) !important;font-family:var(--baq-font-body) !important;}
.vagaro-popup .vagaro-header .Crossbtn{filter:invert(1) brightness(2) !important;opacity:.9 !important;}
.vagaro-popup .vagaro-body{flex:1 1 auto !important;min-height:0 !important;height:auto !important;width:100% !important;max-width:none !important;margin:0 !important;overflow:hidden !important;}
.vagaro-popup iframe{width:100% !important;height:100% !important;display:block !important;border:0 !important;}
/* === end BAQ booking modal frame === */

/*
 * === BAQ Results gallery (before/after pairs) ===
 * Photos are shot on black; the site's ink matches exactly, so the pairs
 * sit directly on --baq-ink with no card, border or shadow -- the photo
 * boundary IS the section boundary. object-fit: contain (not cover) on a
 * fixed 4:5 box, matching the images' own 800x1000 canvas exactly: every
 * pair renders at its native ratio with nothing cropped. Pair 11's photo
 * is landscape, letterboxed onto that same 4:5 canvas already (baked into
 * the pixels), so no special-casing is needed here -- contain treats it
 * the same as every other pair and never crops or stretches it.
 *
 * Stacks at max-width:820px, the same breakpoint .baq-two-column-grid and
 * .baq-dark-two-column-grid already stack at (not a new value invented
 * for this section).
 */
.baq-results-pair {
    background: var(--baq-ink);
    padding: 28px 0;
}
.baq-results-pair-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 24px;
}
.baq-results-pair-side {
    text-align: center;
}
.baq-results-pair-side .baq-eyebrow {
    color: var(--baq-paper);
    margin-bottom: 12px;
}
.baq-results-pair-photo {
    position: relative;
    aspect-ratio: 4 / 5;
}
.baq-results-pair-photo img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: contain;
    object-position: center;
}
@media (max-width: 820px) {
    .baq-results-pair-grid {
        grid-template-columns: 1fr;
        gap: 20px;
    }
    .baq-results-pair {
        padding: 24px 0;
    }
}
/* === end BAQ Results gallery === */

/*
 * === BAQ single image (one photo dropped into an otherwise plain prose
 * page) ===
 * Sizing matches .baq-blog-entry-thumb exactly: same --baq-reading-measure
 * token, left-aligned rather than auto-centered, flush against the
 * paragraph column above and below it. No card, border or shadow, same as
 * every other photo on the site.
 */
.baq-single-image {
    margin: 32px 0;
}

.baq-single-image img {
    display: block;
    width: 100%;
    max-width: var(--baq-reading-measure);
    height: auto;
    margin: 0;
}
/* === end BAQ single image === */
