/* ═══════════════════════════════════════════════════════════════════
   Glacial Blocks — frontend + editor CSS
   The faithful Access Eye section blocks rely on css/webflow.css for all
   layout/typography. This file holds only block-specific shims:
   - editor-canvas neutralizers (scoped to .editor-styles-wrapper)
   - anything not expressible via the design stylesheet
   ═══════════════════════════════════════════════════════════════════ */

/* Full-bleed section blocks: cancel the editor's default content max-width
   so faithful sections span the canvas like they do on the front end. */
.editor-styles-wrapper .wp-block[data-align="full"] {
    margin-left: 0;
    margin-right: 0;
}

/* The fixed .site-header does not exist in the editor canvas — drop the hero /
   page-title top offset there so the first block isn't pushed off-screen. */
.editor-styles-wrapper .hero {
    min-height: 78vh;
}

/* ═══════════════════════════════════════════════════════════════════
   Tier-A inner-page blocks (gl-*) — styled with the Access Eye design
   tokens from css/webflow.css (:root). Blocks render inside #main.entry
   on service/inner pages.
   ═══════════════════════════════════════════════════════════════════ */

/* ---- Section: full-bleed band + rhythm ---------------------------------- */
.gl-section {
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    padding-block: clamp(3rem, 6vw, 5.5rem);
    overflow-x: clip;
}

.gl-section-inner {
    max-width: 1550px;
    margin-inline: auto;
    padding-inline: clamp(1.25rem, 5vw, 2.5rem);
}

.gl-section--center {
    text-align: center;
}

/* prose sitting directly in a band (not inside a grid/cell/split) keeps a
   readable line length instead of running the full 1350px */
.gl-section-inner > p {
    /*max-width: 70ch;*/
}

.gl-section--center .gl-section-inner > p {
    max-width: none;
}

/* a note following a card grid needs air between it and the cards */
.gl-section-inner > .gl-grid + p {
    margin-top: clamp(1.5rem, 3vw, 2.25rem);
}

.gl-section--center .gl-section-inner {
    max-width: 820px;
}

/* bottom-gap variants (default/medium = flush color bands) */
.gl-section--mb-0 {
    margin-bottom: 0;
}

.gl-section--mb-sm {
    margin-bottom: clamp(1.5rem, 3vw, 2.5rem);
}

.gl-section--mb-lg {
    margin-bottom: clamp(3rem, 6vw, 5rem);
}

