/*
Theme Name: Glacial Theme
Author: Glacial Multimedia
Author URI: https://glacial.com
Description: Your custom created WordPress theme from Glacial Multimedia.
Version: 3.2.4
Text Domain: glacialtheme

GitHub Theme URI: https://github.com/Glacial-Web/glacial-theme
 */

:root {
    --gl-inner-pad-top: 4rem;
    --gl-inner-pad-bottom: 4rem;

    --gl-button-color: #fff;
    --gl-button-bg: #001543;
    --gl-button-color-hover: #000;
    --gl-button-bg-hover: #d29f13;
    --gl-max-width: 1650px;
}

.gl-page-intro {
    background: #002d7226;
}

.main-service-section *:last-child:not(h1, h2, h3, h4, h5, h6) {
    margin-bottom: 0;
}

.gl-intro-text p {
    font-size: 1.1rem;
}

/* Pillar Link Buttons*/

.pillar-link-grid {
    display: -ms-grid;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    grid-gap: 1.5em;
    grid-auto-rows: 1fr;
}

.pillar-link-grid a.ui-button {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-end;
    margin: auto;
    width: 100%;
    height: 300px;
    background-repeat: no-repeat !important;
    background-size: cover !important;
    border-color: rgba(255, 255, 255, 0.8);
    border-width: 2px;
    left: 10px;
    right: 10px;
    bottom: 10px;
    top: 10px;
}

.pillar-link-grid a.ui-button span {
    width: 100%;
    padding: 10px;
    color: #000;
    background-color: rgba(255, 255, 255, 0.8);
}

/* Blog containers */

.outer-flex-wrapper {
    gap: 4rem;
}

.main-content {
    flex: 1;
}

.main-content > .main-service-section:first-child:not(.gl-page-intro) {
    padding-top: 0;
}

aside {
    background: var(--wp--preset--color--lum-cream, #fcf5e9);
    flex-basis: 25%;
    border-top: 3px solid var(--color-6, #d29f13);
    padding: 1.5rem 1.25rem;
    align-self: flex-start;
    position: sticky;
    top: 170px;
}

h2 a {
    text-decoration: none !important;
}

.related-topics-div ul {
    padding-left: 0;
}

.related-topics-div li {
    list-style: none;
}

.related-topics-div li a {
    text-decoration: none;
}

.related-pages-bottom li:first-of-type {
    margin-left: 0;
}

/* Format Content */
.entry h2, .entry h3, .entry h4, .entry p, .entry ul, .entry ol, .entry blockquote, .attachment-post-thumbnail, article h2, article h3, article h4, article p, article ul, article ol, article hr, article blockquote, .wp-block-group, .wp-block-image, .wp-block-media-text {
    /*margin-bottom: 30px;*/
}

.entry h3 {
    margin-bottom: 20px;

}

.entry h4 {
    font-style: normal;
    font-size: 1.2rem;
}

.entry .emph-div.btm-mar {
    padding-bottom: 15px;
}

.entry p, .entry li {
    line-height: 1.55;
}

.entry li {
    margin-bottom: 10px;
}

.entry hr {
    margin: 50px auto;
}

.wp-block-buttons {
    margin-bottom: 20px;
}

blockquote {
    color: var(--gl-button-bg);
    line-height: 1.5em;
    font-weight: 400;
    font-style: italic;
}

cite {
    color: #757575;
    font-weight: 400;
    font-style: normal;
}

.wp-caption-text {
    margin-top: 30px;
    font-style: italic;
    text-align: center;
}

img, .entry img {
    height: auto
}

a {
    -webkit-transition: all 100ms ease;
    -o-transition: all 100ms ease;
    transition: all 100ms ease;
}

.entry a {
    color: #031444;
    text-decoration: underline;
}

.entry a:hover {
    color: #d29f13;
}

/* Text links in body copy OUTSIDE .entry (2026-10-08). Location pages and Full Bleed
   (Blocks) pages have no .entry wrapper, so a plain link in a paragraph or list — an
   editor's link, or a gsd-phone-links.php tel:/sms: link — fell back to the browser's
   default blue. Same navy/underline/gold as .entry a. Only CLASS-LESS anchors (plus
   our phone links) inside prose elements, and wrapped in :where() so this is (0,0,1):
   every component's own link styling (buttons, cards, nav, pills) still wins. */
:where(main) :where(p, li, td, dd, dt, blockquote, figcaption, address) a:where(:not([class]), .gsd-phone-link) {
    color: #031444;
    text-decoration: underline;
}

:where(main) :where(p, li, td, dd, dt, blockquote, figcaption, address) a:where(:not([class]), .gsd-phone-link):hover {
    color: #d29f13;
}

/* …but on a DARK section the link keeps the section's (white) text colour, underlined;
   gold on hover reads ~7.4:1 on navy. :is() lifts this to (0,2,2) so it also beats
   `.entry a` (0,1,1), which painted such links navy-on-navy on standard pages. */
:is(.main-service-section.blue, .inner-cta-div, .footer-cta-div, .hero-column-left-2, .hero-column-right, .hero-column-right-2, .doc-patient-bg-blue, .sticky-service-section, .services-holder, .testimonial-div-ip, .blue-strip-insta, .gl-cellbg-navy, .gl-cellbg-teal) :is(p, li, td, dd, dt, blockquote, figcaption, address) a:is(:not([class]), .gsd-phone-link) {
    color: inherit;
}

:is(.main-service-section.blue, .inner-cta-div, .footer-cta-div, .hero-column-left-2, .hero-column-right, .hero-column-right-2, .doc-patient-bg-blue, .sticky-service-section, .services-holder, .testimonial-div-ip, .blue-strip-insta, .gl-cellbg-navy, .gl-cellbg-teal) :is(p, li, td, dd, dt, blockquote, figcaption, address) a:is(:not([class]), .gsd-phone-link):hover {
    color: #d29f13;
}

/* Keep a phone number in running text on one line — "(626) 963-0226" broke
   at its space and stranded the area code (owner, 2026-10-05). */
p a[href^="tel:"],
p a[href^="sms:"] {
    white-space: nowrap;
}

.size-medium-large img {
    width: 100%;
    max-width: 650px;
}

/* Button Code — mirrors the Webflow .button style (css/webflow.css) so
   editor-added core buttons match the site's buttons, hover included. */
a.ui-button, a.wp-block-button__link, button.wp-block-button__link, .entry a.moretag {
    color: var(--color-2, #001543);
    font-size: 18px;
    font-weight: 500;
    line-height: 1em;
    border: 2px solid var(--color-2, #001543);
    border-radius: 0;
    text-transform: capitalize;
    display: inline-block;
    padding: 15px 30px;
    text-align: center;
    text-decoration: none;
    background: transparent;
    transition: all .2s;
}

a.ui-button:hover, a.wp-block-button__link:hover, button.wp-block-button__link:hover, .entry a.moretag:hover {
    color: var(--color, #fff);
    background: var(--color-2, #001543);
    transform: scale(.9);
}

.search-submit {
    -webkit-appearance: none;
    padding: 0 15px;
    border: none;
    cursor: pointer;
    background: var(--gl-button-bg);
    color: var(--gl-button-color);
}

.search-submit:hover {
    color: var(--gl-button-color-hover);
    background: var(--gl-button-bg-hover);
}

.search-form {
    margin-bottom: 30px;
    display: -webkit-box;
    display: flex;
}

.search-field, .search-submit {
    height: 35px;
}

.search-field {
    padding-left: 5px;
    border-radius: 0;
    border: 1px solid #666;
}

.entry a.moretag {
    display: block;
    margin: 15px 0;
    padding: 0.6em;
    width: 150px;
}

/* Button Code End */
h2 a {
    text-decoration: none;
}

/* Alignment */
.alignleft {
    float: left;
    margin: 0 15px 8px 0;
}

.alignright {
    float: right;
    margin: 0 0 8px 15px;
}

.aligncenter {
    display: block;
    margin-left: auto;
    margin-right: auto;
}

.embed-container {
    position: relative;
    padding-bottom: 45.25%;
    height: 0;
    overflow: hidden;
    max-width: 80%;
    margin: auto;
    margin-bottom: 20px;
}

.embed-container iframe, .embed-container object, .embed-container embed {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

.flex-wrapper, .flex-wrapper .wp-block-group__inner-container {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    flex-wrap: wrap;
    -webkit-box-pack: justify;
    justify-content: space-between;
}

.entry aside .wp-block-group__inner-container {
    display: block
}

body.page-id-1457 .main-service-section.less.blue.mob-adj {
    padding-top: 6%
}

.flex-item {
    text-align: center;
    margin-bottom: 30px;
}

#primary-sidebar h2 {
    font-size: 20px;
    font-weight: 700;
    border-bottom: 1px solid #2f7896;
    color: #2f7896;
    text-transform: uppercase;
    margin-bottom: 30px;
}

#primary-sidebar ul {
    padding-left: 0;
    margin-bottom: 30px;
}

#primary-sidebar ul li {
    list-style: none;
}

#primary-sidebar ul li a {
    text-decoration: none;
}

hr {
    border: 0;
    height: 1px;
    background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));
    background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));
    background-image: -webkit-linear-gradient(left, #f0f0f0, #8c8b8b, #f0f0f0);
    background-image: -o-linear-gradient(left, #f0f0f0, #8c8b8b, #f0f0f0);
}

.menu-footer-menu-container {
    width: 100%;
}

.sb-link.current-page {
    color: var(--gl-button-bg-hover);
}

#menu-footer-menu {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: justify;
    justify-content: space-between;
    flex-wrap: wrap;
    padding-left: 0;
}

#menu-footer-menu li {
    list-style: none;
}

.menu-level-1 {
    display: none
}

/* Dropdown Menus End */

.wp-block-group.has-background {
    padding: 2rem;
}

.footer-menu-link {
    padding: 1em;
}

/** Column Shadow Boxes **/
.wp-block-columns.box-columns {
    margin-bottom: 30px !important;
}

.box-columns .wp-block-column {
    border: 1.2px solid #e5e5e5;
    padding: 20px 20px 0 20px;
    height: auto;
    min-height: 280px;
    background-color: #fbfbfb;
    box-shadow: 2px 2px 6px 0 rgba(0, 0, 0, .19);
    -webkit-transition: all 400ms ease;
    -moz-transition: all 400ms ease;
    -ms-transition: all 400ms ease;
    transition: all 400ms ease;
}

.box-columns .wp-block-column:hover {
    /*box-shadow: 2px 2px 6px 0 rgba(0, 0, 0, .49);*/
}

/*** GUTTENBERG CALLOUT BOX GROUPS ***/
.box-outline {
    border: 1px solid var(--gl-button-bg);
    padding: 30px 30px 0 30px;
    margin: 0 0 30px 0;
    display: block;
}

.box-solid {
    background-color: var(--gl-button-bg);
    padding: 30px 30px 0 30px;
    margin: 0 0 30px 0;
    display: block;
    color: #fff !important;
}

.box-solid h2, .box-solid h3, .box-solid h4, .box-solid p, .box-solid a, .box-solid li, .box-solid figcaption, .box-solid blockquote, .box-solid cite {
    color: #fff !important;
}

.box-solid .ui-button, .box-solid .wp-block-button__link {
    background-color: #fff !important;
    color: var(--gl-button-bg) !important;
}

.box-solid .ui-button:hover, .box-solid .wp-block-button__link:hover {
    background: var(--gl-button-bg-hover) !important;
    color: var(--gl-button-color) !important;
}

/*** KADENCE OVERRIDES ***/

/*** BIO ROW HOVER REVERSE TO COLOR/BLACK WHITE ***/
.kt-info-animate-grayscale img, .kt-info-animate-grayscale-border-draw img {
    -webkit-filter: none !important;
    filter: none !important;
}

.kt-blocks-info-box-link-wrap:hover .kt-info-animate-grayscale img, .kt-blocks-info-box-link-wrap:hover .kt-info-animate-grayscale-border-draw img {
    -webkit-filter: grayscale(100%) !important;
    filter: grayscale(100%) !important;
}

