/*
 * Elepa Consultancy brand overrides.
 * The Glorify theme drives its accent colour off these CSS custom properties
 * (see landing_assets/assets/css/style.css :root). Overriding them here,
 * loaded after style.css/responsive.css, re-themes every component (buttons,
 * links, icon backgrounds, borders) without touching the vendor CSS.
 */
/* :root {
  --glorify-base: #C8102E;
  --glorify-base-rgb: 200, 16, 46;
  --glorify-black: #241417;
  --glorify-black-rgb: 36, 20, 23;
  --glorify-primary: #FBEFEE;
  --glorify-primary-rgb: 200, 16, 46;
} */

/*
 * Banner circle/photo (.banner-one__slider-outer) and the floating
 * "Leaders Coached" card sit at position: absolute relative to
 * .banner-one__left (see style.css), so on desktop they don't add to its
 * height - the section's overall height is driven purely by how tall the
 * left-column text happens to be. The original Glorify demo copy was
 * long/multi-line enough to accidentally clear the ~600px circle + card
 * underneath it; Elepa's shorter banner copy isn't, so the circle
 * overflows past the section's bottom padding and gets squeezed against
 * (or overlapped by) the next section. Reserving min-height here - sized
 * to the circle's own fixed offset/height/card-overhang from style.css,
 * not to any particular copy length - fixes this regardless of how long
 * the banner text is. Below 991px the theme already switches
 * .banner-one__slider-outer back to position: relative (see
 * responsive.css), so it's back in normal flow and doesn't need this.
 */
@media only screen and (min-width: 1320px) {
  .banner-one__left {
    min-height: 620px;
  }
}

@media only screen and (min-width: 1200px) and (max-width: 1319px) {
  .banner-one__left {
    min-height: 550px;
  }
}

@media only screen and (min-width: 992px) and (max-width: 1199px) {
  .banner-one__left {
    min-height: 500px;
  }
}

/*
 * Typed.js phrase in the banner heading (.typed-effect) sits inline
 * right after the static title text. While it's typing, each phrase
 * starts back at zero characters and initially fits on the same line as
 * the title, then jumps down to its own line once it's typed enough
 * characters to no longer fit - a visible reflow/"flicker" every time a
 * new phrase starts. This is fixed with a hard <br> before the span in
 * home/index.html.twig (deterministic, content-length-independent)
 * rather than here, since forcing .typed-effect to display:block would
 * also push its blinking cursor - which typed.js inserts as a plain
 * inline sibling right after the span - onto its own line, breaking the
 * "text|" cursor look.
 *
 * The typed text also needs a z-index above .banner-one__slider-outer:
 * both .banner-one__title-box and .banner-one__slider-outer are
 * position:relative/absolute with z-index:auto inside
 * .banner-one__left's stacking context (see style.css), so whichever
 * comes later in the DOM - the circle - paints on top by default,
 * letting long typed phrases disappear behind it instead of sitting
 * above it.
 */
.banner-one__title-box {
  position: relative;
  z-index: 5;
}

/*
 * .banner-one__title has no max-width in the vendor theme at all - the
 * original demo relied entirely on short, hand-picked words ("We Build
 * Digital") plus manual <br> tags to keep every line well clear of the
 * circle photo, rather than any actual layout constraint. Elepa's real
 * copy is longer, so at 70px/bold it can run wide enough to reach past
 * the circle's left edge before wrapping on its own - worse on the
 * narrower end of the desktop range, since Bootstrap's own container
 * caps at 1140px until the viewport hits 1400px, well before our
 * 1320px circle-size breakpoint kicks in. Constraining the width (and
 * trimming the font-size slightly at the top breakpoint) keeps the
 * heading wrapping safely inside the left column across that whole
 * range. The z-index fix above remains as a backstop for any edge case
 * this doesn't fully cover, so text is never actually invisible even if
 * it brushes the photo.
 */
.banner-one__title-box,
.banner-one__text {
  max-width: 680px;
}

@media only screen and (min-width: 1320px) {
  .banner-one__title {
    font-size: 58px;
  }
}

/*
 * The typed.js phrase (.typed-effect) inherits the same font-size as the
 * static title text. That's fine for short phrases ("Leaders show up"),
 * but a longer one ("Cultures include everyone") can be wide enough to
 * wrap onto a second line within the max-width above. Sizing it down
 * slightly relative to the title (rather than a fixed px value) keeps it
 * proportional at every breakpoint and gives longer phrases typed into
 * this field later some extra room before they wrap, without it looking
 * mismatched against the static heading.
 */
.banner-one__title .typed-effect {
  font-size: 0.85em;
}

/*
 * Product detail page price badge - not part of the original Glorify
 * theme (which only ships a full e-commerce price/discount layout tied to
 * banner/pricing-table markup), so this is a small custom addition rather
 * than misusing an unrelated theme class.
 */
.product-details__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 16px;
  margin-bottom: 20px;
}

.product-details__header .service-details__title-1 {
  margin-bottom: 0;
}

.product-details__price {
  display: inline-block;
  background-color: var(--glorify-base);
  color: var(--glorify-white);
  font-family: var(--glorify-font-two);
  font-size: 22px;
  font-weight: 600;
  padding: 10px 24px;
  border-radius: var(--glorify-bdr-radius);
  white-space: nowrap;
}

/*
 * Contact form input boxes - the theme's .contact-one__input-box styling
 * assumes a plain <input>/<textarea> as the only child. Symfony's form
 * widgets add a wrapping <div class="form-group"> by default even with a
 * custom block, so this keeps the theme look regardless of exactly how
 * the widget renders.
 */