/* backgrounds */
.gl-section--light {
    background: var(--cream, #F5EFE6);
}

.gl-section--brand {
    background: var(--blush, #F2E8E2);
}

.gl-section--dark {
    background: var(--dark-brown, #271911);
}

.gl-section--accent {
    background: var(--accent, #f6410f);
}

/* dark / accent bands flip text light */
.gl-section--dark,
.gl-section--accent {
    color: var(--cream, #F5EFE6);
}

.entry .gl-section--dark :is(h1,h2,h3,h4,h5,h6),
.entry .gl-section--accent :is(h1,h2,h3,h4,h5,h6) {
    color: #fff;
}

.gl-section--dark :is(p,li),
.gl-section--accent :is(p,li) {
    color: rgba(255, 255, 255, .9);
}

.gl-section--dark a:not(.gl-btn) {
    color: var(--beige, #e3c8aa);
}

/* Two adjacent bands sharing a background double the rhythm at the seam — one
   band's bottom padding stacked on the next band's top padding — with no colour
   change to justify it. The second band drops its top padding so the pair reads
   as one continuous band.

   Guarded two ways so differently-coloured bands are untouched:
   - the pair must be in the same colour group. `none` (no bg class) and
     --light are one group: <body> is already --cream, so a cream band is the
     same colour as no band at all.
   - the first band must be flush, i.e. default or "None" bottom spacing. An
     --mb-sm / --mb-lg band deliberately shows page background below itself, so
     the two are visually separate and each keeps its own padding. */
.gl-section:not(:is(.gl-section--brand, .gl-section--dark, .gl-section--accent, .gl-section--mb-sm, .gl-section--mb-lg))
    + .gl-section:not(:is(.gl-section--brand, .gl-section--dark, .gl-section--accent)),
.gl-section--brand:not(:is(.gl-section--mb-sm, .gl-section--mb-lg)) + .gl-section--brand,
.gl-section--dark:not(:is(.gl-section--mb-sm, .gl-section--mb-lg)) + .gl-section--dark,
.gl-section--accent:not(:is(.gl-section--mb-sm, .gl-section--mb-lg)) + .gl-section--accent {
    padding-top: 0;
}

/* ---- Heading + eyebrow -------------------------------------------------- */
.entry .gl-heading {
    margin: 0 0 1.1rem;
    font-family: var(--display, 'Cormorant Garamond', serif);
    font-weight: 300;
    line-height: 1.1;
}

.entry h2.gl-heading {
    font-size: clamp(1.9rem, 3vw, 2.9rem);
}

.entry h3.gl-heading {
    font-size: clamp(1.5rem, 2.2vw, 2.1rem);
}

.entry h4.gl-heading {
    font-size: clamp(1.25rem, 1.6vw, 1.5rem);
}

.entry .gl-heading--accent {
    color: var(--accent, #f6410f);
}

.entry .gl-heading--white {
    color: #fff;
}

.gl-heading--center {
    text-align: center;
}

.gl-eyebrow {
    font-family: var(--body, 'Jost', sans-serif);
    font-size: .78rem;
    font-weight: 500;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--accent, #f6410f);
    margin: 0 0 .85rem;
}

.gl-eyebrow--white {
    color: var(--beige, #e3c8aa);
}

/* ---- Grid --------------------------------------------------------------- */
.gl-grid {
    display: grid;
    gap: clamp(1.25rem, 3vw, 2.5rem);
}

.gl-cols-2 {
    grid-template-columns: repeat(2, 1fr);
}

.gl-cols-3 {
    grid-template-columns: repeat(3, 1fr);
}

.gl-cols-4 {
    grid-template-columns: repeat(4, 1fr);
}

.gl-ratio-1-2 {
    grid-template-columns: 1fr 2fr;
}

.gl-ratio-2-1 {
    grid-template-columns: 2fr 1fr;
}

@media (max-width: 860px) {
    .gl-cols-3, .gl-cols-4, .gl-ratio-1-2, .gl-ratio-2-1 {
        grid-template-columns: 1fr 1fr;
    }
}

@media (max-width: 560px) {
    .gl-cols-2, .gl-cols-3, .gl-cols-4, .gl-ratio-1-2, .gl-ratio-2-1 {
        grid-template-columns: 1fr;
    }
}

.gl-cell > :first-child {
    margin-top: 0;
}

.gl-cell > :last-child {
    margin-bottom: 0;
}

/* ---- Image -------------------------------------------------------------- */
.gl-image {
    margin: 0;
}

.gl-image img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.gl-image--rounded img {
    border-radius: var(--r-xl, 24px);
}

/* ---- Split section ------------------------------------------------------ */
.gl-split {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: clamp(1.75rem, 4vw, 3.5rem);
    align-items: center;
}

.gl-split--flip .gl-split__media {
    order: 2;
}

.gl-split__media img {
    display: block;
    width: 100%;
    height: 100%;
    max-height: 520px;
    object-fit: cover;
    border-radius: var(--r-xl, 24px);
}

.gl-split__body > :first-child {
    margin-top: 0;
}

.gl-split__body > :last-child {
    margin-bottom: 0;
}

@media (max-width: 767px) {
    .gl-split {
        grid-template-columns: 1fr;
    }

    .gl-split--flip .gl-split__media {
        order: 0;
    }
}

/* ---- Callout card ------------------------------------------------------- */
.gl-callout-card {
    background: #fff;
    border: 1px solid var(--line, rgba(59, 46, 34, .14));
    border-radius: var(--r-lg, 16px);
    padding: clamp(1.5rem, 2.5vw, 2rem);
    height: 100%;
}

.gl-callout-card__title {
    font-family: var(--display, serif);
    font-weight: 400;
    font-size: 1.4rem;
    margin: 0 0 .6rem;
    color: var(--ink, #3B2E22);
}

.gl-callout-card__text {
    margin: 0;
    color: var(--muted, #5E4B3C);
    line-height: 1.6;
}

/* on a dark band → translucent card, white text */
.gl-section--dark .gl-callout-card {
    background: rgba(255, 255, 255, .06);
    border-color: rgba(255, 255, 255, .14);
}

.entry .gl-section--dark .gl-callout-card__title {
    color: #fff;
}

.gl-section--dark .gl-callout-card__text {
    color: rgba(255, 255, 255, .82);
}

/* ---- Buttons ------------------------------------------------------------ */
.gl-btn {
    display: inline-block;
    font-family: var(--body, sans-serif);
    font-weight: 500;
    font-size: 1.1rem;
    letter-spacing: .06em;
    text-transform: uppercase;
    text-decoration: none;
    padding: .95rem 2rem;
    border-radius: var(--r-pill, 999px);
    background: var(--accent, #f6410f);
    color: #fff;
    transition: background var(--ease, .3s ease), transform var(--ease, .3s ease);
}

.gl-btn:hover {
    background: var(--accent-hover, #d84618);
}

.gl-btn--light {
    background: #fff;
    color: var(--dark-brown, #271911);
}

.gl-btn--light:hover {
    background: var(--cream, #F5EFE6);
}

.gl-btn--outline {
    background: transparent;
    border: 1px solid currentColor;
    color: var(--ink, #3B2E22);
}

/* ---- Appointment callout ------------------------------------------------ */
.gl-appt {
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    background: var(--accent, #f6410f);
    color: #fff;
    text-align: center;
    padding-block: clamp(3.25rem, 6vw, 5rem);
    overflow-x: clip;
}

.gl-appt__inner {
    max-width: 760px;
    margin-inline: auto;
    padding-inline: 1.5rem;
}

.entry .gl-appt__title {
    font-family: var(--display, serif);
    font-weight: 300;
    color: #fff;
    font-size: clamp(2rem, 3.2vw, 3rem);
    margin: 0 0 .75rem;
    line-height: 1.08;
}

.gl-appt__text {
    color: rgba(255, 255, 255, .92);
    font-size: 1.1rem;
    margin: 0 0 1.75rem;
}

.gl-appt a:not(.gl-btn) {
    color: #fff;
    text-decoration: underline;
    text-underline-offset: .18em;
}

/* editor canvas: neutralize the full-bleed calc so bands don't overflow the iframe */
.editor-styles-wrapper .gl-section,
.editor-styles-wrapper .gl-appt {
    width: auto;
    max-width: none;
    margin-left: 0;
}

/* Steps blocks auto-number via a CSS counter (empty .exam-step-num span) so editors
   never manage numbers. Scoped to :empty so the design's explicit numbers are untouched. */
.exam-step-grid, .svc-step-grid {
    counter-reset: gl-step;
}

.exam-step, .svc-step {
    counter-increment: gl-step;
}

.exam-step .exam-step-num:empty::before,
.svc-step .svc-step-num:empty::before {
    content: counter(gl-step, decimal-leading-zero);
}

/* ── glacial/svc-explain with no image selected ──
   The band then has a single column; span it and cap the measure so the text
   doesn't sit beside an empty half. (Also covers the pre-image blocks that
   carried the retired showCompare:false attribute.) */
.svc-explain__grid > :only-child {
    grid-column: 1 / -1;
    max-width: 760px;
}

/* ── glacial/svc-explain photo (replaced the old cloudy/clear lens graphic) ──
   The grid is align-items:center, so the media cell can't stretch to the text
   column's height — a fixed ratio is what keeps the band from jumping around
   as copy length changes. */
.svc-explain__media {
    margin: 0;
    border-radius: var(--r-xl, 24px);
    overflow: hidden;
    background: var(--blush, #F2E8E2);
    box-shadow: 0 18px 44px rgba(59, 46, 34, .14);
}

.svc-explain__media img {
    display: block;
    width: 100%;
    aspect-ratio: 4 / 3;
    object-fit: cover;
}

/* Editor-only: the click target shown until an image is picked. render.php
   never emits this class, so it costs the frontend nothing. */
.svc-explain__media--empty {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 260px;
    box-shadow: none;
    border: 1px dashed rgba(59, 46, 34, .28);
}

@media (max-width: 767px) {
    .svc-explain__media img {
        aspect-ratio: 3 / 2;
    }
}

/* ── glacial/faq "Two columns" option (cataract v2 .svc-faq-list recipe) ──
   Standalone modifier class so it wins its order-decided fights with
   webflow.css (blocks-frontend.css depends on main-site-style). */
/* Two independent stacks, NOT `columns: 2` and not a grid over a flat list:
   multi-column re-balances on every height change (opening a <details> shoved
   the bottom item of column one into column two, under the reader's cursor),
   and a grid over a flat list leaves a tall gap beside a long open answer.
   render.php splits the items into two .gl-faq-col stacks, so opening one item
   only moves the items below it in its own column. */
.gl-faq-two-col {
    max-width: 1080px;
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    align-items: start;
    column-gap: 56px;
}

.gl-faq-two-col .gl-faq-col > .exam-faq-item + .exam-faq-item {
    margin-top: 4px;
}

@media (max-width: 768px) {
    .gl-faq-two-col {
        grid-template-columns: 1fr;
    }
}

/* Editor canvas has no .gl-faq-col wrappers (edit() renders the raw children),
   so keep the list single-column there instead of zig-zagging across cells. */
.editor-styles-wrapper .gl-faq-two-col {
    grid-template-columns: 1fr;
}

/* ═══ MOBILE TYPE SCALE (WP) ═══
   The 1.1rem/1.25rem floors are desktop-only — on phones the design's
   original sizes return. */
@media (max-width: 767px) {
    .gl-btn {
        font-size: .82rem;
    }

}

/* ── Patient-story video card: click-to-play YouTube facade ──
   view.js injects .video-card__frame over the card, so the poster/caption
   design stays the default state and the player covers it while playing. */
.video-card__frame {
    position: absolute;
    inset: 0;
    z-index: 5;
    background: #000;
    border-radius: inherit;
    overflow: hidden;
}

.video-card__frame iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
}

.video-card__close {
    position: absolute;
    top: .75rem;
    right: .75rem;
    z-index: 6;
    width: 40px;
    height: 40px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 0;
    border-radius: 50%;
    background: rgba(10, 10, 10, .72);
    color: #fff;
    font-size: 1rem;
    line-height: 1;
    cursor: pointer;
    transition: background .2s ease;
}

.video-card__close:hover {
    background: rgba(10, 10, 10, .95);
}

.video-card__close:focus-visible,
button.video-card__play:focus-visible {
    outline: 3px solid var(--accent, #f6410f);
    outline-offset: 3px;
}

/* the play control is a real <button> when a video is set — strip UA chrome
   and keep the designed circle (the base .video-card__play styling) */
button.video-card__play {
    padding: 0;
    border: 0;
    font: inherit;
    cursor: pointer;
}

/* caption/overlay sit under the player; fade them so nothing shows through */
.video-card.is-playing .video-card__overlay,
.video-card.is-playing .video-card__caption {
    opacity: 0;
    transition: opacity .25s ease;
}

/* outline variant of the block button — fills on hover like the design's
   .btn-black-outline; the solid variants already had hover states. */
.gl-btn--outline {
    transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}

.gl-btn--outline:hover,
.gl-btn--outline:focus-visible {
    background: var(--ink, #3B2E22);
    border-color: var(--ink, #3B2E22);
    color: var(--cream, #F5EFE6);
}

.gl-btn:focus-visible,
.gl-btn--light:focus-visible,
.gl-btn--outline:focus-visible {
    outline: 3px solid var(--accent, #f6410f);
    outline-offset: 3px;
}

/* ═══════════════════════════════════════════════════════════════════
   SERVICES INDEX (glacial/services-index)
   Design reference: the homepage .service-grid in css/webflow.css (~849).
   The tiles ARE .service-tile / .service-tile-overlay / .arrow-light — this
   file only re-grids them (2/3/4 columns instead of the fixed 2-up homepage
   placement), deepens the scrim for the extra line of copy, and scales the
   tile type to the tile's own width via container queries so one rule set
   covers every column count. Site-wide type floors respected: the tile <p>
   is left at the design's 1.1rem, the <h3> floor is 20px (Cormorant), and
   the kicker rides the exempt .eyebrow pattern.
   ═══════════════════════════════════════════════════════════════════ */

/* ---- Band ---------------------------------------------------------------- */
/* Full-bleed out of #main.standard-inner-wrapper, same escape the gl-* bands use. */
.svc-index {
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    background: var(--cream, #F5EFE6);
    overflow-x: clip;
}

.svc-index__inner {
    padding: 40px 56px;
}

/* ---- Section header (mirrors .services-header) --------------------------- */
.svc-index__header {
    text-align: center;
    padding-bottom: 48px;
    border-bottom: 1px solid var(--line, rgba(59, 46, 34, 0.14));
}

.svc-index__header .eyebrow {
    margin-bottom: 18px;
}

.entry .svc-index__header h2,
.svc-index__header h2 {
    font-size: clamp(38px, 5vw, 44px);
    max-width: 1000px;
    margin: 0 auto;
    line-height: 1;
    text-wrap: balance;
}

.entry .svc-index__intro,
.svc-index__intro {
    max-width: 1660px;
    margin: 24px auto 0;
    font-size: 1.15rem;
    line-height: 1.7;
    font-weight: 400;
    color: var(--muted, #5E4B3C);
    text-wrap: pretty;
}

/* ---- Grid ---------------------------------------------------------------- */
.svc-index-grid {
    display: grid;
    gap: 3px;
}

.svc-index-grid--2 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
}

.svc-index-grid--3 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
}

.svc-index-grid--4 {
    grid-template-columns: repeat(4, minmax(0, 1fr));
}

/* The homepage pins .service-tile:nth-child(1..4) to fixed rows/columns; release
   them here so auto-placement flows any number of tiles. Deliberately (0,3,0) —
   one class more specific than webflow.css's .service-tile:nth-child(n), so it wins
   on specificity rather than on which stylesheet happens to load last. */
.svc-index .svc-index-grid > .service-tile {
    grid-row: auto;
    grid-column: auto;
}

/* Feature layout: a 6-column track, so the top row is two half-width feature tiles
   (3 columns each — the homepage's 2-up .service-grid verbatim) and every row after
   it is three tiles (2 columns each). That lands the small tiles at the same ~440px
   width as the 3-column uniform grid, which is the width a kicker + title + one line
   of copy actually fits at; a 4-across track squeezes them to ~330px and the text
   rides up out of the scrim. 12 remaining services = 4 exact rows, no hole. */
.svc-index-grid--feature {
    grid-template-columns: repeat(6, minmax(0, 1fr));
}

.svc-index .svc-index-grid--feature > .svc-index-tile {
    grid-column: span 2;
}

.svc-index .svc-index-grid--feature > .svc-index-tile--feature {
    grid-column: span 3;
}

/* ---- Tile --------------------------------------------------------------- */
.svc-index-tile {
    background: var(--dark-brown, #271911);
}

.svc-index-tile__img {
    /* .service-tile img already sets object-fit / aspect-ratio / hover-zoom. */
    aspect-ratio: 4 / 3;
}

/* A third line of copy sits in the scrim here, so it starts earlier and ends
   darker than the homepage's 2-up gradient — keeps white text legible over any
   photograph rather than only the four hand-picked homepage images. */
.svc-index-tile .service-tile-overlay {
    background: linear-gradient(0deg,
    rgba(30, 18, 10, .88) 0%,
    rgba(30, 18, 10, .58) 42%,
    rgba(30, 18, 10, .12) 76%,
    rgba(30, 18, 10, 0) 100%);
    padding: clamp(22px, 2.4vw, 34px);
}

/* The category label sits at the TOP of the overlay stack, where the scrim has
   already faded to ~0.4 — and beige is too light to clear 4.5:1 against a bright
   photograph at any scrim opacity that still shows the photo. So it carries its own
   opaque chip instead of relying on the gradient: 10.6:1 on every tile, whatever the
   image. (The homepage's 2-up tiles have no kicker, so there is nothing to match.)
   align-self keeps it from stretching the full width of the flex column. */
.svc-index-tile__kicker {
    align-self: flex-start;
    background: var(--dark-brown, #271911);
    color: var(--beige, #e3c8aa);
    padding: 5px 12px 4px;
    border-radius: var(--r-pill, 999px);
    margin-bottom: 12px;
    max-width: 100%;
}

.entry .svc-index-tile .service-tile-overlay h3,
.svc-index-tile .service-tile-overlay h3 {
    font-size: clamp(20px, 1.8vw, 30px);
    margin-bottom: 9px;
    text-wrap: balance;
}

/* Scale the tile's head and inset to the TILE, not the viewport — one rule set then
   covers every column count and both layouts, including the double-width feature
   tiles, which get the homepage's full type scale and 32px-ish padding for free. */
@supports (container-type: inline-size) {
    .svc-index-tile {
        container-type: inline-size;
    }

    .entry .svc-index-tile .service-tile-overlay h3,
    .svc-index-tile .service-tile-overlay h3 {
        font-size: clamp(20px, 6.1cqw, 30px);
    }

    .svc-index-tile .service-tile-overlay {
        padding: clamp(20px, 5cqw, 34px);
    }
}

.svc-index-tile .service-tile-overlay p {
    max-width: 34ch;
    margin-bottom: 16px;
}

/* No hero image set: the tile is a plain dark card, so drop the scrim. */
.svc-index-tile--noimg {
    aspect-ratio: 4 / 3;
}

.svc-index-tile--noimg .service-tile-overlay {
    background: none;
    justify-content: center;
}

/* ---- Closing CTA band (mirrors .services-more) --------------------------- */
.svc-index__cta {
    padding: 64px 56px;
    background: var(--blush, #F2E8E2);
    border-top: 1px solid var(--line, rgba(59, 46, 34, 0.14));
    text-align: center;
}

.entry .svc-index__cta-text,
.svc-index__cta-text {
    font-family: var(--display, 'Cormorant Garamond', Georgia, serif);
    font-size: clamp(1.5rem, 2.6vw, 2.25rem);
    font-weight: 300;
    line-height: 1.2;
    color: var(--black, #0a0a0a);
    max-width: 620px;
    margin: 0 auto 28px;
    text-wrap: balance;
}

/* ---- Responsive --------------------------------------------------------- */
@media (max-width: 1200px) {
    .svc-index-grid--4 {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (max-width: 960px) {
    .svc-index__inner {
        padding: 80px 24px;
    }

    .svc-index__header {
        margin-bottom: 48px;
        padding-bottom: 32px;
    }

    .svc-index-grid--3,
    .svc-index-grid--4 {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    /* Feature grid drops to 2 columns, the feature tiles to full-width bands — the
       right emphasis for the two flagship services on a tablet. !important only to
       beat webflow.css's own `.service-tile { grid-column: auto !important }` in its
       960px block, which was written for the fixed 2-up homepage grid. */
    .svc-index-grid--feature {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .svc-index .svc-index-grid--feature > .svc-index-tile {
        grid-column: span 1 !important;
    }

    .svc-index .svc-index-grid--feature > .svc-index-tile--feature {
        grid-column: span 2 !important;
    }

    .svc-index__cta {
        padding: 48px 24px;
    }
}

@media (max-width: 600px) {
    .svc-index-grid--feature,
    .svc-index-grid--2,
    .svc-index-grid--3,
    .svc-index-grid--4 {
        grid-template-columns: minmax(0, 1fr);
    }

    /* One column — nothing left to span. */
    .svc-index .svc-index-grid--feature > .svc-index-tile,
    .svc-index .svc-index-grid--feature > .svc-index-tile--feature {
        grid-column: span 1 !important;
    }

    .svc-index-tile__img,
    .svc-index-tile--noimg {
        aspect-ratio: 3 / 2;
    }
}

/* ---- Editor canvas ------------------------------------------------------ */
/* Neutralize the full-bleed calc so the band doesn't overflow the iframe, and
   un-hide .reveal — the IntersectionObserver in js/site.js never runs in the
   editor, so scroll-reveal elements would otherwise stay at opacity 0. */
.editor-styles-wrapper .svc-index {
    width: auto;
    max-width: none;
    margin-left: 0;
}

.editor-styles-wrapper .svc-index .reveal,
.editor-styles-wrapper .svc-index.reveal {
    opacity: 1;
    transform: none;
}

/* ---- Utility ------------------------------------------------------------ */
/* Visually hidden, still announced — each tile's "Learn More" carries the
   service name so the tile links aren't identical to a screen reader (WCAG 2.4.4). */
.gl-sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

/* ---- Logo card ---------------------------------------------------------- */
/* Partner card (financing, insurance): logo well + copy + one button. Always a
   white card so brand logos keep their own colors — reads as a card on the
   cream and dark bands alike. */
.gl-logo-card {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    height: 100%;
    background: #fff;
    border: 1px solid var(--line, rgba(59, 46, 34, .14));
    border-radius: var(--r-lg, 16px);
    padding: clamp(1.75rem, 2.5vw, 2.25rem);
}

/* fixed-height well so logos of different proportions line up across the row */
.gl-logo-card__logo {
    display: flex;
    align-items: center;
    height: 44px;
    margin-bottom: 1.35rem;
}

.gl-logo-card__logo img {
    display: block;
    width: auto;
    max-width: 220px;
    max-height: 44px;
    height: auto;
}

.entry .gl-logo-card__title {
    font-family: var(--display, 'Cormorant Garamond', serif);
    font-weight: 400;
    font-size: 1.55rem;
    line-height: 1.15;
    margin: 0 0 .6rem;
    color: var(--ink, #3B2E22);
}

.gl-logo-card__text {
    margin: 0 0 1.6rem;
    color: var(--muted, #5E4B3C);
    line-height: 1.6;
}

.gl-logo-card__text > :first-child {
    margin-top: 0;
}

.gl-logo-card__text > :last-child {
    margin-bottom: 0;
}

.gl-logo-card__btn {
    margin-top: auto;
    font-size: 1rem;
    padding: .8rem 1.6rem;
}

/* the card stays light inside a dark/accent band — undo the band's text rules */
.gl-section--dark .gl-logo-card,
.gl-section--accent .gl-logo-card {
    background: #fff;
    border-color: rgba(255, 255, 255, .18);
}

.entry .gl-section--dark .gl-logo-card__title,
.entry .gl-section--accent .gl-logo-card__title {
    color: var(--ink, #3B2E22);
}

.gl-section--dark .gl-logo-card :is(p, li),
.gl-section--accent .gl-logo-card :is(p, li) {
    color: var(--muted, #5E4B3C);
}

.gl-section--dark .gl-logo-card a:not(.gl-btn),
.gl-section--accent .gl-logo-card a:not(.gl-btn) {
    color: var(--accent, #f6410f);
}

@media (max-width: 560px) {
    .gl-logo-card__btn {
        width: 100%;
        text-align: center;
    }
}

.wp-block-image img {
    border-radius: var(--r-xl, 24px);

}

.light-background {
    background: var(--blush);
}

/* ═══════════════════════════════════════════════════════════════════
   ODORO SELF-SCHEDULER (glacial/odoro-scheduler)
   The widget itself is third-party markup injected into #odoro, so this
   only styles the band around it and keeps Odoro's own loading spinner
   (their classes, copied from the live site) looking deliberate on cream.
   ═══════════════════════════════════════════════════════════════════ */
.gl-odoro {
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    padding-top: clamp(2.5rem, 5vw, 4rem);
    padding-bottom: clamp(1.5rem, 3vw, 2.5rem);
    overflow-x: clip;
}

.gl-odoro__inner {
    max-width: 980px;
    margin-inline: auto;
    padding-inline: clamp(1.25rem, 5vw, 2.5rem);
}

/* The emergency warning: this has to stop someone mid-scroll, so it reads as a
   notice (accent rule + tint) rather than another paragraph. */
.entry .gl-odoro__notice {
    font-family: var(--body, 'Jost', sans-serif);
    font-size: 1.15rem;
    font-weight: 500;
    line-height: 1.5;
    color: var(--ink, #3B2E22);
    background: var(--white, #fff);
    border-left: 4px solid var(--accent, #f6410f);
    border-radius: 0 var(--r-lg, 16px) var(--r-lg, 16px) 0;
    margin: 0 0 clamp(1.5rem, 3vw, 2.25rem);
    padding: 1.1rem 1.4rem;
}

/* Card the widget sits in. min-height matches Odoro's own spinner height so the
   page does not jump when their calendar replaces the loader. */
.gl-odoro__frame {
    background: var(--white, #fff);
    border: 1px solid var(--line, rgba(59, 46, 34, .14));
    border-radius: var(--r-xl, 24px);
    padding: clamp(.75rem, 2vw, 1.5rem);
    min-height: 250px;
}

.gl-odoro__frame > div {
    min-height: 250px;
}

/* Odoro pins their widget to `max-width: 800px !important` on an inline style and
   leaves it flush left, which reads as broken inside a wider card. `.odr-main` is
   their outermost element (a <span>) — blocking it and letting the margins auto
   centres the whole widget without fighting their inline width. */
.gl-odoro__frame .odr-main {
    display: block;
    margin-inline: auto;
}

/* Odoro's spinner (their class names). Their inline CSS lives on the old site's
   template, so it is restated here — retinted from their #f5f5f5/#016cc2 to the
   Access Eye palette. */
.odoro-spinner {
    background: transparent;
    overflow: hidden;
    display: flex;
    align-items: center;
    height: 250px;
    font-family: var(--body, 'Jost', sans-serif);
}

.odoro-message,
.odoro-rotating {
    vertical-align: middle;
    display: inline-block;
}

.odoro-message {
    font-weight: 400;
    color: var(--muted, #5E4B3C);
    line-height: 30px;
    margin-left: .5rem;
}

.odoro-rotating {
    position: relative;
    width: 30px;
    height: 30px;
    animation: odoro-spinner-spin 1s infinite linear;
}

.odoro-path {
    position: absolute;
    height: 15px;
    width: 30px;
    display: block;
    border: 4px solid var(--accent, #f6410f);
    border-bottom: 0;
    border-radius: 30px 30px 0 0;
    box-sizing: border-box;
}

.odoro-path_second {
    transform: rotate(60deg);
    transform-origin: bottom;
}

@keyframes odoro-spinner-spin {
    0%   { transform: rotate(0); }
    100% { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
    .odoro-rotating {
        animation-duration: 3s;
    }
}

/* Editor stand-in for the widget (edit() cannot run the third-party script). */
.gl-odoro__placeholder,
.gl-form__placeholder {
    display: block;
    background: var(--blush, #F2E8E2);
    border: 1px dashed var(--accent, #f6410f);
    border-radius: var(--r-lg, 16px);
    padding: 1.5rem;
    font-family: var(--body, 'Jost', sans-serif);
    font-size: 1rem;
    color: var(--muted, #5E4B3C);
}

.gl-odoro__placeholder strong,
.gl-form__placeholder strong {
    display: block;
    color: var(--ink, #3B2E22);
    margin-bottom: .5rem;
}

.gl-form__placeholder ul {
    margin: 0 0 .75rem;
    padding-left: 1.25rem;
    columns: 2;
}

.gl-form__placeholder-note {
    display: block;
    font-style: italic;
}

/* ═══════════════════════════════════════════════════════════════════
   APPOINTMENT REQUEST FORM (glacial/appointment-form)
   Native replacement for the live site's Gravity Form. Input chrome follows
   the doctors-archive filter fields already in css/webflow.css (pill border,
   accent focus ring) so the site has one form language.
   Type floors respected: inputs and labels stay >= 1.1rem on desktop.
   ═══════════════════════════════════════════════════════════════════ */
.gl-form-band {
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    /* blush, not cream: <body> is already cream, so a cream band is invisible */
    background: var(--blush, #F2E8E2);
    padding-block: clamp(3rem, 6vw, 5rem);
    overflow-x: clip;
}

.gl-form-band__inner {
    max-width: 980px;
    margin-inline: auto;
    padding-inline: clamp(1.25rem, 5vw, 2.5rem);
}

.entry .gl-form-band__intro {
    font-size: 1.15rem;
    color: var(--muted, #5E4B3C);
    margin: 0 0 clamp(1.75rem, 3.5vw, 2.5rem);
    max-width: 68ch;
}

/* ---- Grid ---------------------------------------------------------------- */
.gl-form__grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: clamp(1.1rem, 2.5vw, 1.75rem);
}

.gl-form__field--full {
    grid-column: 1 / -1;
}

/* A fieldset is a grid item here, so strip the UA chrome that would double the
   card's padding and break the column alignment. */
.gl-form__field {
    min-width: 0;
    margin: 0;
    padding: 0;
    border: 0;
}

@media (max-width: 700px) {
    .gl-form__grid {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* ---- Labels and help text ------------------------------------------------ */
.entry .gl-form__label,
.gl-form__label {
    display: block;
    font-family: var(--body, 'Jost', sans-serif);
    font-size: 1.1rem;
    font-weight: 500;
    line-height: 1.35;
    color: var(--ink, #3B2E22);
    margin: 0 0 .45rem;
    padding: 0;
}

.gl-form__req {
    color: var(--accent-link, #C0390C);
    margin-left: .15rem;
}

.entry .gl-form__desc,
.entry .gl-form__legend {
    font-family: var(--body, 'Jost', sans-serif);
    font-size: 1rem;
    color: var(--muted, #5E4B3C);
    margin: 0 0 .5rem;
}

.entry .gl-form__legend {
    margin-bottom: clamp(1.25rem, 2.5vw, 1.75rem);
}

/* ---- Inputs -------------------------------------------------------------- */
.gl-form input[type="text"],
.gl-form input[type="email"],
.gl-form input[type="tel"],
.gl-form textarea,
.gl-form select {
    width: 100%;
    padding: .75rem 1.1rem;
    font-family: var(--body, 'Jost', sans-serif);
    font-size: 1.1rem;
    font-weight: 300;
    line-height: 1.4;
    color: var(--ink, #3B2E22);
    background-color: var(--white, #fff);
    border: 1px solid var(--line, rgba(59, 46, 34, .14));
    border-radius: var(--r-lg, 16px);
    transition: border-color .2s ease, box-shadow .2s ease;
}

.gl-form textarea {
    border-radius: var(--r-lg, 16px);
    resize: vertical;
    min-height: 8rem;
}

.gl-form ::placeholder {
    color: var(--muted, #5E4B3C);
    opacity: .6;
}

.gl-form input:focus,
.gl-form textarea:focus,
.gl-form select:focus {
    outline: none;
    border-color: var(--accent, #f6410f);
    box-shadow: 0 0 0 3px rgba(246, 65, 15, .18);
}

/* Match the caret treatment used by the doctors-archive selects. */
.gl-form select {
    -webkit-appearance: none;
    appearance: none;
    padding-right: 2.6rem;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 9l6 6 6-6' fill='none' stroke='%233B2E22' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 1rem center;
    background-size: 13px;
    cursor: pointer;
}

/* ---- Radio choices ------------------------------------------------------- */
.gl-form__choices {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem .9rem;
    padding-top: .3rem;
}

.gl-form__choice {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
}

.gl-form__choice input[type="radio"] {
    width: 1.15rem;
    height: 1.15rem;
    accent-color: var(--accent, #f6410f);
    margin: 0;
    flex: none;
}

.gl-form__choice label {
    font-family: var(--body, 'Jost', sans-serif);
    font-size: 1.1rem;
    font-weight: 300;
    color: var(--ink, #3B2E22);
    margin: 0;
    cursor: pointer;
}

.gl-form__choice input[type="radio"]:focus-visible {
    outline: 3px solid var(--accent, #f6410f);
    outline-offset: 2px;
}

/* ---- Validation ---------------------------------------------------------- */
.gl-form__field.is-invalid input,
.gl-form__field.is-invalid textarea,
.gl-form__field.is-invalid select {
    border-color: #b32d2e;
}

.entry .gl-form__error {
    font-family: var(--body, 'Jost', sans-serif);
    font-size: 1rem;
    font-weight: 500;
    color: #b32d2e;
    margin: .4rem 0 0;
}

.gl-form__errors {
    background: #fdf0f0;
    border-left: 4px solid #b32d2e;
    border-radius: 0 var(--r-lg, 16px) var(--r-lg, 16px) 0;
    padding: 1.1rem 1.4rem;
    margin: 0 0 clamp(1.5rem, 3vw, 2rem);
}

.entry .gl-form__errors p,
.entry .gl-form__errors li {
    font-family: var(--body, 'Jost', sans-serif);
    font-size: 1.05rem;
    color: var(--ink, #3B2E22);
    margin: 0;
}

.gl-form__errors ul {
    margin: .4rem 0 0;
    padding-left: 1.25rem;
}

.entry .gl-form__errors a {
    color: #b32d2e;
}

/* ---- Success ------------------------------------------------------------- */
.gl-form__success {
    background: var(--white, #fff);
    border: 1px solid var(--line, rgba(59, 46, 34, .14));
    border-left: 4px solid var(--accent, #f6410f);
    border-radius: 0 var(--r-xl, 24px) var(--r-xl, 24px) 0;
    padding: clamp(1.5rem, 4vw, 2.5rem);
}

.entry .gl-form__success h3 {
    font-family: var(--display, 'Cormorant Garamond', serif);
    margin: 0 0 .6rem;
}

.entry .gl-form__success p {
    font-size: 1.15rem;
    color: var(--muted, #5E4B3C);
    margin: 0;
}

.gl-form__success:focus {
    outline: none;
}

/* ---- Actions ------------------------------------------------------------- */
.gl-form__actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 1rem 1.75rem;
    margin-top: clamp(1.75rem, 3.5vw, 2.5rem);
}

/* .gl-btn is an <a> everywhere else on the site; as a <button> it needs the
   UA button chrome cleared to match. */
.gl-form button.gl-btn {
    border: 0;
    cursor: pointer;
    font-family: var(--body, 'Jost', sans-serif);
}

.entry .gl-form__aside {
    font-family: var(--body, 'Jost', sans-serif);
    font-size: 1.05rem;
    color: var(--muted, #5E4B3C);
    margin: 0;
}

/* ---- Honeypot -----------------------------------------------------------
   Positioned off-screen rather than display:none — bots that skip hidden
   inputs would otherwise sail past the trap. The input carries tabindex="-1"
   so keyboard users never land in it. */
.gl-form__hp {
    position: absolute;
    left: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

/* ═══════════════════════════════════════════════════════════════════
   Locations Contact Grid (glacial/locations-contact)
   Office contact cards, address/phone/hours pulled from the Locations
   CPT. Standalone full-bleed band — same geometry as .gl-section, so it
   sits directly on the page rather than inside a section block.
   ═══════════════════════════════════════════════════════════════════ */
.gl-loc-directory {
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    padding-block: clamp(3rem, 6vw, 5.5rem);
    overflow-x: clip;
}

.gl-loc-directory__inner {
    max-width: 1550px;
    margin-inline: auto;
    padding-inline: clamp(1.25rem, 5vw, 2.5rem);
}

.gl-loc-directory__header {
    margin-bottom: clamp(2rem, 4vw, 3rem);
}

.entry .gl-loc-directory__intro {
    max-width: 70ch;
    margin: 1rem 0 0;
    color: var(--muted, #5E4B3C);
}

/* ---- Grid --------------------------------------------------------------- */
.gl-loc-grid {
    display: grid;
    gap: clamp(1.25rem, 2.5vw, 2rem);
}

.gl-loc-grid--2 {
    grid-template-columns: repeat(2, 1fr);
}

.gl-loc-grid--3 {
    grid-template-columns: repeat(3, 1fr);
}

.gl-loc-grid--4 {
    grid-template-columns: repeat(4, 1fr);
}

@media (max-width: 1100px) {
    .gl-loc-grid--3, .gl-loc-grid--4 {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 700px) {
    .gl-loc-grid--2, .gl-loc-grid--3, .gl-loc-grid--4 {
        grid-template-columns: 1fr;
    }
}

/* ---- Card --------------------------------------------------------------- */
/* Flex column with the link pushed to the bottom (margin-top:auto) so the CTA
   lines up across a row of cards whose hours blocks are different lengths. */
.gl-loc-card {
    display: flex;
    flex-direction: column;
    background: #fff;
    border: 1px solid var(--line, rgba(59, 46, 34, .14));
    border-radius: var(--r-lg, 16px);
    padding: clamp(1.5rem, 2.5vw, 2rem);
    height: 100%;
}

.gl-loc-card__img {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 4 / 3;
    object-fit: cover;
    border-radius: calc(var(--r-lg, 16px) - 6px);
    margin-bottom: 1.25rem;
}

.entry .gl-loc-card__title {
    font-family: var(--display, Georgia, serif);
    font-weight: 400;
    font-size: clamp(1.45rem, 2vw, 1.75rem);
    line-height: 1.2;
    color: var(--ink, #3B2E22);
    margin: 0 0 1rem;
}

.gl-loc-card__details {
    margin: 0;
}

/* Small caps label above each value — the visual rhythm of .gl-eyebrow, at
   list scale. */
.gl-loc-card__label {
    font-family: var(--body, 'Jost', sans-serif);
    font-size: .8rem;
    font-weight: 500;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--muted, #5E4B3C);
    margin: 0;
}

.gl-loc-card__label:not(:first-child) {
    margin-top: 1.15rem;
}

.gl-loc-card__details dd {
    margin: .35rem 0 0;
    font-size: 1.05rem;
    line-height: 1.55;
    color: var(--ink, #3B2E22);
}

.gl-loc-card__hours {
    /* Day/time pairs read as a block of data, not prose — keep them tight. */
    line-height: 1.5;
}

.gl-loc-card__phones {
    list-style: none;
    margin: 0;
    padding: 0;
}

.gl-loc-card__phones li + li {
    margin-top: .3rem;
}

.gl-loc-card__phone-label,
.gl-loc-card__phone-note {
    color: var(--muted, #5E4B3C);
}

.gl-loc-card__phone-note {
    display: block;
    font-size: .95rem;
}

/* The tel: links carry no class, so css/webflow.css's `.entry a:not([class])`
   prose treatment already claims them — restate at equal specificity (this
   file loads after webflow.css) so the underline is a hairline in the card. */
.entry .gl-loc-card__phones a {
    color: var(--accent-link, #C0390C);
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 2px;
}

.entry .gl-loc-card__phones a:hover,
.entry .gl-loc-card__phones a:focus-visible {
    color: var(--accent-link-hover, #A82F08);
}

/* ---- Card link ----------------------------------------------------------
   .arrow-link geometry, but --accent-link rather than --accent: this is
   uppercase 1.05rem regular — not WCAG "large text", so it needs the 4.5:1
   deepened orange. */
.entry .gl-loc-card__link {
    align-self: flex-start;
    margin-top: auto;
    padding-top: 1.5rem;
    font-size: 1.05rem;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--accent-link, #C0390C);
    text-decoration: none;
    border-bottom: 1px solid currentColor;
    padding-bottom: 4px;
    transition: color .2s ease;
}

.entry .gl-loc-card__link:hover,
.entry .gl-loc-card__link:focus-visible {
    color: var(--accent-link-hover, #A82F08);
}

.entry .gl-loc-directory__note {
    max-width: 80ch;
    margin: clamp(1.75rem, 3vw, 2.5rem) 0 0;
    font-size: 1.05rem;
    color: var(--muted, #5E4B3C);
}

.gl-loc-directory__empty {
    padding: 1rem;
    border: 1px dashed var(--line, rgba(59, 46, 34, .14));
    color: var(--muted, #5E4B3C);
}

/* The editor canvas has no page-width context to bleed out of. */
.editor-styles-wrapper .gl-loc-directory {
    width: auto;
    max-width: none;
    margin-left: 0;
}

/* A Patient Stories band holding a single video — the service pages that carry
   one educational embed rather than a pair of patient stories. webflow.css's
   .svc-story-grid is a hard 1fr 1fr, so without this the lone tile sits in the
   left half and leaves a dead column beside it. */
.svc-stories .svc-story-grid > .svc-story-video:only-child {
    grid-column: 1 / -1;
    width: 100%;
    max-width: 900px;
    margin-inline: auto;
}

/* A Spec Row with no "Best for" copy — the contact-lens types, say. webflow.css's
   .svc-lens-row is a hard 1.1fr 2fr 1.2fr, so a 2-cell row would otherwise leave
   a dead third column and squeeze the description. The name column keeps the same
   share it has in 3-cell rows (1.1 : 2 + 1.2) so a table mixing both still lines
   up. Scoped to the desktop breakpoint — webflow.css collapses the grid itself at
   1024px and 768px, and this file loads after it. */
@media (min-width: 1025px) {
    .svc-lens-row--2col {
        grid-template-columns: 1.1fr 3.2fr;
    }
}