.top-floating-button {
    display: none;
    text-decoration: none;
    position: fixed;
    bottom: 20px;
    right: 20px;
    z-index: 999;
    font-size: 15px;
    border: none;
    outline: none;
    background-color: var(--gl-button-bg);
    color: white;
    padding: 10px;
    border-radius: 0;
    opacity: .7 !important;
    -webkit-transition: all 200ms ease;
    transition: all 200ms ease;
}

.top-floating-button:hover {
    background-color: var(--gl-button-bg-hover);
}

/* AudioEye's floating launcher is hidden on phones (owner, 2026-10-12): on a
   small screen it covers content and stacks onto the location contact bar and
   Klara's bubble. Phones open AudioEye from the footer's "Accessibility Help"
   link instead (data-ae-client-feedback-link, AudioEye's own hook). Its corner
   on larger screens is set in the AudioEye dashboard, not here. Two ids +
   !important, because AudioEye shows the launcher over an inline display:none. */
@media screen and (max-width: 767px) {
    #ae_app #ae_launcher {
        display: none !important;
    }
}

.tabs-content-2 {
    background-color: hsl(0deg 0% 90% / 73%);
}

/*** BLOG START ***/
.post-excerpt {
    margin-bottom: 30px;
    padding: 20px;
    box-shadow: 1px 1px 11px 0 rgb(68 68 70 / 17%);
}

.blog-entry-wrapper {
    display: -webkit-box;
    display: flex;
    -webkit-box-pack: justify;
    justify-content: space-between;
    -webkit-box-align: center;
    align-items: center;
}

.blog-entry-wrap {
    width: 65%;
}

.featured-img-post {
    width: 30%;
    display: -webkit-box;
    display: flex;
    -webkit-box-pack: center;
    justify-content: center;
}

.blog-logo {
    max-width: 270px;
    width: 100%;
}

h2.blog-title-excerpt {
    margin-top: 0;
    font-size: 28px;
    line-height: 1.3;
    margin-bottom: 5px;
}

.blog-grid .blog-grid-wrapper {
    display: -ms-grid;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
    grid-gap: 3rem;
    margin: 0 auto 3rem auto;
}

.blog-grid-wrapper .grid-excerpt {
    max-width: 550px;
}

a.grid-excerpt {
    background-color: var(--gl-button-bg);
    padding: 20px;
    text-decoration: none;
    position: relative;
}

/* Cream on hover, not the buttons' gold (owner, 2026-10-12). Only the card —
   --gl-button-bg-hover stays gold for every button. Text turns black
   (--gl-button-color-hover, below): ~19:1 on the cream. */
a.grid-excerpt:hover {
    background-color: #fcf5e9;
}

p.blog-grid-meta {
    margin-top: 10px;
    margin-bottom: 10px;
    font-size: 14px;
}

.grid-excerpt img {
    aspect-ratio: 16/9;
    width: 100%;
    -o-object-fit: cover;
    object-fit: cover;
}

.grid-excerpt img.post-logo, .grid-excerpt .post-logo img {
    -o-object-fit: contain;
    object-fit: contain;
}

h2.blog-grid-title {
    font-size: 24px;
    line-height: 1.3;
    margin-bottom: 10px;
    margin-top: 0;
}

a.grid-excerpt * {
    color: var(--gl-button-color);
}

a.grid-excerpt:hover * {
    color: var(--gl-button-color-hover);
}

/* ---------------------------------------------------------------------------
 * Blog cards with no featured image (2026-09-21, owner).
 *
 * The card falls back to the site logo, but `a.grid-excerpt` is navy
 * (--gl-button-bg: #001543) and the logo is the reverse mark, so it vanished
 * into its own card. The templates now add `gsd-no-thumb` when
 * has_post_thumbnail() is false, which is what lets this paint a panel behind
 * ONLY the fallback and leave real featured images alone.
 *
 * ⚠ The padding matters as much as the colour: `.grid-excerpt img` is
 * aspect-ratio 16/9 with object-fit swapped to `contain` for .post-logo, so
 * without padding the mark touches the panel edges.
 * ------------------------------------------------------------------------- */
.grid-excerpt.gsd-no-thumb img.post-logo,
.featured-img-post.gsd-no-thumb img.post-logo {
    background-color: #f4f3ef;
    padding: 24px;
}

/* ---------------------------------------------------------------------------
 * Blog sidebar: the category list scrolls in its own box (2026-09-21, owner —
 * "I can't scroll to see all the categories until I get to the bottom of all
 * the blog previews").
 *
 * 19 categories ran longer than the viewport, and the aside is
 * `position: sticky`, so the list's own end sat below the fold until the post
 * loop had been scrolled past. Capping it hands the list an internal scroll.
 *
 * ⚠ `overscroll-behavior: contain` stops a wheel gesture that reaches the end
 * of the list from chaining on to the page behind it — without it the fix
 * trades one scrolling surprise for another.
 * ------------------------------------------------------------------------- */
.related-topics-div .wp-block-categories {
    max-height: 22em;
    overflow-y: auto;
    overscroll-behavior: contain;
    padding-right: 8px;
}

/* ---------------------------------------------------------------------------
 * Repugen reviews widget: reserve the space and show a skeleton (2026-09-21).
 *
 * The embed is already `defer`red, so it never blocked first paint — measured
 * on /testimonials/ the script is only 5.6KB but answers in ~700ms, and it
 * then makes a SECOND round trip for the review data. So the widget area sat
 * blank for over a second and then shoved the page down. Nothing local can
 * make Repugen faster; this holds the space and says what is happening.
 *
 * ⚠ Keyed on `:empty`, which is exact here — the block emits
 * `<div id="rev-widget"></div>` with no whitespace inside, so the selector
 * matches until Repugen injects its first child and then stops matching on its
 * own. No JS, no MutationObserver, and nothing to unwind.
 *
 * ⚠ The second animation RETIRES the skeleton after 15s. If Repugen is down —
 * or ever changes to inject a sibling rather than a child, which would leave
 * `:empty` true forever — the placeholder fades instead of becoming a
 * permanent fake loading state. Same self-clearing principle as the provider
 * join-date badge.
 * ------------------------------------------------------------------------- */
#rev-widget:empty {
    display: block;
    min-height: 400px;
    border-radius: 4px;
    background-color: #f4f3ef;
    background-image: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, .75) 50%, rgba(255, 255, 255, 0) 100%);
    background-repeat: no-repeat;
    background-size: 200% 100%;
    position: relative;
    animation: gsd-skeleton-shimmer 1.4s ease-in-out infinite,
    gsd-skeleton-retire .4s linear 15s forwards;
}

#rev-widget:empty::after {
    content: "Loading reviews\2026";
    position: absolute;
    left: 0;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    text-align: center;
    color: #4a5463;
    font-size: 15px;
}

@keyframes gsd-skeleton-shimmer {
    from {
        background-position: 200% 0;
    }
    to {
        background-position: -200% 0;
    }
}

@keyframes gsd-skeleton-retire {
    to {
        opacity: 0;
        min-height: 0;
    }
}

/* Keep the retire animation — only the shimmer is motion. */
@media (prefers-reduced-motion: reduce) {
    #rev-widget:empty {
        animation: gsd-skeleton-retire .4s linear 15s forwards;
    }
}

.nav-links {
    display: -webkit-box;
    display: flex;
    -webkit-box-pack: justify;
    justify-content: space-between;
}

.nav-link-buttons .nav-links {
    display: -ms-flexbox;
    display: -webkit-box;
    display: flex;
    -webkit-box-pack: justify;
    justify-content: space-between;
    flex-wrap: wrap;
}

.nav-link-buttons .nav-links {
    -webkit-box-pack: center;
    justify-content: center;
}

.nav-link-buttons .nav-links > * {
    width: 40px;
    padding: 10px;
    margin-top: 1em;
    margin-right: 10px;
    border-radius: 0;
    text-align: center;
    font-size: 1.2em;
}

.nav-link-buttons .nav-links a {
    color: var(--gl-button-color);
    background: var(--gl-button-bg);
    text-decoration: none;
}

.nav-link-buttons .nav-links a:hover, .nav-link-buttons .nav-links .current {
    background: var(--gl-button-bg-hover);
    color: var(--gl-button-color-hover);
}

.wp-block-image.img-50 figure {
    width: 49% !important;
}

.services-single-image {
    display: grid;
    grid-template-columns: 30% 70%;
    border: 1px solid #c5c5c5;
    width: 100%;
}

.services-single-image .links {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    height: 100%;
    padding: 0;
}

.services-single-image .links a {
    margin: 0;
    display: flex;
    align-items: center;
    flex: 1;
    text-align: left;
    border-bottom: 1px solid #c5c5c5;
}

.services-single-image a svg {
    transition: 0.2s ease-in-out transform;
    margin-left: 5px
}

.services-single-image a:hover svg {
    transform: translateX(10px);
}

.services-single-image .links a:last-child {
    border-bottom: none;
}

.services-single-image img {
    width: 100%;
    object-fit: cover;
    aspect-ratio: 4 / 3;
}

/*** Search modal ***/

.search-button-modal {
    background: none;
    padding: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border: 1px solid #666;
    color: var(--gl-button-color);
    cursor: pointer;
    transition: 0.1s;
    background: var(--gl-button-bg);
}

.search-button-modal:hover {
    background: var(--gl-button-bg-hover);
    color: var(--gl-button-color-hover);
}

.search-button-modal svg {
    width: 15px;
    height: 15px;
}

.modal__overlay {
    position: fixed;
    z-index: 9999;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(0, 0, 0, 0.6);
    display: flex;
    justify-content: center;
    align-items: center;
}

.modal__container {
    position: relative;
    background-color: #fff;
    padding: 30px;
    width: 95%;
    max-width: 500px;
    max-height: 100vh;
    overflow-y: auto;
    box-sizing: border-box;
}

.modal__content button {
    padding: 5px 1em;
    display: block;
}

.modal__close {
    position: absolute;
    right: 10px;
    top: 10px;
    padding: 10px;
    background: transparent;
    border: 0;
}

.modal__close:before {
    content: "\2715";
}

@keyframes mmfadeIn {
    from {
        opacity: 0;
    }
    to {
        opacity: 1;
    }
}

@keyframes mmfadeOut {
    from {
        opacity: 1;
    }
    to {
        opacity: 0;
    }
}

@keyframes mmslideIn {
    from {
        transform: translateY(15%);
    }
    to {
        transform: translateY(0);
    }
}

@keyframes mmslideOut {
    from {
        transform: translateY(0);
    }
    to {
        transform: translateY(-10%);
    }
}

.micromodal-slide {
    display: none;
}

.micromodal-slide.is-open {
    display: block;
}

.micromodal-slide[aria-hidden="false"] .modal__overlay {
    animation: mmfadeIn .3s cubic-bezier(0.0, 0.0, 0.2, 1);
}

.micromodal-slide[aria-hidden="false"] .modal__container {
    animation: mmslideIn .3s cubic-bezier(0, 0, .2, 1);
}

.micromodal-slide[aria-hidden="true"] .modal__overlay {
    animation: mmfadeOut .3s cubic-bezier(0.0, 0.0, 0.2, 1);
}

.micromodal-slide[aria-hidden="true"] .modal__container {
    animation: mmslideOut .3s cubic-bezier(0, 0, .2, 1);
}

.micromodal-slide .modal__container,
.micromodal-slide .modal__overlay {
    will-change: transform;
}

.modal__container .search-field {
    flex: 1;
}

h1.ip-head {
    font-weight: 300;
}

.locations-archive-page {
    margin-top: 200px;
}

.screen-readers {
    position: absolute !important;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
    word-break: normal !important;
    overflow: hidden;
    clip: rect(0 0 0 0);
}

/* Skip Links */
.glacial-skip-link {
    position: absolute;
    top: -9999px;
    left: -9999px;
    -webkit-transition: 0s;
    transition: 0s;
    text-decoration: none;
}

.glacial-skip-link:focus {
    padding: 1em 2em !important;
    top: 20px;
    font-size: 1.2em;
    left: 20px;
    z-index: 99999;
    background: #333;
    color: #fff;
    border: 1px solid #ccc;
}

/* Full width blocks */
.alignfull {
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    overflow-x: hidden;
}