/*
 * Contact form input boxes - the theme's .contact-one__input-box /
 * .contact-page__input-box / .team-details-contact__input-box styling
 * only targets input[type="text"|"email"|"number"]. Symfony's TelType
 * renders <input type="tel">, which none of those selectors match, so
 * phone fields fell back to unstyled browser defaults. Patching the type
 * list here (once, shared across all three forms) rather than switching
 * the field to plain text and losing the mobile numeric-keypad benefit.
 */
.contact-one__input-box input[type="tel"],
.contact-page__input-box input[type="tel"],
.team-details-contact__input-box input[type="tel"] {
  height: 60px;
  width: 100%;
  background-color: transparent;
  border: 1px solid rgba(var(--glorify-black-rgb), .10);
  padding-left: 30px;
  padding-right: 30px;
  outline: none;
  font-size: 16px;
  font-weight: 400;
  color: var(--glorify-gray);
  display: block;
  border-radius: var(--glorify-bdr-radius);
}

.contact-one__input-box .form-group,
.contact-page__input-box .form-group {
  margin-bottom: 0;
}

.contact-one__input-box .form-text,
.form-error-list ul {
  display: block;
  margin: 6px 0 0;
  padding: 0;
  list-style: none;
  font-size: 13px;
  color: var(--glorify-base);
}

/*
 * Review-form star rating - the theme's .review-form-one__rate markup is
 * decorative-only in the static template (five plain <i> icons, no real
 * input), since the demo form never actually submits anywhere. We need a
 * real rating value, so ReviewType renders an expanded ChoiceType (radio
 * buttons) inside this container, and this is the classic CSS-only star
 * widget: radios in reverse DOM order + row-reverse layout so the
 * `~` sibling combinator can fill stars leftward from whichever one is
 * checked/hovered.
 *
 * The icon previously rendered as a missing-glyph box next to a visible
 * "1".."5" because it asked for the "Font Awesome 5 Free" family, but the
 * webfont actually bundled here (landing_assets/assets/css/font-awesome-all.css)
 * is the Pro build, registered under "Font Awesome 5 Pro" - a different family
 * name, so the glyph never resolved. The radio's own choice label (the digit)
 * was left as the only visible thing. Fixed to the real family name below,
 * and the digit is now kept for screen readers but visually hidden so only
 * the star renders.
 */
.review-form-one__rate > div {
  display: flex;
  flex-direction: row-reverse;
  justify-content: flex-end;
  gap: 6px;
}

.review-form-one__rate input[type="radio"] {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.review-form-one__rate label {
  position: relative;
  display: inline-block;
  cursor: pointer;
  font-size: 0;
  line-height: 1;
  border-radius: 6px;
  transition: transform 150ms ease;
}

.review-form-one__rate label:before {
  content: "\f005";
  display: block;
  font-family: "Font Awesome 5 Pro";
  font-weight: 900;
  font-size: 30px;
  line-height: 1;
  color: rgba(var(--glorify-black-rgb), .16);
  transition: color 150ms ease;
}

.review-form-one__rate label:hover {
  transform: translateY(-2px) scale(1.08);
}

.review-form-one__rate input[type="radio"]:checked ~ label:before,
.review-form-one__rate label:hover:before,
.review-form-one__rate label:hover ~ label:before {
  color: var(--glorify-base);
}

.review-form-one__rate input[type="radio"]:focus-visible + label {
  outline: 2px solid var(--glorify-base);
  outline-offset: 3px;
}

/*
 * Combined login / sign-up / forgot-password switcher
 * (templates/security/auth.html.twig). Reuses the theme's existing
 * .login-one__form styling for each panel and just adds the tab bar +
 * the animated cross-fade/slide between panels. All three panels are
 * always in the DOM (so no page reload / flash of unstyled content when
 * switching); only one is visible at a time via .is-active.
 */
.auth-switcher__tabs {
  display: flex;
  justify-content: center;
  gap: 10px;
  margin-bottom: 40px;
}

.auth-switcher__tab {
  border: 2px solid rgba(var(--glorify-black-rgb), .10);
  background-color: transparent;
  color: var(--glorify-black);
  font-family: var(--glorify-font-two);
  font-size: 16px;
  font-weight: 600;
  text-transform: uppercase;
  padding: 12px 34px;
  border-radius: var(--glorify-bdr-radius);
  cursor: pointer;
  transition: all 0.3s ease;
}

.auth-switcher__tab.is-active {
  background-color: var(--glorify-base);
  border-color: var(--glorify-base);
  color: var(--glorify-white);
}

.auth-switcher__stage {
  position: relative;
}

.auth-switcher__panel {
  display: none;
  opacity: 0;
  transform: translateY(16px);
}

.auth-switcher__panel.is-active {
  display: block;
  animation: authPanelIn 0.45s ease forwards;
}

@keyframes authPanelIn {
  from {
    opacity: 0;
    transform: translateY(16px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.auth-switcher__hint {
  color: rgba(var(--glorify-black-rgb), .65);
  max-width: 420px;
  margin: 0 auto 30px;
}

.auth-switcher__flash {
  max-width: 600px;
  margin: 0 auto 30px;
  padding: 16px 24px;
  border-radius: var(--glorify-bdr-radius);
  font-family: var(--glorify-font-two);
  font-size: 15px;
  text-align: center;
}

.auth-switcher__flash--success {
  background-color: rgba(40, 167, 69, .1);
  border: 1px solid rgba(40, 167, 69, .3);
  color: #1e7e34;
}

.auth-switcher__flash--error {
  background-color: rgba(var(--glorify-base-rgb), .08);
  border: 1px solid rgba(var(--glorify-base-rgb), .3);
  color: var(--glorify-base);
}

/*
 * Client portal (templates/portal/*). Reuses .login-one section padding
 * and .wishlist-table for order tables, so this only needs to style the
 * pieces that are genuinely new: the welcome header, the summary cards,
 * and order-status badges.
 */
.portal-welcome {
  text-align: center;
  margin-bottom: 40px;
}

.portal-welcome h2 {
  font-size: 34px;
  color: var(--glorify-black);
  text-transform: uppercase;
  margin-bottom: 8px;
}

.portal-welcome p {
  color: rgba(var(--glorify-black-rgb), .65);
}

.portal-cards {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
  justify-content: center;
  margin-bottom: 60px;
}

.portal-card {
  background-color: var(--glorify-white);
  border: 1px solid rgba(var(--glorify-black-rgb), .08);
  border-radius: var(--glorify-bdr-radius);
  padding: 30px;
  min-width: 220px;
  text-align: center;
  box-shadow: 0px 10px 60px 0px rgb(0 0 0 / 5%);
}

.portal-card__count {
  font-size: 36px;
  font-weight: 700;
  color: var(--glorify-base);
  font-family: var(--glorify-font-two);
  margin-bottom: 6px;
}

.portal-card__label {
  font-size: 15px;
  text-transform: uppercase;
  color: rgba(var(--glorify-black-rgb), .6);
  margin-bottom: 14px;
}

.portal-card__link {
  font-weight: 600;
  color: var(--glorify-black);
}

.portal-card__link:hover {
  color: var(--glorify-base);
}

.portal-section {
  margin-bottom: 40px;
}

.portal-section__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 20px;
}

.portal-section__header h3 {
  font-size: 24px;
  text-transform: uppercase;
  color: var(--glorify-black);
}

.portal-order-summary {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 30px;
  margin-bottom: 30px;
  padding-bottom: 30px;
  border-bottom: 1px solid rgba(var(--glorify-black-rgb), .08);
}

.portal-status {
  display: inline-block;
  padding: 5px 14px;
  border-radius: 20px;
  font-size: 13px;
  font-weight: 600;
  text-transform: uppercase;
}

.portal-status--paid {
  background-color: rgba(40, 167, 69, .12);
  color: #1e7e34;
}

.portal-status--pending {
  background-color: rgba(255, 193, 7, .15);
  color: #a8790a;
}

.portal-status--failed,
.portal-status--cancelled {
  background-color: rgba(var(--glorify-base-rgb), .1);
  color: var(--glorify-base);
}

/* --------------------------------------------------------------------------
 * Checkout payment alerts and UAT notice
 * -------------------------------------------------------------------------- */
.elepa-alert-stack {
    position: fixed;
    top: 105px;
    right: 24px;
    z-index: 99999;
    width: min(460px, calc(100vw - 32px));
    display: grid;
    gap: 12px;
}

.elepa-alert {
    display: grid;
    grid-template-columns: 42px 1fr 32px;
    gap: 14px;
    align-items: start;
    padding: 18px;
    border: 1px solid rgba(17, 24, 39, 0.08);
    border-left-width: 5px;
    border-radius: 14px;
    background: #fff;
    box-shadow: 0 18px 48px rgba(17, 24, 39, 0.18);
    animation: elepa-alert-in .28s ease-out both;
}

.elepa-alert--error { border-left-color: #c62828; }
.elepa-alert--warning { border-left-color: #d97706; }
.elepa-alert--info { border-left-color: #2563eb; }

.elepa-alert__icon {
    width: 42px;
    height: 42px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    font-size: 20px;
    background: #fef2f2;
    color: #c62828;
}

.elepa-alert--warning .elepa-alert__icon { background: #fffbeb; color: #d97706; }
.elepa-alert--info .elepa-alert__icon { background: #eff6ff; color: #2563eb; }

.elepa-alert__content h4 {
    margin: 0 0 5px;
    color: #161616;
    font-size: 17px;
    line-height: 1.35;
}

.elepa-alert__content p {
    margin: 0;
    color: #545454;
    font-size: 14px;
    line-height: 1.6;
}

.elepa-alert__reference {
    margin-top: 8px !important;
    padding-top: 8px;
    border-top: 1px solid #eee;
    font-size: 12px !important;
    word-break: break-word;
}

.elepa-alert__close {
    border: 0;
    background: transparent;
    color: #777;
    font-size: 25px;
    line-height: 1;
    cursor: pointer;
    padding: 0;
}

.checkout-uat-notice {
    display: flex;
    gap: 16px;
    align-items: flex-start;
    margin: 0 0 28px;
    padding: 20px 22px;
    border: 1px solid #f1c75b;
    border-radius: 14px;
    background: #fff8dd;
    box-shadow: 0 10px 28px rgba(73, 53, 0, 0.08);
}

.checkout-uat-notice__badge {
    flex: 0 0 auto;
    padding: 7px 10px;
    border-radius: 8px;
    background: #222;
    color: #fff;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .08em;
}

.checkout-uat-notice h3 {
    margin: 0 0 5px;
    color: #3d2c00;
    font-size: 19px;
}

.checkout-uat-notice p {
    margin: 0;
    color: #69520b;
    line-height: 1.65;
}

#elepa-checkout-submit:disabled {
    cursor: wait;
    opacity: .72;
}

@keyframes elepa-alert-in {
    from { opacity: 0; transform: translateY(-10px) translateX(10px); }
    to { opacity: 1; transform: translateY(0) translateX(0); }
}

@media (max-width: 767px) {
    .elepa-alert-stack {
        top: 82px;
        right: 16px;
        left: 16px;
        width: auto;
    }

    .elepa-alert {
        grid-template-columns: 36px 1fr 24px;
        padding: 15px;
    }

    .elepa-alert__icon {
        width: 36px;
        height: 36px;
        font-size: 17px;
    }

    .checkout-uat-notice {
        padding: 17px;
    }
}
.hide-me{
    display: none!important;
}

/*
 * .rich-text - shared wrapper for any field rendered through the
 * `safe_content` filter (see HtmlContentSanitizer / templates using
 * |safe_content). The vendor theme resets all `ul`/`ol` to
 * `list-style: none` globally (it only ever uses lists for its own nav/icon
 * markup, styled via bespoke classes), so admin-authored bullet and numbered
 * lists rendered straight from the rich text editor lost their markers
 * entirely. Headings/bold text inside admin copy also need an explicit
 * weight here since the surrounding component classes (e.g.
 * .banner-one__text, .service-details__text-2) set font-weight: 400 for
 * their own body copy, and that value is what a bare <strong>/<h3> without
 * its own font-weight would otherwise pick up depending on the browser.
 */
.rich-text ul,
.rich-text ol {
    margin: 0 0 20px;
    padding-left: 22px;
}

.rich-text ul {
    list-style: disc;
}

.rich-text ol {
    list-style: decimal;
}

.rich-text li {
    margin-bottom: 8px;
}

.rich-text li:last-child {
    margin-bottom: 0;
}

.rich-text strong,
.rich-text b {
    font-weight: 700;
}

.rich-text h2,
.rich-text h3,
.rich-text h4 {
    font-weight: 700;
    margin: 24px 0 12px;
}

.rich-text > :first-child {
    margin-top: 0;
}

.rich-text > :last-child {
    margin-bottom: 0;
}

.rich-text blockquote {
    margin: 20px 0;
    padding: 12px 20px;
    border-left: 3px solid var(--glorify-base);
    color: rgba(var(--glorify-black-rgb), .75);
}
/* ================================================================
   Global website search
   ================================================================ */
.site-search-page {
  padding: 100px 0 120px;
  background: #fff;
}

.site-search-page__form-wrap {
  max-width: 920px;
  margin: 0 auto 45px;
}

.site-search-page__form {
  display: flex;
  align-items: stretch;
  overflow: hidden;
  border: 1px solid rgba(var(--glorify-black-rgb), .12);
  border-radius: 10px;
  background: #fff;
  box-shadow: 0 18px 50px rgba(21, 34, 56, .08);
}

.site-search-page__form input {
  min-width: 0;
  flex: 1;
  height: 68px;
  padding: 0 26px;
  border: 0;
  outline: 0;
  background: transparent;
  color: var(--glorify-black);
  font-size: 16px;
}

.site-search-page__form button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-width: 145px;
  padding: 0 28px;
  border: 0;
  background: var(--glorify-base);
  color: #fff;
  font-family: var(--glorify-font-two);
  font-weight: 600;
  text-transform: uppercase;
  transition: background-color 180ms ease;
}

.site-search-page__form button:hover {
  background: var(--glorify-black);
}

.site-search-page__summary {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 20px;
  margin-bottom: 25px;
}

.site-search-page__eyebrow {
  display: block;
  margin-bottom: 4px;
  color: var(--glorify-base);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .08em;
}

.site-search-page__summary h2 {
  margin: 0;
  color: var(--glorify-black);
  font-size: clamp(28px, 4vw, 42px);
}

.site-search-page__filters {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 55px;
}

.site-search-page__filter {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  min-height: 42px;
  padding: 8px 15px;
  border: 1px solid rgba(var(--glorify-black-rgb), .12);
  border-radius: 999px;
  background: #fff;
  color: var(--glorify-black);
  font-size: 14px;
  font-weight: 500;
  transition: all 180ms ease;
}

.site-search-page__filter strong {
  display: inline-grid;
  min-width: 24px;
  height: 24px;
  place-items: center;
  border-radius: 999px;
  background: rgba(var(--glorify-base-rgb), .10);
  color: var(--glorify-base);
  font-size: 12px;
}

.site-search-page__filter:hover,
.site-search-page__filter.is-active {
  border-color: var(--glorify-base);
  background: var(--glorify-base);
  color: #fff;
}

.site-search-page__filter:hover strong,
.site-search-page__filter.is-active strong {
  background: rgba(255, 255, 255, .18);
  color: #fff;
}

.site-search-page__groups {
  display: grid;
  gap: 65px;
}

.site-search-group__heading {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  padding-bottom: 18px;
  border-bottom: 1px solid rgba(var(--glorify-black-rgb), .10);
}

.site-search-group__title {
  display: flex;
  align-items: center;
  gap: 12px;
}

.site-search-group__title > span {
  color: var(--glorify-base);
  font-size: 22px;
}

.site-search-group__title h3 {
  margin: 0;
  color: var(--glorify-black);
  font-size: 28px;
}

.site-search-group__title strong {
  display: inline-grid;
  min-width: 31px;
  height: 31px;
  place-items: center;
  border-radius: 50%;
  background: rgba(var(--glorify-base-rgb), .10);
  color: var(--glorify-base);
  font-size: 13px;
}

.site-search-group__heading > a {
  color: var(--glorify-base);
  font-size: 14px;
  font-weight: 600;
}

.site-search-group__heading > a i {
  margin-left: 5px;
}

.site-search-group__results {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 20px;
  padding-top: 25px;
}

.site-search-result {
  min-width: 0;
  overflow: hidden;
  border: 1px solid rgba(var(--glorify-black-rgb), .10);
  border-radius: 10px;
  background: #fff;
  transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
}

.site-search-result:hover {
  transform: translateY(-3px);
  border-color: rgba(var(--glorify-base-rgb), .40);
  box-shadow: 0 18px 45px rgba(21, 34, 56, .09);
}

.site-search-result__link {
  display: grid;
  grid-template-columns: 145px minmax(0, 1fr);
  height: 100%;
  color: inherit;
}

.site-search-result__media {
  min-height: 190px;
  overflow: hidden;
  display: grid;
  place-items: center;
  background: rgba(var(--glorify-base-rgb), .07);
}

.site-search-result__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.site-search-result__media > span {
  color: var(--glorify-base);
  font-size: 42px;
}

.site-search-result__content {
  display: flex;
  min-width: 0;
  flex-direction: column;
  padding: 24px;
}

.site-search-result__topline {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px 12px;
  margin-bottom: 9px;
}

.site-search-result__type {
  color: var(--glorify-base);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .07em;
  text-transform: uppercase;
}

.site-search-result__meta {
  color: var(--glorify-gray);
  font-size: 12px;
}

.site-search-result__content h4 {
  margin: 0 0 9px;
  color: var(--glorify-black);
  font-size: 21px;
  line-height: 1.25;
}

.site-search-result__content p {
  margin: 0 0 18px;
  color: var(--glorify-gray);
  font-size: 14px;
  line-height: 1.7;
}

.site-search-result__open {
  margin-top: auto;
  color: var(--glorify-black);
  font-size: 13px;
  font-weight: 600;
}

.site-search-result__open i {
  margin-left: 5px;
  color: var(--glorify-base);
  transition: transform 180ms ease;
}

.site-search-result:hover .site-search-result__open i {
  transform: translateX(4px);
}

.site-search-page__state {
  max-width: 760px;
  margin: 40px auto 0;
  padding: 65px 35px;
  border: 1px dashed rgba(var(--glorify-black-rgb), .16);
  border-radius: 12px;
  background: rgba(var(--glorify-base-rgb), .025);
  text-align: center;
}

.site-search-page__state--compact {
  margin-top: 20px;
}

.site-search-page__state-icon {
  display: inline-grid;
  width: 76px;
  height: 76px;
  margin-bottom: 22px;
  place-items: center;
  border-radius: 50%;
  background: rgba(var(--glorify-base-rgb), .10);
  color: var(--glorify-base);
  font-size: 30px;
}

.site-search-page__state h2 {
  margin: 0 0 10px;
  color: var(--glorify-black);
}

.site-search-page__state p {
  max-width: 580px;
  margin: 0 auto;
}

.site-search-page__state .thm-btn {
  margin-top: 25px;
}

.mobile-nav__search-form {
  display: flex;
  overflow: hidden;
  margin: 26px 0;
  border-radius: 6px;
  background: #fff;
}

.mobile-nav__search-form input {
  min-width: 0;
  flex: 1;
  height: 48px;
  padding: 0 15px;
  border: 0;
  outline: 0;
  color: var(--glorify-black);
}

.mobile-nav__search-form button {
  width: 50px;
  border: 0;
  background: var(--glorify-base);
  color: #fff;
}

@media (max-width: 991px) {
  .site-search-group__results {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 575px) {
  .site-search-page {
    padding: 70px 0 90px;
  }

  .site-search-page__form {
    display: grid;
    overflow: visible;
    border: 0;
    box-shadow: none;
    gap: 10px;
    background: transparent;
  }

  .site-search-page__form input {
    width: 100%;
    height: 58px;
    border: 1px solid rgba(var(--glorify-black-rgb), .12);
    border-radius: 8px;
    background: #fff;
  }

  .site-search-page__form button {
    min-height: 54px;
    border-radius: 8px;
  }

  .site-search-group__heading {
    align-items: flex-start;
    flex-direction: column;
  }

  .site-search-result__link {
    grid-template-columns: 92px minmax(0, 1fr);
  }

  .site-search-result__media {
    min-height: 160px;
  }

  .site-search-result__content {
    padding: 18px;
  }

  .site-search-result__content h4 {
    font-size: 18px;
  }

  .site-search-result__meta {
    display: none;
  }
}

.sidebar-order-summary__btn {
    width: 100%;
    margin-top: 25px;
}

.checkout-submit-btn {
    width: 100%;
    max-width: 100%;
    min-width: 0;
    min-height: 58px;
    height: auto;
    padding: 16px 22px;

    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;

    white-space: normal;
    text-align: center;
    line-height: 1.25;
    border: 0;
}

.checkout-submit-btn .checkout-submit-label {
    position: relative;
    z-index: 3;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;

    margin: 0;
    font: inherit;
    font-weight: 700;
    color: inherit;
    line-height: 1.25;
}

.checkout-submit-btn:disabled {
    cursor: wait;
    opacity: 0.85;
}

.checkout-submit-btn.is-loading .checkout-submit-label::before {
    content: "";
    width: 18px;
    height: 18px;
    flex: 0 0 18px;
    border: 2px solid rgba(255, 255, 255, 0.4);
    border-top-color: currentColor;
    border-radius: 50%;
    animation: checkout-button-spin 0.75s linear infinite;
}

@keyframes checkout-button-spin {
    to {
        transform: rotate(360deg);
    }
}

.single-product-style1__overlay li {
    width: auto;
    max-width: calc(100% - 24px);
}

.single-product-style1__overlay li p {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;

    width: auto;
    min-width: 70px;
    max-width: 100%;
    min-height: 35px;
    padding: 7px 14px;

    margin: 0;
    box-sizing: border-box;

    background-color: var(--glorify-white);
    box-shadow: 0 0 35px rgba(0, 0, 0, 0.2);
    color: var(--glorify-base);

    line-height: 1.2;
    font-weight: 600;
    text-align: center;
    white-space: normal;
    overflow-wrap: anywhere;
    border-radius: 2px;
}

.single-product-style1__overlay li p {
    width: max-content;
    min-width: 70px;
    max-width: 180px;
    padding: 7px 14px;

    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.scroll-to-top {
    right: 24px;
    bottom: 24px;
    width: 48px;
    height: 48px;
    padding: 0;
    justify-content: center;
    border: 0;
    border-radius: 50%;
    background: var(--glorify-base);
    color: var(--glorify-white);
    box-shadow: 0 12px 30px rgba(var(--glorify-black-rgb), 0.22);
    overflow: hidden;
    transform: translateY(12px);
}

.scroll-to-top:hover,
.scroll-to-top:focus {
    color: var(--glorify-white);
    background: var(--glorify-black);
}

.scroll-to-top:focus-visible {
    outline: 3px solid rgba(var(--glorify-base-rgb), 0.35);
    outline-offset: 3px;
}

.scroll-to-top__icon {
    position: relative;
    z-index: 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 16px;
    line-height: 1;
}

.scroll-to-top__text {
    display: none;
}

.scroll-to-top__wrapper {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    display: block;
    width: 100%;
    height: 4px;
    background: rgba(255, 255, 255, 0.24);
}

.scroll-to-top__inner {
    background: var(--glorify-white);
}

.scroll-to-top.show {
    bottom: 24px;
    transform: translateY(0);
}

/*
 * Testimonial cards (templates/components/_testimonial_card.html.twig).
 *
 * The Glorify original (.testimonial-one__single) was built for a swiper
 * carousel showing one quote at a time, so it had no height discipline: in
 * the 3-up grid Elepa renders it in, a 2000-character client story made its
 * column three times taller than its neighbours and blew past the section's
 * background band. These rules replace that component wholesale with a
 * self-contained card that:
 *   - stretches to the row height, so all cards in a row match;
 *   - clamps the quote to a fixed number of lines and fades the cut-off edge;
 *   - expands in place via a checkbox toggle (pure CSS - no JS, and no modal
 *     that could be trapped by a transformed animation ancestor).
 */

/* Cols wrap the card; make them flex so the card can stretch to full height. */
.elepa-testimonial-col {
    display: flex;
}

.elepa-testimonial {
    position: relative;
    display: flex;
    flex-direction: column;
    width: 100%;
    margin-bottom: 30px;
    padding: 40px 34px 30px;
    background-color: var(--glorify-white, #fff);
    border: 1px solid rgba(var(--glorify-black-rgb), 0.08);
    border-radius: var(--glorify-bdr-radius);
    box-shadow: 0px 10px 30px rgba(var(--glorify-black-rgb), 0.05);
    transition: transform 400ms ease, box-shadow 400ms ease, border-color 400ms ease;
}

.elepa-testimonial:hover {
    transform: translateY(-6px);
    border-color: rgba(var(--glorify-base-rgb), 0.25);
    box-shadow: 0px 20px 40px rgba(var(--glorify-black-rgb), 0.10);
}

.elepa-testimonial__mark {
    display: block;
    font-size: 26px;
    line-height: 1;
    color: rgba(var(--glorify-base-rgb), 0.35);
    margin-bottom: 18px;
}

/* Body takes the leftover height so the author block always sits on the
   card's bottom edge, lining up across cards of differing quote lengths. */
.elepa-testimonial__body {
    position: relative;
    flex: 1 1 auto;
}

.elepa-testimonial__quote {
    margin: 0;
    font-size: 16px;
    line-height: 30px;
    color: rgba(var(--glorify-gray-rgb), 1);
}

/* Only expandable cards clamp - short quotes render in full with no fade. */
.elepa-testimonial--expandable .elepa-testimonial__quote {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 9;
    line-clamp: 9;
    overflow: hidden;
}

/* Soft fade over the last clamped line so the cut reads as intentional. */
.elepa-testimonial--expandable .elepa-testimonial__body::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 60px;
    pointer-events: none;
    background: linear-gradient(to bottom, rgba(255, 255, 255, 0), var(--glorify-white, #fff));
}

/* Opens the full story in the shared popup (see js/testimonial-modal.js). */
.elepa-testimonial__more {
    align-self: flex-start;
    margin: 14px 0 0;
    padding: 0;
    background: none;
    border: 0;
    font-size: 15px;
    font-weight: 500;
    line-height: 1;
    color: var(--glorify-base);
    cursor: pointer;
    border-bottom: 1px solid rgba(var(--glorify-base-rgb), 0.4);
    transition: color 300ms ease, border-color 300ms ease;
}

.elepa-testimonial__more:hover {
    color: var(--glorify-black);
    border-color: var(--glorify-black);
}

.elepa-testimonial__more:focus-visible {
    outline: 2px solid rgba(var(--glorify-base-rgb), 0.45);
    outline-offset: 4px;
}

.elepa-testimonial__author {
    display: flex;
    align-items: center;
    gap: 16px;
    margin-top: 26px;
    padding-top: 22px;
    border-top: 1px solid rgba(var(--glorify-black-rgb), 0.08);
}

.elepa-testimonial__avatar {
    position: relative;
    flex: 0 0 auto;
    width: 58px;
    height: 58px;
    border-radius: 50%;
    overflow: hidden;
    background-color: rgba(var(--glorify-base-rgb), 0.10);
    display: flex;
    align-items: center;
    justify-content: center;
}

/* The photo covers the initials rather than sitting beside them, so a missing
   upload (the img removes itself on error) simply reveals the monogram. */
.elepa-testimonial__avatar img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: 50%;
}

.elepa-testimonial__initials {
    font-family: var(--glorify-font-two);
    font-size: 18px;
    font-weight: 600;
    line-height: 1;
    letter-spacing: 0.5px;
    color: var(--glorify-base);
}

.elepa-testimonial__author-content {
    min-width: 0;
}

.elepa-testimonial__name {
    margin: 0;
    font-size: 18px;
    font-weight: 600;
    line-height: 24px;
    text-transform: uppercase;
    color: var(--glorify-black);
}

.elepa-testimonial__role {
    margin: 3px 0 0;
    font-size: 15px;
    line-height: 22px;
}

.elepa-testimonial__rating {
    display: flex;
    align-items: center;
    gap: 3px;
    margin-top: 6px;
}

.elepa-testimonial__rating span {
    font-size: 13px;
    color: var(--glorify-base);
}

@media only screen and (max-width: 767px) {
    .elepa-testimonial {
        padding: 32px 26px 26px;
    }
}

/*
 * The testimonial section's 340px tinted band (.testimonial-one::before in
 * style.css) was sized to sit behind a single carousel slide. Against a grid
 * of full-height cards it just clips across them at an arbitrary height, so
 * the tint is promoted to the whole section instead - white cards on a light
 * ground, with the section's own padding doing the framing.
 */
.testimonial-one {
    background-color: var(--glorify-primary);
    padding: 100px 0 70px;
}

.testimonial-one::before {
    display: none;
}

/*
 * Testimonial "Read full story" popup, built by js/testimonial-modal.js. It is
 * hand-rolled rather than a Bootstrap modal (the theme bundles Bootstrap
 * 5.0.0-beta3, see the JS header for why), so the overlay/dialog/scroll
 * styling all lives here. Styled to read as an enlarged version of the card
 * rather than a generic dialog.
 */
.elepa-testimonial-modal {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1055;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 30px 20px;
    background-color: rgba(var(--glorify-black-rgb), 0.65);
    opacity: 0;
    transition: opacity 300ms ease;
}

.elepa-testimonial-modal[hidden] {
    display: none;
}

.elepa-testimonial-modal.is-open {
    opacity: 1;
}

.elepa-testimonial-modal__dialog {
    position: relative;
    width: 100%;
    max-width: 760px;
    background-color: var(--glorify-white);
    border-radius: var(--glorify-bdr-radius);
    box-shadow: 0px 30px 60px rgba(0, 0, 0, 0.30);
    transform: translateY(20px);
    transition: transform 300ms ease;
}

.elepa-testimonial-modal.is-open .elepa-testimonial-modal__dialog {
    transform: translateY(0);
}

/* The dialog is capped at the viewport and scrolls internally.
   overscroll-behavior keeps the wheel from chaining through to the page once
   the quote hits its end, which matters here because the page underneath is
   driven by Lenis smooth scrolling. */
.elepa-testimonial-modal__body {
    max-height: calc(100vh - 100px);
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: 44px 48px 40px;
    scrollbar-width: thin;
}

.elepa-testimonial-modal__body::-webkit-scrollbar {
    width: 5px;
}

.elepa-testimonial-modal__body::-webkit-scrollbar-thumb {
    background-color: rgba(var(--glorify-black-rgb), 0.18);
    border-radius: 5px;
}

.elepa-testimonial-modal__quote {
    font-size: 17px;
    line-height: 32px;
    color: rgba(var(--glorify-gray-rgb), 1);
}

.elepa-testimonial-modal__quote p {
    margin: 0;
    font-size: inherit;
    line-height: inherit;
}

/* The author block is cloned from the card, so it inherits .elepa-testimonial__
   styling and only needs the spacing adjusted for the wider dialog. */
.elepa-testimonial-modal__author {
    margin-top: 32px;
    padding-top: 26px;
}

.elepa-testimonial-modal__close {
    position: absolute;
    top: -16px;
    right: -16px;
    z-index: 2;
    width: 44px;
    height: 44px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background-color: var(--glorify-base);
    color: var(--glorify-white);
    font-size: 16px;
    line-height: 44px;
    cursor: pointer;
    transition: background-color 300ms ease, transform 300ms ease;
}

.elepa-testimonial-modal__close:hover {
    background-color: var(--glorify-black);
    transform: rotate(90deg);
}

.elepa-testimonial-modal__close:focus-visible {
    outline: 2px solid var(--glorify-white);
    outline-offset: 2px;
}

/* Set on <body> while the popup is open: locks the page (and with it Lenis,
   which can only scroll as far as the document allows). */
body.elepa-modal-open {
    overflow: hidden;
}

@media only screen and (max-width: 767px) {
    .elepa-testimonial-modal {
        padding: 20px 16px;
    }

    .elepa-testimonial-modal__body {
        max-height: calc(100vh - 80px);
        padding: 40px 24px 28px;
    }

    .elepa-testimonial-modal__close {
        top: -10px;
        right: -10px;
        width: 38px;
        height: 38px;
        line-height: 38px;
    }
}

/*
 * Preview bar - shown at the top of the public site while a signed-in content
 * administrator is previewing unpublished copy (see base.html.twig). Fixed
 * rather than in-flow so it stays visible while scrolling a long page, with a
 * matching offset on the wrapper so it never covers the site header.
 */
.elepa-preview-bar {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 2000;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 8px 20px;
    padding: 10px 20px;
    background-color: #1e293b;
    color: var(--glorify-white);
    font-size: 14px;
    line-height: 20px;
    text-align: center;
}

.elepa-preview-bar strong {
    color: var(--glorify-white);
    text-transform: uppercase;
    letter-spacing: 0.5px;
}

.elepa-preview-bar__exit {
    flex: 0 0 auto;
    padding: 4px 14px;
    border-radius: 40px;
    background-color: var(--glorify-white);
    color: #1e293b;
    font-weight: 500;
    transition: background-color 300ms ease, color 300ms ease;
}

.elepa-preview-bar__exit:hover {
    background-color: var(--glorify-base);
    color: var(--glorify-white);
}

body:has(.elepa-preview-bar) .page-wrapper {
    padding-top: 40px;
}


/* ---------------------------------------------------------------------------
 * Uniform media sizing for uploaded images.
 *
 * The vendor theme sizes card images with `width: 100%` and no height, so the
 * card grows to whatever the upload happens to be. A portrait photo in a row
 * of landscape ones stretches its card and breaks the grid alignment.
 *
 * Locking an aspect ratio plus `object-fit: cover` makes every card render at
 * the same size regardless of what was uploaded - the image is cropped to fit
 * rather than distorted. The ratios below match the theme's own placeholder
 * artwork (services 380x250, blog 410x280, team 300x310) so correctly-sized
 * images look exactly as they did before.
 * ------------------------------------------------------------------------- */

.services-one__img img,
.blog-one__img img,
.blog-list__img img,
.sidebar-post__img img,
.team-one__img img,
.single-product-style1__img img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
}

.services-one__img {
    aspect-ratio: 3 / 2;
}

.blog-one__img,
.blog-list__img {
    aspect-ratio: 3 / 2;
}

.sidebar-post__img {
    aspect-ratio: 1 / 1;
}

.team-one__img {
    aspect-ratio: 1 / 1;
}

.single-product-style1__img {
    aspect-ratio: 1 / 1;
}

/* Older browsers without aspect-ratio still get a bounded, uniform card. */
@supports not (aspect-ratio: 3 / 2) {
    .services-one__img,
    .blog-one__img,
    .blog-list__img {
        height: 250px;
    }

    .sidebar-post__img,
    .team-one__img,
    .single-product-style1__img {
        height: 300px;
    }
}

/* With the images equalised, let the cards themselves fill the row so their
   borders line up even when the titles or summaries run to different lengths.
   Bootstrap rows are flex containers, so the column is already full height. */
.services-one__single,
.blog-one__single,
.team-one__single {
    height: 100%;
}


/* ---------------------------------------------------------------------------
 * Overlapping photo pairs: home "Intro" and about "Story".
 *
 * The theme positions the smaller inset photo with fixed pixel offsets
 * (bottom: -163px; right: -155px) and gives it no width at all, so it rendered
 * at whatever size the file happened to be. That was tuned around the stock
 * artwork (455x470 main, 350x310 inset); an uploaded photo of a different size
 * blew the inset up until it covered most of the main image.
 *
 * Both photos are now sized relative to their column and cropped to a fixed
 * ratio, so any upload composes the same way. The inset is deliberately smaller
 * than the theme's 77% and offset further out, so it clips the main photo's
 * bottom-right corner instead of sitting across the middle of it.
 *
 * Offsets stay percentage-based so the pair scales with the column, and the
 * whole overlap is confined to >=768px - below that the theme already stacks
 * the two photos, which is left untouched.
 * ------------------------------------------------------------------------- */

.about-one__img img,
.about-one__img-two img,
.about-two__img img,
.about-two__img-2 img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
}

/* Ratios match the theme's own artwork, so correctly-proportioned photos look
   exactly as the design intended. */
.about-one__img {
    aspect-ratio: 455 / 470;
}

.about-one__img-two {
    aspect-ratio: 350 / 310;
    overflow: hidden;
}

.about-two__img {
    aspect-ratio: 1 / 1;
    overflow: hidden;
    border-radius: var(--glorify-bdr-radius);
}

.about-two__img-2 {
    aspect-ratio: 310 / 320;
    overflow: hidden;
}

@media only screen and (min-width: 768px) {
    .about-one__img-two {
        width: 52%;
        right: -14%;
        bottom: -12%;
    }

    .about-two__img-2 {
        width: 50%;
        right: -12%;
        bottom: -12%;
    }
}