.standard-inner-wrapper, .glacial-footer {
    max-width: var(--gl-max-width, 1350px);
    width: 90%;
    margin: 0 auto;
}

.standard-inner-wrapper {
    padding-top: var(--gl-inner-pad-top);
    padding-bottom: var(--gl-inner-pad-bottom);
}

/* Related Pages bottom */
.related-pages-bottom {
    display: -webkit-box;
    display: flex;
    -webkit-box-align: center;
    align-items: center;
    flex-wrap: wrap;
}

.related-pages-bottom h2 {
    width: 100%;
}

.entry .related-pages-bottom h3 {
    margin: 0;
}

.entry .related-pages-bottom ul {
    display: -webkit-box;
    display: flex;
    flex-wrap: wrap;
    list-style: none;
    padding-left: 0;
    margin-bottom: 0;
    height: 100%;
    -webkit-box-align: center;
    align-items: center;
}

.related-pages-bottom ul li {
    margin-right: 1em;
}

/* Inner page header — navy variant from Mockups/gsd-inner-page-headers.html
   (option 3: SVG water pattern, navy bg, gold hairlines) with option-2 titling
   (eyebrow = parent page, then H1). Markup in template-parts/header/page-title.php.
   Typography is untouched Webflow (.ip-head stays trajan-sans-pro); only
   background, pattern, and colors come from the mockup. The old
   "You Might Also Like" box is gone — related pages render in the sidebar. */
.standard-inner-head.ip-header--navy {
    background-color: #031444;
    border-top: 1px solid rgba(201, 168, 76, 0.45);
    border-bottom: 1px solid rgba(201, 168, 76, 0.45);
    overflow: hidden;
}

.ip-header--navy .ip-bg-svg {
    position: absolute;
    opacity: 0.3;
    top: 0;
    right: 0;
    width: 70%;
    height: 100%;
    pointer-events: none;
}

.ip-header--navy .ip-content {
    position: relative;
    z-index: 2;
}

.ip-header--navy .ip-head {
    color: #fff;
    margin: 0;
}

/* Blog post titles are long-form headlines, not the two-or-three-word service
   names .ip-head was sized for — "Dr. Paul Rose Featured in Parents' "Losing
   Hair After Baby? Dermatologists Share 4 Mistakes to Avoid and 7 Tips to Try""
   is 119 characters — so they run on their own scale: 2.5em on desktop, 2em at
   ≤767px. The size moved twice before settling here (owner, 2026-09-15): 1.5em
   read as too small against the navy banner, the 3em base as too large.

   Scoped to `body.single-post`, so Pages, providers, locations, the blog index
   and the category archives keep the 3em display size, their titles being short
   by construction. Specificity (0,3,1) outranks BOTH the base .ip-head rule and
   webflow.css's ≤479px step-down to 2.5em — which is deliberate: the 2em holds
   all the way down instead of handing back to Webflow at 479px. `line-height:
   1.2em` is relative to the element's own size, so it scales itself. */
body.single-post .ip-header--navy .ip-head {
    font-size: 2.5em;
}

@media (max-width: 767px) {
    body.single-post .ip-header--navy .ip-head {
        font-size: 2em;
    }
}

.ip-header--navy .ip-eyebrow {
    color: rgba(201, 168, 76, 0.85);
    font-size: 12px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    margin: 0 0 10px;
}

/* Single blog post header (includes/gsd/gsd-post-header.php, 2026-10-05):
   linked categories (+ the outlet on a press post) in the eyebrow, the date /
   reading time under the H1, and a "Featuring" pill per tagged provider.
   Replaces the bare category link that used to open the post body.
   Contrast on the navy: gold ~7.4:1, the 78%-white meta line ~11:1. */
.ip-header--navy .gsd-post-eyebrow {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 4px 10px;
    line-height: 1.4;
}

.ip-header--navy .gsd-post-eyebrow a {
    color: #c9a84c;
    text-decoration: none;
    border-bottom: 1px solid transparent;
}

.ip-header--navy .gsd-post-eyebrow a:hover,
.ip-header--navy .gsd-post-eyebrow a:focus-visible {
    border-bottom-color: #c9a84c;
}

.ip-header--navy .gsd-post-eyebrow__outlet {
    color: #fff;
}

.ip-header--navy .gsd-post-sep {
    width: 3px;
    height: 3px;
    border-radius: 50%;
    background: currentColor;
    opacity: 0.6;
    flex: none;
}

.ip-header--navy .gsd-post-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 4px 10px;
    color: rgba(255, 255, 255, 0.78);
    font-size: 15px;
    margin: 12px 0 0;
}

.ip-header--navy .gsd-post-featured {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 18px;
}

.ip-header--navy a.gsd-post-featured__pill {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    max-width: 100%;
    padding: 0 18px 0 0; /* the photo sits flush against the chip's own border */
    border: 1px solid rgba(201, 168, 76, 0.45);
    border-radius: 0; /* square, like every other button and card on the site */
    background: rgba(255, 255, 255, 0.04);
    color: #fff;
    text-decoration: none;
}

.ip-header--navy a.gsd-post-featured__pill:hover,
.ip-header--navy a.gsd-post-featured__pill:focus-visible {
    border-color: #c9a84c;
    background: rgba(201, 168, 76, 0.1);
}

.ip-header--navy a.gsd-post-featured__pill:focus-visible {
    outline: 2px solid #c9a84c;
    outline-offset: 3px;
}

/* Full-width pills on small phones (owner, 2026-10-12). */
@media screen and (max-width: 479px) {
    .ip-header--navy a.gsd-post-featured__pill {
        width: 100%;
    }
}

.gsd-post-featured__avatar {
    flex: none;
    width: 44px;
    height: 44px;
    border-radius: 0;
    overflow: hidden;
}

.gsd-post-featured__avatar img.gsd-post-featured__photo {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: 50% 15%; /* portrait headshots: keep the face, not the chest */
}

.gsd-post-featured__text {
    display: flex;
    flex-direction: column;
    min-width: 0;
    line-height: 1.3;
}

.gsd-post-featured__label {
    color: rgba(201, 168, 76, 0.85);
    font-size: 11px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
}

.gsd-post-featured__name {
    font-size: 16px;
    font-weight: 600;
}

.gsd-post-featured__type {
    font-weight: 400;
    color: rgba(255, 255, 255, 0.72);
}

/* ---------------------------------------------------------------------------
 * Featuring pill on blog cards (2026-10-06) — mainly /blog/category/in-the-media/.
 *
 * The header pill, smaller and UNLINKED (a <span>): the card is already one
 * big <a>. Cards are navy (--gl-button-bg) like the header, so the same gold
 * ring reads; on hover the card turns cream (#fcf5e9 since 2026-10-12, gold
 * before), so the ring goes navy.
 *
 * ⚠ Specificity: `a.grid-excerpt *` (0,1,1) paints every child white and
 * `a.grid-excerpt:hover *` (0,2,1) paints them black. The at-rest colours
 * below are (0,2,1) and come later, so they would ALSO beat the hover rule —
 * which is why the hover state is restated at (0,3,1).
 * ------------------------------------------------------------------------- */
a.grid-excerpt .gsd-card-featured {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin: 4px 0 14px;
}

a.grid-excerpt .gsd-post-featured__pill {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    max-width: 100%;
    padding: 0 14px 0 0;
    border: 1px solid rgba(201, 168, 76, 0.45);
    border-radius: 0;
    background: rgba(255, 255, 255, 0.04);
}

a.grid-excerpt .gsd-post-featured__avatar {
    width: 36px;
    height: 36px;
}

a.grid-excerpt .gsd-post-featured__label {
    color: #c9a84c; /* solid, not the header's 85%: ~8:1 on the navy at 11px */
}

a.grid-excerpt .gsd-post-featured__name {
    font-size: 15px;
}

a.grid-excerpt .gsd-post-featured__type {
    color: rgba(255, 255, 255, 0.72);
}

a.grid-excerpt:hover .gsd-post-featured__pill {
    border-color: rgba(0, 21, 67, 0.45);
    background: rgba(255, 255, 255, 0.12);
}

a.grid-excerpt:hover .gsd-post-featured__label,
a.grid-excerpt:hover .gsd-post-featured__type {
    color: #000;
}

/* Provider type under the H1 (see template-parts/header/page-title.php).
   Matches .ip-eyebrow, but spaced below the title rather than above it. */
.ip-header--navy .ip-subhead {
    color: rgba(201, 168, 76, 0.85);
    font-size: 20px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    margin: 10px 0 0;
}

/* Optional editor-supplied subhead under the H1 (ACF `page_subhead`, any Page —
   see template-parts/header/page-title.php). Reads as a lede sentence, so unlike
   .ip-subhead above it stays sentence-case with no letter-spacing. */
.ip-header--navy .ip-page-subhead {
    color: rgba(255, 255, 255, 0.85);
    font-size: 18px;
    line-height: 1.5;
    max-width: 60ch;
    margin: 12px 0 0;
}

.ip-header--navy .ip-page-subhead a {
    color: #c9a84c;
    text-decoration: underline;
}

.ip-header--navy .ip-rule {
    width: 52px;
    height: 2px;
    background: #c9a84c;
    border: none;
    margin: 16px 0 0;
}

/* Gold water motif filling the navy header (the second .ip-bg-svg variant in
   page-title.php — full bleed and full strength, where .ip-bg-svg is a 70%,
   30%-opacity navy-on-navy wash). */
.ip-banner__pattern {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
}

/* Yoast breadcrumbs under the gold rule. */
.ip-header--navy .ip-breadcrumbs {
    color: #fff;
    font-size: 15px;
    margin-top: 16px;
}

.ip-header--navy .ip-breadcrumbs a {
    color: #fff;
    text-decoration: none;
}

.ip-header--navy .ip-breadcrumbs a:hover {
    color: #c9a84c;
    text-decoration: underline;
}

/* Inner page header — Luminous variant (client, 2026-10-12), on every Page
   under /cosmetics/ (includes/gsd/gsd-luminous-page-title.php decides which).
   Mirrors the /cosmetics/ hero (webflow.css `.ip-luminous-hero`): the same
   water photo under the same 45% white wash, the teal Luminous title
   (`.h2-lum`'s --_luminous---color-2) and the Luminous logo above the eyebrow.
   `cover`, not the hero's native `auto`: a 2000px photo would tile on a wider
   screen.
   Contrast, measured against the photo's DARKEST 8px patch under the wash
   (~#c9e1e6): the teal title is 3.6:1, which passes AA only as large text — it
   always is (3em / 2.5em trajan). The eyebrow is a deep Luminous gold at
   5.3:1 because the hero's own kicker gold #d29f13 is 1.8:1 and fails as small
   text. Breadcrumbs and subhead use the Luminous slate at 8.1:1. */
.standard-inner-head.ip-header--luminous {
    background-color: #d9eff2;
    background-image: linear-gradient(#ffffff73, #ffffff73), url('images/luminous-hero-bg.jpg');
    background-position: center;
    background-size: cover;
    border-top: 1px solid rgba(201, 168, 76, 0.45);
    border-bottom: 1px solid rgba(201, 168, 76, 0.45);
}

.ip-header--luminous .ip-luminous-logo {
    display: block;
    width: 220px;
    max-width: 100%;
    height: auto;
    /* The PNG has a 3% transparent margin on its left; pulling it back lines
       the script's first stroke up with the eyebrow. */
    margin: 0 0 12px -7px;
}

.ip-header--luminous .ip-eyebrow {
    color: #6f5309;
    font-size: 12px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    margin: 0 0 10px;
}

/* 400, not the 300 every other `h1.ip-head` carries (owner, 2026-10-12: "more
   weight"; tried at 600 first, settled on 400). The Typekit kit ships
   trajan-sans-pro at 200/300/400/600/700/900, so every step is a real cut, not
   a synthesised bold. (0,2,0) beats h1.ip-head's (0,1,1). */
.ip-header--luminous .ip-head {
    color: var(--_luminous---color-2);
    font-weight: 400;
    margin: 0;
}

.ip-header--luminous .ip-page-subhead {
    color: var(--_luminous---color-5);
    font-size: 18px;
    line-height: 1.5;
    max-width: 60ch;
    margin: 12px 0 0;
}

.ip-header--luminous .ip-page-subhead a {
    color: var(--_luminous---color-5);
    text-decoration: underline;
}

.ip-header--luminous .ip-rule {
    width: 52px;
    height: 2px;
    background: var(--_luminous---color);
    border: none;
    margin: 16px 0 0;
}

.ip-header--luminous .ip-breadcrumbs {
    color: var(--_luminous---color-5);
    font-size: 15px;
    margin-top: 16px;
}

.ip-header--luminous .ip-breadcrumbs a {
    color: var(--_luminous---color-5);
    text-decoration: none;
}

/* #355a62, not the title teal: a 15px link needs 4.5:1 and gets 5.5:1. */
.ip-header--luminous .ip-breadcrumbs a:hover {
    color: #355a62;
    text-decoration: underline;
}

@media (max-width: 767px) {
    .standard-inner-head.ip-header--luminous {
        background-image: linear-gradient(#ffffff73, #ffffff73), url('images/luminous-hero-bg-p-1080.jpg');
    }

    .ip-header--luminous .ip-luminous-logo {
        width: 170px;
        margin-left: -5px;
    }
}

/* Luminous page body (2026-10-12) — below the Luminous header, the rest of a
   /cosmetics/ subpage follows the /cosmetics/ pillar too. `body.gsd-luminous`
   is set by includes/gsd/gsd-luminous-page-title.php on the same pages as the
   header. Everything is scoped to `.standard-inner-wrapper`, so a Full Bleed
   page under /cosmetics/ (no such wrapper) is untouched.
   Surfaces are the owner's picks (2026-10-12): a pale-blue intro panel, a
   faint cream sidebar with a light-blue open bar, and the cream grid cards
   left as they are. Headings are teal (`.h2-lum`), sub-heads slate (`.h5-lum`),
   accents Luminous gold.
   Contrast: the teal is a mid-tone — 4.6:1 on the intro, 4.5:1 on the cream
   cards, 4.1:1 on the open bar — so it is used only for h2s (always large
   text, 28.8px and up) and for non-text marks (arrows, the FAQ +/−). Smaller
   text is slate (9.3:1+) or the deep teal #355a62 the header's breadcrumbs use
   (6.4:1+); hover is the header eyebrow's deep gold #6f5309 (6:1+). The gold
   is decoration only. */
body.gsd-luminous {
    --gsd-lum-intro: #dbf2f76e; /* .gl-page-intro (navy 15% elsewhere) */
    --gsd-lum-aside: #fcf5e95e; /* sidebar (solid cream elsewhere) */
    --gsd-lum-open: #daf0f5; /* the open accordion bar (solid navy elsewhere) */
    --gsd-lum-heading: var(--_luminous---color-2, #4b7881);
    --gsd-lum-ink: var(--_luminous---color-5, #2e3e4a);
    --gsd-lum-link: #355a62;
    --gsd-lum-hover: #6f5309;
    --gsd-lum-accent: var(--_luminous---color, #e1a300);
    --gsd-lum-line: rgba(75, 120, 129, 0.22); /* card + accordion borders */
}

/* The intro panel. The cream grid cards (gl-cellbg-cream) keep their cream. */
.gsd-luminous .standard-inner-wrapper .gl-page-intro {
    background-color: var(--gsd-lum-intro);
}

/* Content headings. :where() keeps the scope at zero specificity, so this
   only beats the bare h2/h3/h4 defaults in webflow.css — any heading with a
   class rule of its own (dark grid cells, the components below) keeps it. */
:where(.gsd-luminous .standard-inner-wrapper) h2 {
    color: var(--gsd-lum-heading);
}

:where(.gsd-luminous .standard-inner-wrapper) :is(h3, h4) {
    color: var(--gsd-lum-ink);
}

.gsd-luminous .standard-inner-wrapper .special-line {
    background-color: var(--gsd-lum-accent);
}

.gsd-luminous .standard-inner-wrapper .gl-list--arrow li::before {
    background-color: var(--gsd-lum-heading);
}

.gsd-luminous .standard-inner-wrapper .gl-faq summary::after {
    color: var(--gsd-lum-heading);
}

/* Text links in prose (navy elsewhere). (0,1,2): beats `.entry a`, still loses
   to the dark-section rule near the top of this file. */
:where(.gsd-luminous .standard-inner-wrapper) :is(p, li, td, dd, dt, blockquote, figcaption, address) a:is(:not([class]), .gsd-phone-link) {
    color: var(--gsd-lum-link);
}

:where(.gsd-luminous .standard-inner-wrapper) :is(p, li, td, dd, dt, blockquote, figcaption, address) a:is(:not([class]), .gsd-phone-link):hover {
    color: var(--gsd-lum-hover);
}

/* Buttons: webflow.css's `.button.lum` look (gold outline, teal label), but
   the label is the deep teal and the hover fills teal under WHITE — `.button.lum`
   fills gold under white, ~2:1. White on the teal is 4.9:1. */
.gsd-luminous .standard-inner-wrapper :is(a.wp-block-button__link, button.wp-block-button__link, a.ui-button),
.gsd-luminous .standard-inner-wrapper .gsd-provided-locations__toggle {
    border-color: var(--gsd-lum-accent);
    color: var(--gsd-lum-link);
}

.gsd-luminous .standard-inner-wrapper :is(a.wp-block-button__link, button.wp-block-button__link, a.ui-button):hover,
.gsd-luminous .standard-inner-wrapper .gsd-provided-locations__toggle:hover {
    border-color: var(--gsd-lum-heading);
    background: var(--gsd-lum-heading);
    color: #fff;
}

/* Sidebar: a fainter cream, and the navy inside it goes Luminous. Each rule
   repeats its base selector below, one class stronger, so every state (hover,
   open, current) is covered. */
.gsd-luminous .standard-inner-wrapper aside {
    background: var(--gsd-lum-aside);
    border-top-color: var(--gsd-lum-accent);
}

.gsd-luminous .gsd-specialties__heading {
    color: var(--gsd-lum-link);
    border-bottom-color: var(--gsd-lum-accent);
}

.gsd-luminous .gsd-specialties__section,
.gsd-luminous .gsd-specialties__links li {
    border-color: var(--gsd-lum-line);
}

.gsd-luminous .gsd-specialties__summary {
    color: var(--gsd-lum-ink);
}

.gsd-luminous .gsd-specialties__summary::after {
    border-top-color: var(--gsd-lum-accent);
}

.gsd-luminous .gsd-specialties__summary:hover {
    background: rgba(75, 120, 129, 0.08);
}

/* Light blue under dark text (slate on it is 9.3:1), not navy under white. */
.gsd-luminous .gsd-specialties__section[open] > .gsd-specialties__summary {
    background: var(--gsd-lum-open);
    color: var(--gsd-lum-ink);
}

.gsd-luminous .gsd-specialties__list a,
.gsd-luminous .gsd-specialties__links a {
    color: var(--gsd-lum-ink);
}

.gsd-luminous .gsd-specialties__list a:hover,
.gsd-luminous .gsd-specialties__links a:hover,
.gsd-luminous .gsd-specialties__list a[aria-current="page"],
.gsd-luminous .gsd-specialties__links a[aria-current="page"] {
    color: var(--gsd-lum-hover);
}

/* "Provided at These Locations". The phone also gets out of `.entry a`'s
   navy (the gold its own rule asks for loses to that, and is 2.2:1 anyway). */
.gsd-luminous .gsd-provided-locations {
    border-top-color: var(--gsd-lum-accent);
}

.gsd-luminous .gsd-provided-locations__heading {
    color: var(--gsd-lum-heading);
}

.gsd-luminous .gsd-provided-locations__search label,
.gsd-luminous h3.gsd-provided-locations__title {
    color: var(--gsd-lum-ink);
}

.gsd-luminous .standard-inner-wrapper a.gsd-provided-locations__all,
.gsd-luminous .gsd-provided-locations__distance,
.gsd-luminous .standard-inner-wrapper .gsd-provided-locations__card a.gsd-provided-locations__phone {
    color: var(--gsd-lum-link);
}

.gsd-luminous .standard-inner-wrapper a.gsd-provided-locations__all:hover,
.gsd-luminous .standard-inner-wrapper .gsd-provided-locations__card a.gsd-provided-locations__phone:hover {
    color: var(--gsd-lum-hover);
}

.gsd-luminous .gsd-provided-locations__card {
    border-color: var(--gsd-lum-line);
}

.gsd-luminous .gsd-provided-locations__card:focus-within {
    outline-color: var(--gsd-lum-heading);
}

/* Specialties accordion (inner-page sidebar) —
   template-parts/pages/specialties-accordion.php. Native details/summary,
   exclusive-open via name attr; section holding the current page starts open. */
.gsd-specialties__heading {
    font-size: 1.4rem;
    color: var(--color-2, #001543);
    margin: 0 0 1rem;
    padding-bottom: 0.5rem;
    border-bottom: 2px solid var(--color-6, #d29f13);
}

.gsd-specialties__section {
    background: #fff;
    border: 1px solid rgba(0, 21, 67, 0.1);
    /*box-shadow: 0 1px 4px rgba(0, 21, 67, 0.06);*/
    margin: 0 0 0.6rem;
    overflow: hidden;
}

.gsd-specialties__summary {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 0.5rem;
    padding: 0.85rem 1rem;
    font-weight: 600;
    color: var(--color-2, #001543);
    cursor: pointer;
    list-style: none;
    transition: background-color 0.15s, color 0.15s;
}

.gsd-specialties__summary::-webkit-details-marker {
    display: none;
}

.gsd-specialties__summary::after {
    content: "";
    flex: none;
    width: 0;
    height: 0;
    border-left: 8px solid transparent;
    border-right: 8px solid transparent;
    border-top: 9px solid var(--color-6, #d29f13);
    transition: transform 0.2s;
}

.gsd-specialties__summary:hover {
    background: rgba(0, 45, 114, 0.06);
}

.gsd-specialties__section[open] > .gsd-specialties__summary {
    background: var(--color-2, #001543);
    color: #fff;
}

.gsd-specialties__section[open] > .gsd-specialties__summary::after {
    transform: rotate(180deg);
}

.gsd-specialties__list {
    margin: 0;
    padding: 0.85rem 1rem;
    list-style: none;
    max-height: 60vh;
    overflow: scroll;
}

.gsd-specialties__list li {
    margin: 0 0 0.45rem;
}

.gsd-specialties__list a,
.gsd-specialties__links a {
    color: var(--color-10, #002d72);
    text-decoration: none;
    font-size: 17px;
}

.gsd-specialties__list a:hover,
.gsd-specialties__links a:hover {
    color: #94700d;
}

.gsd-specialties__list a[aria-current="page"] {
    color: #94700d;
}

.gsd-specialties__links {
    margin: 0;
    padding: 0;
    list-style: none;
}

.gsd-specialties__links li {
    background: #fff;
    border: 1px solid rgba(0, 21, 67, 0.1);
    margin: 0 0 0.6rem;
}

.gsd-specialties__links a {
    display: block;
    text-decoration: none;
    padding: 0.85rem 1rem;
    font-weight: 600;
    color: var(--color-2, #001543);
}

/* Parity with __list. Currently unreachable: every internal page in that list
   (Mohs 394, Skin Care Products 1457, Hair Restoration 1409) uses Full Bleed
   (Blocks), which renders no sidebar — so nothing is ever "here". Kept so a
   plain-template page added via gsd_specialty_links styles correctly. */
.gsd-specialties__links a[aria-current="page"] {
    color: #94700d;
}

/* "Provided at These Locations" — location card grid auto-appended to service
   pages (includes/gsd/gsd-provided-locations.php). Whole card is the link. */
.gsd-provided-locations {
    margin-top: 3rem;
    padding-top: 2rem;
    border-top: 2px solid var(--color-6, #d29f13);
}

.gsd-provided-locations__heading {
    color: var(--color-2, #001543);
}

/* ZIP sort tools (js/gsd-zip-sort.js — shared with the scheduling pages).
   The whole row is optional —
   only rendered where gsd_provided_locations_zip_enabled() says so. */
.gsd-provided-locations__tools {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1rem;
    margin: 0 0 0.75rem;
}

.gsd-provided-locations__search label {
    display: block;
    margin-bottom: 0.3rem;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--color-2, #001543);
}

.gsd-provided-locations__field {
    position: relative;
    display: inline-block;
}

.gsd-provided-locations__input {
    width: 15rem;
    max-width: 100%;
    padding: 0.6rem 2.2rem 0.6rem 0.75rem;
    border: 1px solid rgba(0, 21, 67, 0.25);
    background: #fff;
    font-size: 0.95rem;
}

.gsd-provided-locations__input:focus-visible {
    outline: 2px solid var(--color-6, #d29f13);
    outline-offset: 1px;
}

.gsd-provided-locations__clear {
    position: absolute;
    top: 50%;
    right: 0.4rem;
    transform: translateY(-50%);
    padding: 0.2rem 0.4rem;
    border: 0;
    background: none;
    color: var(--gsd-ink, #333);
    font-size: 0.9rem;
    line-height: 1;
    cursor: pointer;
}

.gsd-provided-locations__all {
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--color-2, #001543);
}

.gsd-provided-locations__status:empty {
    display: none;
}

.gsd-provided-locations__status {
    margin: 0 0 1rem;
    font-size: 0.9rem;
    color: var(--gsd-ink, #333);
}

.gsd-provided-locations__distance {
    font-size: 0.8rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    text-transform: uppercase;
    color: var(--color-2, #001543);
}

.gsd-provided-locations__grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    gap: 1.25rem;
}

.gsd-provided-locations__card {
    display: flex;
    flex-direction: column;
    background: #fff;
    border: 1px solid rgba(0, 21, 67, 0.1);
    overflow: hidden;
    box-shadow: 0 1px 6px rgba(0, 21, 67, 0.07);
    text-decoration: none;
    transition: transform 0.15s, box-shadow 0.15s;
}

.gsd-provided-locations__card:hover {
    transform: translateY(-3px);
    box-shadow: 0 6px 18px rgba(0, 21, 67, 0.14);
}

.gsd-provided-locations__photo {
    margin: 0;
}

.gsd-provided-locations__photo img {
    display: block;
    width: 100%;
    height: 130px;
    object-fit: cover;
}

.gsd-provided-locations__body {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    padding: 0.9rem 1rem 1.1rem;
}

h3.gsd-provided-locations__title {
    margin: 0;
    font-size: 1.05rem;
    line-height: 1.25;
    color: var(--color-2, #001543);
}

p.gsd-provided-locations__address {
    margin: 0;
    font-size: 0.85rem;
    line-height: 1.45;
    color: var(--gsd-ink, #333);
}

.gsd-provided-locations__phone {
    margin-top: auto;
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--color-6, #d29f13);
}

a.gsd-provided-locations__card {
    text-decoration: none;
}

/* The card is a <div> since 2026-10-08 so its phone can be a tel: link (a link
   can't nest in a link). The office-name link is stretched over the whole card;
   the phone sits above it. (0,2,1)/(0,2,0)+ because `.entry a` (0,2,0) would
   otherwise underline and recolour both. */
.gsd-provided-locations__card {
    position: relative;
}

.gsd-provided-locations__card a.gsd-provided-locations__link {
    color: inherit;
    text-decoration: none;
}

.gsd-provided-locations__card a.gsd-provided-locations__link::after {
    content: "";
    position: absolute;
    inset: 0;
}

.gsd-provided-locations__card a.gsd-provided-locations__link:focus-visible {
    outline: none;
}

.gsd-provided-locations__card:focus-within {
    outline: 2px solid var(--color-2, #001543);
    outline-offset: 2px;
}

.gsd-provided-locations__card a.gsd-provided-locations__phone {
    position: relative;
    z-index: 1;
    align-self: flex-start;
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* Truncation (2026-09-14). The busiest service pages list 39 offices — a wall
   on desktop, a screen-and-a-half of photos on a phone. Collapsed, the grid
   keeps the first 6 cards on desktop and NONE at <= 767px, where the ZIP field
   is the interaction; js/gsd-provided-locations.js flips the state class on the
   button. The cards stay in the DOM and the rules run on :nth-child, so the ZIP
   sort's reordering decides WHICH six are on screen — always the nearest.
   ⚠ The 6, the 3 and the 767px are duplicated in
   includes/gsd/gsd-provided-locations.php (gsd_provided_locations_limits(),
   which the button's label counts with). Change them together. */
.gsd-provided-locations--collapsed .gsd-provided-locations__card:nth-child(n + 7) {
    display: none;
}

.gsd-provided-locations__more {
    margin-top: 1.75rem;
    text-align: center;
}

/* Mirrors the Webflow .button look — the shared rule at the top of this file is
   anchor-qualified (a.ui-button, button.wp-block-button__link), and this is
   neither. Navy on transparent, filling on hover, like every other CTA. */
.gsd-provided-locations__toggle {
    display: inline-block;
    padding: 13px 28px;
    border: 2px solid var(--color-2, #001543);
    border-radius: 0;
    background: transparent;
    color: var(--color-2, #001543);
    font-size: 1rem;
    font-weight: 500;
    line-height: 1;
    text-align: center;
    cursor: pointer;
    transition: color .2s, background-color .2s;
}

.gsd-provided-locations__toggle:hover {
    color: var(--color, #fff);
    background: var(--color-2, #001543);
}

.gsd-provided-locations__toggle:focus-visible {
    outline: 2px solid var(--color-6, #d29f13);
    outline-offset: 2px;
}

/* Fewer cards than the desktop limit: nothing is hidden there, so the button
   has no job — but it still has one on mobile, where every card is hidden. */
@media (min-width: 768px) {
    .gsd-provided-locations--few .gsd-provided-locations__more {
        display: none;
    }
}

@media (max-width: 767px) {
    .gsd-provided-locations--collapsed .gsd-provided-locations__card {
        display: none;
    }

    /* A ZIP search has to be able to answer itself. Once one has run, the
       nearest offices sort to the front of the grid, so show the first few
       even while the rest of the list is still collapsed. */
    .gsd-provided-locations--collapsed.gsd-provided-locations--zipped .gsd-provided-locations__card:nth-child(-n + 3) {
        display: flex;
    }
}

.standard-inner-wrapper > .main-service-section:first-child:not(.gl-page-intro) {
    padding-top: 0;
}

.entry h5 {
    font-size: 1.3em;

}

@media (max-width: 1080px) {

    .wp-block-image.img-50 figure {
        width: 100% !important;
    }

    /** Center images to avoid narrow text wrap **/
    .alignleft, .alignright, .aligncenter, .wp-block-image .alignright, .wp-block-image .alignleft {
        display: block;
        float: none;
        margin: auto;
        margin-bottom: 20px;
        text-align: center;
    }

    figcaption {
        display: block !important;
    }

    .blog-entry-wrapper {
        flex-wrap: wrap;
        -webkit-box-orient: vertical;
        -webkit-box-direction: reverse;
        flex-direction: column-reverse;
    }

    .blog-entry-wrap, .featured-img-post {
        width: 100%;
    }

    .featured-img-post {
        margin-bottom: 0px;
        text-align: center;
    }

    .attachment-post-thumbnail {
        float: none;
    }

    .blog-entry-wrapper {
        -webkit-box-pack: center;
        justify-content: center;
    }

    .blog-title-excerpt, .blog-entry-wrap p {
        text-align: center;
    }

    .entry a.moretag {
        margin-left: auto;
        margin-right: auto;
    }

}

@media (max-width: 991px) {

    .top-dd-list.w--open {
        right: 0;
    }

    .search-button-modal {
        margin-top: 1em;
        margin-left: 10px;
    }

    .modal__overlay {
        align-items: flex-start;
    }

    .modal__container {
        margin-top: 100px;
    }

    .services-single-image {
        display: flex;
        flex-direction: column-reverse;
    }

    .w--open .w-icon-nav-menu:before {
        content: "\e900";
    }

    aside {
        flex-basis: auto;
        width: 100%;
        border-left: none;
        padding: 10px;
    }

    .pillar-link-grid a {
        padding: 1.5em;
    }

    /* Blog Containers */
    .main-content {
        width: 100%;
        padding-right: 0;
    }

    .embed-container {
        max-width: 100%;
        padding-bottom: 56.25%;
    }

    /* Rollover LASIK Callouts */
    .colorbox {
        display: block;
        z-index: 99999999;
        -webkit-transform: translateX(0px) translateY(0px) translateZ(0px) !important;
        transform: translateX(0px) translateY(0px) translateZ(0px) !important;
        opacity: 1 !important;
    }

    .project-name {
        -webkit-transform: translateX(0px) translateY(0px) translateZ(0px) !important;
        transform: translateX(0px) translateY(0px) translateZ(0px) !important;
    }
}

@media (max-width: 800px) {
    /** Stack Gutenberg Columns & Media Text **/
    .wp-block-columns {
        display: block
    }

    .wp-block-column {
        margin-left: 0px;
        margin-right: 0;
    }

    .wp-block-column:nth-child(2n) {
        margin-left: 0 !important;
    }

    .wp-block-media-text {
        display: -webkit-box !important;
        display: flex !important;
        -webkit-box-orient: vertical;
        -webkit-box-direction: normal;
        flex-direction: column;
        margin-bottom: 0;
    }

    .wp-block-media-text__media img, .wp-block-media-text__media video {
        padding-bottom: 30px;
    }

    .wp-block-media-text .wp-block-media-text__content {
        padding: 0;
    }

    /* Column Shadow Boxes Mobile */
    .box-columns .wp-block-column {
        margin-left: 0;
        margin-bottom: 20px;
        width: 100%;
        flex-basis: unset;
    }

    .wp-block-columns.box-columns {
        flex-wrap: wrap;
    }

    .box-columns .wp-block-column:not(:first-child) {
        margin-left: 0;
    }

}

@media (max-width: 767px) {

    figure.alignleft, img.alignleft, figure.alignright, img.alignright {
        float: none !important;
        display: block !important;
        margin-left: auto !important;
        margin-right: auto !important;
    }

    .kt-sc-textcol {
        margin: 0 !important;
    }

    .kt-row-column-wrap {
        max-width: 100% !important;
    }

    .wp-block-buttons > .wp-block-button {
        width: 100%;
    }

    .blog-grid-wrapper .grid-excerpt {
        max-width: 100%;
    }

}

@media only screen
and (min-device-width: 375px)
and (max-device-width: 667px)
and (-webkit-min-device-pixel-ratio: 2)
and (orientation: landscape) {

}

@media (max-width: 479px) {

    body, :root {
        font-size: 16px;
    }

    a.ui-button, a.wp-block-button__link, button.wp-block-button__link, .entry a.moretag {
        width: 100%;
    }

    .featured-img-post {
        float: none;
        margin: 0 0 30px 0;
        text-align: center;
    }
}

/* Top bar (template-parts/header/menu-banner.php) — Book Online Today is the ONE
   button in the row. Order is About, For Doctors, For Patients, Specials &
   Events, Find a Location, Book Online Today — set in the MARKUP, not with flex `order`, so the keyboard
   tab order matches what is seen.
   The three dropdown toggles were webflow's navy boxes with white text; they now
   read as links, like Find a Location (.top-nav-link): bold navy uppercase text
   on the white bar. Book's label stays at webflow's regular weight. Hover darkens
   the four text items to --color-3 (75% navy, ~8.1:1 on white; webflow's
   --color-5 was 25% navy, ~1.75:1) and underlines the label.
   The dropdown icons are hidden >=992px; Find a Location and Book keep theirs.
   Below 992px webflow already hides the dropdown icons (.hide-tab) and brings
   them back at <=479px, where every label is hidden and the icon IS the item.
   They are inline SVGs filled with currentColor (the image files are
   white-filled for the old box), pinned navy here.
   The caret (.icon-3) stays as the dropdown cue. It is absolutely positioned
   inside the toggle, so padding-right is its 1em width plus a 6px gap, with
   webflow's 8px right margin zeroed. Gaps follow .top-nav-link: 20px, 10px at
   <=479px. Same specificity as webflow.css and loaded after it, so these also
   replace webflow's <=479px `.top-dd-toggle { padding-right: 20px }`.
   components.css zeroes the toggle's :focus outline and the navy fill was the
   only thing that marked focus, hence the :focus-visible ring. */
.top-dropdown {
    margin-right: 20px;
}

.top-dd-toggle,
.top-dd-toggle:hover {
    background-color: transparent;
}

.top-dd-toggle {
    color: var(--color-2);
    padding: 0 calc(1em + 2px) 0 0;
    line-height: 1.2em;
}

/* A dropdown keeps its hover state while the pointer is in its open panel: the
   panel is inside .top-dropdown, so :hover on the wrapper still matches there,
   and webflow.js puts .w--open on the toggle for as long as the panel is open —
   which also covers a panel opened from the keyboard or by a tap. */
.top-dropdown:hover > .top-dd-toggle,
.top-dd-toggle.w--open,
.top-nav-link:not(.special):hover {
    color: var(--color-3);
}

.top-dropdown:hover > .top-dd-toggle .nav-top-link-txt,
.top-dd-toggle.w--open .nav-top-link-txt,
.top-nav-link:not(.special):hover .nav-top-link-txt {
    text-decoration: underline;
    text-underline-offset: 3px;
}

.top-dd-toggle .nav-top-link-txt,
.top-nav-link:not(.special) .nav-top-link-txt {
    font-weight: 700;
}

/* No icon ever sits beside a dropdown label, so no gap before it either. */
.top-dd-toggle .nav-top-link-txt {
    margin-left: 0;
}

@media (min-width: 992px) {
    .top-dd-toggle .top-nav-icon {
        display: none;
    }
}

.top-dd-toggle .icon-3 {
    margin-right: 0;
}

.top-dd-toggle .top-nav-icon {
    color: var(--color-2);
}

/* Webflow sizes .top-nav-icon by width only; the SVG's height attribute would
   otherwise stay 25px when the <=479px rule below narrows it to 18px. */
.nav-link-holder svg.top-nav-icon {
    height: auto;
}

.top-dd-toggle:focus-visible {
    outline: 2px solid var(--color-2);
    outline-offset: 2px;
}

/* Book Online Today, reversed from webflow's: gold at rest, navy on hover. The
   label is navy on the gold (~7.4:1; white on gold is ~2.4:1 and fails 1.4.3)
   and white on the navy. The icon is currentColor, so it follows the label. */
.top-nav-link.special {
    background-color: var(--color-6);
    color: var(--color-2);
}

.top-nav-link.special:hover {
    background-color: var(--color-2);
    color: var(--color);
}

/* Room for Specials & Events (2026-10-05). The fourth dropdown label costs
   ~190px, and the row (logo 250px + five items) was already ~1030px wide, so
   from 992px to roughly 1220px it would no longer fit. In that band Find a Location
   goes icon-only, as it already is below 992px (the pin needs no label; its
   aria-label in menu-banner.php names it), and the item gaps drop from 20px to
   14px. :not(.special) leaves Book Online Today's label alone. */
@media (min-width: 992px) and (max-width: 1279px) {
    .top-nav-link:not(.special) .nav-top-link-txt.hide {
        display: none;
    }

    .top-dropdown,
    .top-nav-link:not(.special) {
        margin-right: 14px;
    }

    /* 2026-10-08: Blog & Media is a fifth dropdown, so in this band the two
       icon-bearing dropdowns (Specials & Events, Blog & Media — the ones whose
       label is `.hide` and whose icon has no `.hide-tab`) go icon-only too. Their
       aria-label names them. (0,3,0) beats the >=992px icon-hiding rule. */
    .top-dd-toggle .nav-top-link-txt.hide {
        display: none;
    }

    .top-dd-toggle .top-nav-icon:not(.hide-tab) {
        display: block;
    }
}

/* The logo is the only flexible item in the non-wrapping .nav-top-items row,
   and it is `width: 100%` (navigation.css) with a fixed `height: 70px` (.image),
   so when the row ran short it used to squash HORIZONTALLY. contain scales it
   down proportionally instead. A logo that fits renders exactly as before:
   its box already has the image's own proportions. */
.nav-top-items .header-logo {
    object-fit: contain;
    object-position: left center;
}

@media (max-width: 479px) {
    .top-dropdown, .top-nav-link {
        margin-right: 14px;
    }

    .top-nav-link.special {
        margin-right: 0;
    }

}

/* Top bar under 480px — the .nav-link-holder icons (template-parts/header/
   menu-banner.php). At <=479px webflow.css hides every label
   (.nav-top-link-txt) and brings the .hide-tab icons back, so the row is the
   logo plus bare icons — since 2026-10-05 just Specials & Events, Find a
   Location and Book Online Today (About / For Doctors / For Patients move into
   the mobile menu at <=767px; see .gsd-topbar-dd--to-mobile-menu below). The icons kept webflow's desktop 25px (.top-nav-icon,
   0,1,0) while the logo, the only elastic thing in the non-wrapping
   .nav-top-items row, absorbed whatever was left. Two classes (0,2,0) beat the
   base rule. The dropdown caret (.icon-3) is a 1em glyph of the toggle's .8em
   type and is already small; left alone. */
@media (max-width: 479px) {
    .nav-link-holder .top-nav-icon {
        width: 18px;
    }

    /* The three top-bar dropdown panels (About / For Patients / For Doctors) ran
       off the LEFT edge of the screen here. Each is absolutely positioned inside
       its own .top-dropdown (position: relative, ~48px wide once the labels are
       hidden) and the <=991px rule above pins it with `right: 0`, so the panel
       hangs leftwards from a ~48px icon. .top-dd-list a is `white-space: nowrap`,
       so "Nurse Practitioners & Physician Assistants" makes the About panel about
       340px wide while its icon sits ~200px into a 375px screen — the panel
       started at a negative x. For Patients ("What To Expect At Your Appointment")
       did the same, less far.

       Fix: center each panel on the SCREEN rather than on its icon. Dropping
       .top-dropdown to `position: static` re-resolves the panel's containing block
       to .nav-top-items — the top-bar row itself, made relative here — which is the
       same device navigation.css uses for .gl-mega-full (static <li> so the panel
       reaches .glacial-top-banner). The row is exactly viewport-wide, so `top: 100%`
       still means "immediately under the icon row" with no header height baked in,
       while left/transform center the box and max-width keeps both edges on screen.

       Not .glacial-top-banner as the anchor: at this width the banner is two rows
       (icons, then the hamburger), so `top: 100%` there would drop the panel below
       the hamburger and detach it from its icon.

       WARNING min-width has to be zeroed: components.css gives every
       .w-dropdown-list `min-width: 100%`, which now measures against the full-width
       row and would force every panel edge-to-edge.
       WARNING nowrap has to go with it, or max-width clips the long labels instead
       of wrapping them. (0,2,0)/(0,2,1) to beat .w-dropdown-list and .top-dd-list a. */
    .nav-top-items {
        position: relative;
    }

    .top-dropdown {
        position: static;
    }

    .top-dd-list.w--open {
        left: 50%;
        width: 100%;
        right: auto;
        transform: translateX(-50%);
        min-width: 0;
        max-width: calc(100% - 20px);
    }

    .top-dd-list.w--open a {
        white-space: normal;
    }
}

/* <=767px: About / For Doctors / For Patients leave the top bar and become a
   section of the mobile menu (owner, 2026-10-05). Which dropdowns move is
   decided in ONE place, gsd_mobile_topbar_menus() in
   includes/gsd/gsd-mobile-topbar-menus.php: it tags the top-bar dropdowns
   (.gsd-topbar-dd--to-mobile-menu) and prints the matching section
   (ul.gsd-mobile-topbar) inside #navigation. These two rules are the swap.
   The section reuses the primary nav's markup, so navigation.css's mobile rules
   style its rows and js/glacial.js opens them with no extra CSS.
   (0,2,1) because `.site-navigation > ul { display: flex }` is (0,1,1). */
@media (max-width: 767px) {
    .top-dropdown.gsd-topbar-dd--to-mobile-menu {
        display: none;
    }

}

@media (min-width: 768px) {
    .site-navigation > ul.gsd-mobile-topbar {
        display: none;
    }
}

/* <=767px: ONE header row — the hamburger joins the top bar (owner,
   2026-10-05), which has the room now that About / For Doctors / For Patients
   live in the mobile menu.

   --gsd-header-h IS the fixed header's height at these widths, and it is SET
   here rather than measured: the top row gets it as an explicit height and the
   menu button is taken out of flow, so .navbar (a flex column whose other
   children are the closed, display:none #navigation and an empty
   glacial_after_nav) is exactly that tall. Everything that clears the header
   below reads the same property, so changing the header height is one edit.
     480–767px: 70px = logo 50px (webflow `.image`) + .brand's 5px margins
                + .nav-top-items' 5px padding.
     <=479px:   60px = logo 40px (navigation.css caps .header-logo at 140px
                wide, 722×206 → 40px tall; it loads after webflow.css, so its
                height:auto beats `.image { height: 45px }`) + the same 20px.
   (0,2,0) on the row: navigation.css sets `.nav-top-items { height: auto }`
   at (0,1,0) and prints after this file.

   The button (#openNavMenu, Webflow's .w-nav-button: a 24px icon glyph +
   navigation.css's padding, 11px <=991px and 7px <=479px, so ~46px / ~38px)
   is absolutely placed at the right of the
   row, centred on it; the row's padding-right keeps the Book button clear of
   it. Webflow still finds it (it looks for .w-nav-button inside the nav), and
   glacial.js still measures .glacial-top-banner to place the open menu, so the
   menu now opens straight under the single row. 768–991px is untouched: the
   three text dropdowns are still in the top bar there and the hamburger keeps
   its own row. */
@media (max-width: 767px) {
    :root {
        --gsd-header-h: 70px;
    }

    .navbar .nav-top-items {
        height: var(--gsd-header-h);
        padding-right: 60px;
    }

    .navbar > #openNavMenu {
        position: absolute;
        top: 50%;
        right: 5px;
        transform: translateY(-50%);
    }

    /* Clear the fixed header — every hero/first section that sits directly
       under it, flush (owner, 2026-09-17: no blank band above a hero on a
       phone). webflow.css gave these 130px / 140px (.new-hero.vein) / 150px
       (.ip-luminous-hero) / 90px (.ip-luminous-hero.est) / 151px
       (.standard-inner-head), and 100px <=479px; style.css used to restate
       them at 89px <=479px, the two-row header's measured height. The block
       heroes all render one of these classes: glacial/home-hero = .new-hero-2,
       lum-hero and lum-video-hero = .ip-luminous-hero, new-hero = .new-hero;
       inner pages get .standard-inner-head from page-title.php.
       ⚠ .location-hero must stay in the list — the export left it out, and
       it alone kept a gap on 54 location pages until 2026-09-17. The two-class
       selectors match webflow's own (0,2,0) and win on source order. */
    .ip-luminous-hero,
    .ip-luminous-hero.est,
    .new-hero,
    .new-hero.vein,
    .new-hero-2,
    .standard-inner-head,
    .location-hero {
        margin-top: var(--gsd-header-h);
    }

    /* /locations/ (templates/template-locations.php) keeps a little air
       above its <h1>, as it does on desktop (200px under a 151px header). */
    .locations-archive-page {
        margin-top: calc(var(--gsd-header-h) + 16px);
    }
}

@media (max-width: 479px) {
    :root {
        --gsd-header-h: 60px;
    }

    /* Inner-page header (page-title.php): 30px top and bottom on small phones
       (owner, 2026-10-12). webflow.css gives it 20% of the width on top below
       992px and 50px below; this loads later at the same (0,1,0), so it wins. */
    .standard-inner-head {
        padding-top: 30px;
        padding-bottom: 30px;
    }
}

/* Any #hash target clears the fixed header (2026-10-12). Arriving at
   /dermatology/#medical-skin from ANOTHER page, the browser's own fragment jump
   parked the section at y=41 (the announcement banner's scroll-padding) under a
   header that ends at y=191, so its first 150px were hidden. A same-page click
   was fine, because Webflow's scroll module measures the header itself; the
   browser's jump knows nothing about it. Measured in Chromium and WebKit: the
   load-time and +2.5s positions were identical, so it is not a late layout shift.
   Same numbers as glacial/service-tabs and the region finder's panels, which
   already carry their own (blocks-frontend.css, gsd-region-finder.css). It adds
   to html's banner scroll-padding, as theirs does. :target (0,1,0) reaches only
   the element the URL names, so nothing else's scrollIntoView() changes. */
:target {
    scroll-margin-top: 172px;
}

@media (max-width: 991px) {
    :target {
        scroll-margin-top: 160px;
    }
}

@media (max-width: 767px) {
    :target {
        scroll-margin-top: calc(var(--gsd-header-h, 103px) + 21px);
    }
}

/* Provider headshot cards — cpt-acf-templates/doctor-headshot-link.php now
   emits the same .service-link tile the location pages use (styled in
   css/webflow.css). The listing templates still wrap each card in
   .cpt-doctor-image-link inside a .cpt-grid, so neutralize that wrapper and
   let the tile fill its grid cell instead of webflow's width:20%.
   :has() scopes this to the new markup — old markup elsewhere is untouched. */
.cpt-doctor-image-link:has(> a.service-link) {
    border: 0;
    box-shadow: none;
    background: none;
}

.cpt-doctor-image-link > a.service-link {
    width: 100%;
    margin: 0;
    min-height: 0;
    aspect-ratio: var(--cpt-doctor-aspect, 4 / 5);
    display: block;
}

/* The headshot must fill the tile for object-fit: cover to crop it. webflow.css
   sets .image-7 { height: 100% } at (0,1,0), but the listing pages render the
   grid inside #main.standard-inner-wrapper.entry, where the generic
   `.entry img { height: auto }` reset above (0,1,1) wins and the photo drops to
   its intrinsic height, leaving the tile short with the gradient band floating.
   Two classes (0,2,0) out-rank the reset; location pages have no .entry wrapper
   and are unaffected either way. */
.service-photo-div .image-7 {
    width: 100%;
    height: 100%;
}

/* Name band: keep the gradient legible and let long credentials wrap. */
.cpt-doctor-image-link .service-link-text-div {
    background-image: linear-gradient(0deg, #000000eb, #0000 32%, #0000);
    font-size: 1em;
    line-height: 1.25;
    text-align: center;
    flex-direction: column;
    justify-content: end;
    align-items: center;
    gap: 2px;
    color: #fff;

}

.doctor-filter-grid {
    margin-bottom: 3rem;
}

.doctor-filter-controls {
    margin-bottom: 1rem;
}

.doctor-filter-controls {
    margin-top: 0;
    padding-bottom: 1em;
}

.service-link-specialty {
    font-size: 0.78em;
    font-weight: 400;
    opacity: 0.9;
}

/* "Joining GSD <date>" on the card of a provider who has not started yet
   (includes/gsd/gsd-provider-join-date.php). Gold on the band's near-black
   gradient foot is ~8.7:1, and it separates the announcement from the name
   without a second font.

   ⚠ The band needs telling to stack. On /providers/ it already does — the
   .cpt-doctor-image-link rule above sets flex-direction: column — but the cards
   on a LOCATION page have no such wrapper and fall through to webflow.css:2531,
   which is a plain `display: flex` ROW. A second child there would sit BESIDE
   the name. :has() scopes the fix to cards that actually carry a date, so every
   other provider card on the site renders exactly as before. */
.service-link-text-div:has(> .gsd-join-date) {
    flex-direction: column;
    justify-content: flex-end;
    align-items: center;
    text-align: center;
    gap: 2px;
}

.gsd-join-date {
    font-size: 0.78em;
    font-weight: 500;
    line-height: 1.25;
    color: var(--color-6, #d29f13);
}

/* The same line as a BANNER across the foot of the headshot on /staff/<slug>/
   (owner request 2026-09-17). cpt-acf-templates/single-provider.php wraps the
   photo in .gsd-headshot only when there is a banner to hang on it, so the ~160
   providers with no start date keep byte-identical markup.

   ⚠ The wrapper is `width: fit-content`, NOT `width: 100%`, and the image is not
   stretched. 47 providers' only headshot is under 800px (open question #9), and
   forcing the photo to fill the 25% column would upscale those into a blur. This
   way the wrapper shrinks to whatever the photo actually renders at and the
   banner spans exactly that.

   ⚠ Navy background, WHITE text — not the gold the card version uses. Gold on
   this navy is 7.4:1 and would pass, but the card's gold sits on a near-black
   photo gradient where white would glare; a solid navy band is a banner, and
   white on it is ~17:1.

   ⚠ Qualified with .gsd-headshot (0,2,0) rather than left at (0,1,0): the card
   rule above sets `color` on the bare .gsd-join-date class, and two rules at the
   same specificity would be decided by source order alone. */
.gsd-headshot {
    position: relative;
    display: block;
    width: fit-content;
    max-width: 100%;
    margin-bottom: 1em;
}

/* The 1em moved up to the wrapper; `display: block` closes the inline-image
   descender gap that would otherwise show as a sliver under the banner. */
.gsd-headshot .doctor-featured-image {
    display: block;
    margin-bottom: 0;
}

.gsd-headshot .gsd-join-date--banner {
    position: absolute;
    right: 0;
    bottom: 0;
    left: 0;
    background: var(--color-2, #001543);
    color: var(--color, #fff);
    padding: 8px 10px;
    text-align: center;
    font-size: 0.85em;
    font-weight: 500;
    line-height: 1.25;
}

/* Closing CTA on a provider listing page — the content after the page's "More"
   divider, which templates/template-providers.php renders below the last
   provider group instead of above the grid (the Providers page's "Join Our
   Team" / Careers block). Centered and rule-separated so it reads as a
   deliberate page-foot CTA rather than a stray heading after ~160 headshots;
   .doctor-filter-grid already supplies the 3rem gap above the rule. */
.providers-archive-outro {
    border-top: 1px solid rgba(0, 21, 67, 0.15);
    padding-top: 2.5rem;
    margin-bottom: 3rem;
    text-align: center;
}

/* core/buttons is display:flex, so text-align on the wrapper doesn't reach it. */
.providers-archive-outro .wp-block-buttons {
    justify-content: center;
}

section.map-section {
    border-bottom: 1px solid #999;
}

@media (max-width: 767px) {

    .cpt-doctor-image-link > a.service-link {
        aspect-ratio: 4 / 5;
        height: auto;
    }
}

/* Slow zoom on the headshot when the card is hovered/focused. The photo lives
   in .service-photo-div, which webflow.css already gives overflow:hidden, so
   the scaled image is clipped to the tile. Applies to both places these cards
   appear: the location pages (glacial/location-providers) and the provider
   listings (cpt-acf-templates/doctor-headshot-link.php).
   - @media (hover: hover) keeps a tap on touch devices from leaving the image
     stuck zoomed via sticky :hover.
   - :focus-visible gets the same affordance for keyboard users.
   - prefers-reduced-motion turns the movement off entirely. */
.service-link .image-7 {
    transition: transform 1.1s ease-out;
    will-change: transform;
}

@media (hover: hover) {
    .service-link:hover .image-7 {
        transform: scale(1.08);
    }
}

.service-link:focus-visible .image-7 {
    transform: scale(1.08);
}

@media (prefers-reduced-motion: reduce) {
    .service-link .image-7 {
        transition: none;
    }

    .service-link:hover .image-7,
    .service-link:focus-visible .image-7 {
        transform: none;
    }
}

/* Footer CTA cards (Pay my bill / Schedule a Consult / Join Our Newsletter) —
   solid navy fades in on hover.

   No overlay element is needed: webflow.css already paints .footer-cta-div with
   the brand navy (--color-2, #001543) and stacks the photo on top of it at 29%
   opacity (.img-div.abs). Fading that photo out IS the navy fading in, and the
   label keeps its own stacking context (.cta-link-txt is z-index:1), so it
   stays legible the whole way through.

   Guards match the headshot zoom above: hover-capable pointers only so a tap
   doesn't leave a card stuck navy, :focus-visible for keyboards, and
   reduced-motion swaps the fade for an instant change rather than dropping the
   affordance. */
.footer-cta-div .img-div.abs {
    transition: opacity 400ms ease-in-out;
}

@media (hover: hover) {
    .footer-cta-div:hover .img-div.abs {
        opacity: 0;
    }
}

.footer-cta-div:focus-visible .img-div.abs {
    opacity: 0;
}

@media (prefers-reduced-motion: reduce) {
    .footer-cta-div .img-div.abs {
        transition: none;
    }
}

/* With Site Options → Footer → Newsletter Signup Link empty, the newsletter card
   is not printed and footer-content.php tags the row `.gsd-cta-grid--two`, so
   the two cards left share the width instead of leaving an empty third column.
   Only from 480px: webflow.css already stacks the row to one column ≤479px. */
@media (min-width: 480px) {
    .cta-holder .grid.gsd-cta-grid--two {
        grid-template-columns: 1fr 1fr;
    }
}

/* CareCredit badges (/financing/) — the two vendor buttons sit side by side.

   They're a core/columns block so they stay editable in Gutenberg, but the
   images are fixed 280x100 vendor assets: left at core's default 50/50 columns
   each badge floats at the left edge of a half-width column with a large gap
   between them. Collapsing the columns to their content width and centring the
   row keeps the pair together at any viewport. Core already stacks columns
   below 782px; flex-wrap covers the narrow range above that. */
.wp-block-columns.gsd-carecredit-buttons {
    justify-content: center;
    flex-wrap: wrap;
    gap: 1.5rem;
}

.gsd-carecredit-buttons .wp-block-column {
    flex-basis: auto;
    flex-grow: 0;
}

.gsd-carecredit-buttons .wp-block-image,
.gsd-carecredit-buttons .wp-block-image figure {
    margin: 0;
}

.page-id-396 .txt-div-48.with-pad.right-align {
    align-items: flex-end;
}

/* "Read More Reviews" button under the homepage testimonial slider.

   The Webflow slider parks its prev/next arrows OUTSIDE its own box —
   .left-arrow/.right-arrow are absolutely positioned at bottom:-60px, so they
   occupy the band from 20px to 60px below the slider — and anything following
   the slider in normal flow starts at that same 20px offset, landing behind
   them. 85px clears the arrows with ~25px to spare, and measures the same at
   every breakpoint because the arrow offset is not responsive.

   Both classes are needed in the selector: .btn-div._100 (webflow.css) also
   sets margin-top, and a single-class rule loses to it on specificity. */
.btn-div._100.gsd-reviews-cta {
    margin-top: 85px;
}

/* Homepage testimonial slider — size the box to the longest review, not to a
   fixed 300px.

   components.css gives every .w-slider a flat `height: 300px`, .w-slider-mask
   and .w-slide inherit it as `height: 100%`, and webflow.css parks
   .testimonial-div at `position: absolute; inset: 0`. So a review taller than
   the box does not grow it and is not clipped either (overflow stays visible) —
   it spills silently over the arrows and, on narrow screens, over the
   "Read More Reviews" button below. The client's 476-character Cosmetic
   Dermatology review overflowed by 71px at 390px wide and 155px at 320px,
   overlapping the button from 375px down.

   Rather than chase that with a per-breakpoint magic height, let the slider
   take its height from its tallest slide and keep 300px as a floor so the
   design's proportions are unchanged wherever the copy already fits (every
   slide but that one, at every breakpoint). .testimonial-div has to leave the
   absolute positioning behind for its text to contribute height at all; it is
   the slide's only child, so relative flow puts it in exactly the same place.

   Scoped to the block's own wrapper class, not to .welcome: .testimonial-div is
   shared with glacial/testimonial-card and glacial/location-testimonials (grid
   cards, which rely on the absolute positioning), and .welcome is itself shared
   with glacial/doctor-card. wp-block-glacial-home-testimonials comes from
   get_block_wrapper_attributes() in this block's render.php and is unique to it.

   Consequence to know about: the box is now as tall as the LONGEST review at
   the current width, on every slide, so shortening that review tightens the
   whole band. */
.wp-block-glacial-home-testimonials .slider.w-slider {
    height: auto;
    min-height: 300px;
}

.wp-block-glacial-home-testimonials .testimonial-div {
    position: relative;
    inset: auto;
}

/* Location picker (glacial/service-locations) — wrap the tile row.

   The Webflow .treatments-holder was drawn for a single row of three or four
   hand-placed tiles: it is a non-wrapping flex row whose children are
   width:25% with a fixed height:100px. This block instead emits one tile per
   matching location, which on /esthetician-services/ is 11 — so the row ran
   275% of its container, dragged the whole document 800px wider than the
   viewport (the page scrolled sideways), and long office names such as
   "Walnut Creek – Lennon Lane General Dermatology" spilled out of the boxes.

   Scoped to this block's wrapper so the hand-built pick-links rows elsewhere
   keep the designer's deliberate single-row behaviour.

   The -50px pull-up that laps the tiles over the section above moves from each
   tile to the holder: applied once at the container it still lifts the first
   row, but no longer pulls every wrapped row up over the one before it. Doing
   it here rather than with :nth-child() keeps it correct at every breakpoint,
   where the tiles-per-row count changes (4 → 2 at 991px → 1 at 479px). */
.wp-block-glacial-service-locations .treatments-holder {
    flex-wrap: wrap;
    justify-content: flex-start;
    margin-top: -50px;
}

.wp-block-glacial-service-locations .treatment-link {
    margin-top: 0;
    height: auto;
    min-height: 100px;
}

/* Mobile stacks the tiles one per row at half height, and drops the pull-up
   entirely (see .treatment-link.lum._25 in the 479px block of webflow.css) —
   match that rather than inheriting the desktop values. */
@media screen and (max-width: 479px) {
    .wp-block-glacial-service-locations .treatments-holder {
        margin-top: 0;
    }

    .wp-block-glacial-service-locations .treatment-link {
        min-height: 50px;
    }
}

/* ==========================================================================
   Location hero — "classic" layout (cpt-acf-templates/single-location.php)

   The client asked for the location hero to read like the old site's, using
   goldenstatedermatology.com/beverly-hills/ as the reference: a full-bleed
   office photo under a dark scrim, with one centred column of copy over it —
   affiliation logo, heading, gold rule, street label, then the buttons.

   Everything is scoped to `.location-hero.gsd-hero-classic`. That matters:
   the markup this replaced was built from Webflow classes
   (.hero-column-left-2, .hero-text-div-white, .hero-text-holder,
   .hero-text-div-white-2, .hero-column-right, .hero-img, .special-line-inner)
   that the glacial/home-hero block and blocks/block-builders.php also emit, so
   restyling them by name would have moved the homepage hero too. The modifier
   keeps this change to the one template — and makes it revertible by deleting
   one class and this block.

   Measurements follow the old page's own Elementor CSS: 620px minimum height,
   50% black scrim, 450px logo cap, centred text. Colours come from the NEW
   brand tokens in css/webflow.css (--color-6 gold #d29f13, --color-2 navy
   #001543) rather than the old site's #B9A25F / #0C2340, so the hero matches
   the rest of this build.
   ========================================================================== */
.location-hero.gsd-hero-classic {
    justify-content: center;
    align-items: center;
    height: auto;
    min-height: 620px;
    padding: 60px 30px;
    overflow: hidden;
}

/* The photo becomes the section's background. .hero-img already carries
   object-fit:cover and 100% width/height from webflow.css; only its
   positioning has to change (it is position:static there). This
   object-position is the ACF "Default (30%)" crop: a little above centre,
   which keeps heads and signage that true centre cut off on many offices
   (tried 2026-10-12, reverted the same day). It was `0 30%` before that,
   which pinned the photo to its LEFT edge on phones, where the banner is
   taller than the photo and cover crops the sides instead. */
.location-hero.gsd-hero-classic .hero-img {
    z-index: 1;
    object-position: 50% 30%;
    position: absolute;
    inset: 0;
}

.search {
    display: block;
}

/* Crop position — ACF `hero_image_position` on the location, emitted by
   cpt-acf-templates/single-location.php as a gsd-hero-pos-* modifier. The
   banner is much wider than it is tall, so object-fit:cover throws away the
   top and bottom of a portrait-ish photo; these let an editor slide the crop
   up or down. VERTICAL ONLY (2026-10-12) — the x stays 50% on every stop, so
   phones, where the sides are what gets cropped, always see the middle. No
   rule for the stored value `center`: it is the "Default (30%)" choice, the
   template emits no class for it, and it falls through to the 50% 30% rule
   above. True centre is `middle`. */
.location-hero.gsd-hero-classic.gsd-hero-pos-top .hero-img {
    object-position: 50% 0%;
}

.location-hero.gsd-hero-classic.gsd-hero-pos-upper .hero-img {
    object-position: 50% 25%;
}

.location-hero.gsd-hero-classic.gsd-hero-pos-middle .hero-img {
    object-position: 50% 50%;
}

.location-hero.gsd-hero-classic.gsd-hero-pos-lower .hero-img {
    object-position: 50% 75%;
}

.location-hero.gsd-hero-classic.gsd-hero-pos-bottom .hero-img {
    object-position: 50% 100%;
}

/* Flat 50% black, exactly as the old page had it — the office photos vary a
   lot in exposure, and a flat scrim is what kept white type legible across all
   of them. */
.location-hero.gsd-hero-classic .loc-hero-scrim {
    z-index: 2;
    background-color: #00000080;
    position: absolute;
    inset: 0;
}

.location-hero.gsd-hero-classic .loc-hero-inner {
    z-index: 3;
    flex-flow: column;
    align-items: center;
    width: 100%;
    max-width: 900px;
    display: flex;
    position: relative;
    text-align: center;
}

/* Optional editor-supplied eyebrow above the heading (ACF `hero_eyebrow`, any
   location — see cpt-acf-templates/single-location.php). The old site used this
   slot for announcements ("Opening October 15th") and for the practice-brand
   line, both bold white and centred over the photo.

   Sized well under the 2.5em .ip-header so it introduces the heading rather
   than competing with it, and deliberately given no rule of its own: the gold
   .special-line-inner already sits under the heading. */
.location-hero.gsd-hero-classic .loc-hero-eyebrow {
    color: var(--color);
    max-width: 700px;
    margin: 0 0 20px;
    font-size: clamp(17px, 1.5vw, 22px);
    font-weight: 700;
    line-height: 1.35;
}

.location-hero.gsd-hero-classic .loc-hero-eyebrow a {
    color: var(--color-6);
    text-decoration: underline;
}

/* Affiliation logo. 450px is the width the old page set on the Beverly Hills
   mark, and the marks are reverse (white) art on transparent, so they need no
   treatment beyond a size cap.

   The cap is on BOTH axes because the marks are wildly different shapes: the
   wordmarks are wide and short (491x102, 2298x632) but the GSD stacked mark is
   nearly square (650x534). Width alone let that one render 450x370 and push the
   whole hero to well over 900px tall. Bounding the height too lands it at
   ~207x170 — close to the 300x246 the old page used — while the wordmarks stay
   width-limited exactly as before, since at 450px wide they are only 93px and
   124px tall. */
.location-hero.gsd-hero-classic .loc-hero-brand {
    width: auto;
    max-width: min(310px, 100%);
    height: auto;
    max-height: 170px;
    margin-bottom: 25px;
    object-fit: contain;
}

.location-hero.gsd-hero-classic .ip-header {
    color: var(--color);
    text-align: center;
    max-width: 800px;
    margin-bottom: 20px;
}

/* webflow.css draws .special-line-inner as a left-bleeding rule
   (margin-left:-200px, min-width:0) for the old left-aligned card. Centred, it
   wants to be a short measured rule instead. */
.location-hero.gsd-hero-classic .special-line-inner {
    width: 120px;
    min-width: 120px;
    margin: 0 auto 20px;
}

.location-hero.gsd-hero-classic h4 {
    color: var(--color);
    margin-top: 0;
    margin-bottom: 25px;
    font-weight: 400;
}

/* Centre the button row and let it wrap: three buttons (Book / Call / Text)
   with full phone numbers in the labels overflow a narrow viewport otherwise.
   The trailing 10px margins webflow.css puts on every .button would push the
   row off-centre, so spacing moves to a gap. */
.location-hero.gsd-hero-classic .btn-div {
    flex-wrap: wrap;
    justify-content: center;
    gap: 10px;
    display: flex;
}

/* Solid navy fill with a gold border (client direction, 2026-09-02). The `rev`
   class in the markup is the Webflow dark-background variant — gold border,
   white label, transparent fill — so only the fill and the hover state are
   added here. A solid fill also means the labels no longer depend on how bright
   the office photo behind them happens to be.

   Hover inverts to a gold fill with navy text rather than keeping .button.rev's
   white, which would sit at about 2:1 against #d29f13. */
.location-hero.gsd-hero-classic .btn-div .button {
    border-color: var(--color-6);
    background-color: var(--color-2);
    color: var(--color);
    margin-bottom: 0;
    margin-right: 0;
}

.location-hero.gsd-hero-classic .btn-div .button:hover,
.location-hero.gsd-hero-classic .btn-div .button:focus-visible {
    background-color: var(--color-6);
    color: var(--color-2);
}

/* The Saturday badge keeps webflow.css's absolute bottom-right placement on
   desktop, where the centred copy column leaves the corner free; it only needs
   to clear the scrim. See the 991px block for why that changes lower down. */
.location-hero.gsd-hero-classic .badge {
    z-index: 4;
}

.single-location .img-div.max-height {
    max-height: 450px;
}

@media screen and (max-width: 991px) {
    /* Below 991px the centred copy column grows wide enough that the badge,
       parked in the bottom-right corner, lands on top of the Call and Text
       buttons and hides their labels. So it comes out of the corner and stacks
       under the buttons instead.

       webflow.css already flips .location-hero to flex-flow:column at this
       width, which is what makes that work: the badge becomes the second item
       in the column. The base rule's justify-content/align-items simply swap
       axes in column flow, so both items stay centred. z-index still applies —
       a static flex item honours it — keeping the badge above the scrim. */
    .location-hero.gsd-hero-classic {
        min-height: 520px;
    }

    .location-hero.gsd-hero-classic .badge {
        position: static;
        max-width: 120px;
        margin: 25px auto 0;
    }
}

@media screen and (max-width: 479px) {
    /* The fixed-header clearance that lived here (89px, the old two-row
       header) moved to the --gsd-header-h block in 2026-10-05, which covers
       every width <=767px. */
    .location-hero.gsd-hero-classic {
        min-height: 480px;
        padding: 40px 20px;
    }

    .location-hero.gsd-hero-classic .loc-hero-eyebrow {
        margin-bottom: 16px;
    }

    .location-hero.gsd-hero-classic .loc-hero-brand {
        max-width: 280px;
        margin-bottom: 20px;
    }

    /* Full-width buttons stacked, so long "Call (925) 932-7704" labels stop
       wrapping mid-number. */
    .location-hero.gsd-hero-classic .btn-div {
        width: 100%;
    }

    .location-hero.gsd-hero-classic .btn-div .button {
        width: 100%;
    }
}

.wp-block-glacial-location-providers .services-holder-2 {
    height: auto;
    min-height: auto;
}

/* --- Service link pills: 16px label below the desktop breakpoint -----------
   webflow.css:676 sets .doc-patient-link to 18px and never revisits it: the
   export's 991 / 767 / 479 blocks only touch width and margin-left, and no
   other rule anywhere sets a font-size on the pill or on the <div> inside it
   (the label inherits). So this one declaration is the whole change.

   Same specificity (0,1,0) as the base rule, so it wins on source order alone
   — style.css is enqueued with main-site-style (webflow.css) as its
   dependency, and blocks-frontend.css, which loads after this, sets no
   font-size here either.

   Deliberately the bare class, so every pill follows: the location pages'
   service lists (glacial/location-services-list, which also prints unlinked
   services as span.doc-patient-link), the homepage pills (glacial/link-pill)
   and the service-tab panes (.gl-svc-pane). 991px is the Webflow tablet
   breakpoint this theme uses throughout; move it to 767 to spare tablets. */
@media screen and (max-width: 991px) {
    .doc-patient-link {
        font-size: 16px;
    }
}

.doctor-specialties-locations li .ui-button {
    max-width: 100% !important;
}
