/* ============================================================
   giftcardmodern.css
   Modern restyle overlay for the Gift Card purchase flow (gc/).
   Loaded LAST — after giftcardmain.css, the per-gcType override
   (giftcardpop.css / giftcardslide.css), and mdb.min.css — so it
   wins the cascade on ordinary specificity/order without needing
   to fight legacy !important rules. Mirrors the pattern used for
   bn/css/booknowmodern.css; the competing height/!important rules
   this file would otherwise have to beat were pruned directly out
   of giftcardmain.css / giftcardpop.css / giftcardslide.css /
   giftcardcomplete.css instead.

   Everything is scoped under #GiftCardSlide (the <body id>).
   Brand color still comes entirely from the existing --theme-*
   custom properties set in index.cfm's :root block — this file
   only adds a fixed neutral/system layer (--gcm-*) on top of that.
   ============================================================ */

#GiftCardSlide {
  --gcm-page-bg: #f6f7fb;
  --gcm-card-bg: #ffffff;
  --gcm-border: #e7e9ee;
  --gcm-divider: #f1f5f9;
  --gcm-text-h: #1a2130;
  --gcm-text-body: #374151;
  --gcm-text-muted: #5b6474;
  --gcm-text-faint: #93a0b1;

  --gcm-shadow-card: 0 1px 2px rgba(16, 24, 40, .05);
  --gcm-shadow-hover: 0 10px 24px -8px rgba(20, 38, 64, .16);
  --gcm-shadow-float: 0 1px 2px rgba(16, 24, 40, .05), 0 24px 48px -24px rgba(20, 38, 64, .18);
  --gcm-shadow-modal: 0 24px 60px -20px rgba(20, 38, 64, .4);

  --gcm-indigo: #6366f1; --gcm-indigo-soft: #eef0fd;
  --gcm-blue:   #3b82f6; --gcm-blue-soft:   #eaf2fe;
  --gcm-green:  #16a34a; --gcm-green-soft:  #e7f5f2;
  --gcm-red:    #ef4444; --gcm-red-soft:    #fdeceb;
  --gcm-amber:  #d97706; --gcm-amber-soft:  #fdf1de;
  --gcm-rose:   #db2777; --gcm-rose-soft:   #f7e9ef;

  --gcm-focus-ring: 0 0 0 3px color-mix(in srgb, var(--theme-secondary-color) 22%, transparent);
}

/* ---------- 1. Base / page --------------------------------------- */
/* giftcardmain.css forces `body{font-family:'Roboto' !important}` — has to
   be beaten with !important here, same as the mdb.min.css focus-ring fight
   in section 7 below. */
#GiftCardSlide,
#GiftCardSlide input,
#GiftCardSlide select,
#GiftCardSlide textarea,
#GiftCardSlide button,
#GiftCardSlide p,
#GiftCardSlide a,
#GiftCardSlide span,
#GiftCardSlide li,
#GiftCardSlide div,
#GiftCardSlide label,
#GiftCardSlide h1, #GiftCardSlide h2, #GiftCardSlide h3,
#GiftCardSlide h4, #GiftCardSlide h5, #GiftCardSlide h6 {
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
}
#GiftCardSlide { color: var(--gcm-text-body); }
/* Per-location rich-text (Introduction / Confirmation) is pasted from a WYSIWYG
   editor and often carries its own inline font-family — force it back to the
   modern face regardless (inline styles only lose to a same-element !important
   rule, which is what this is). */
#GiftCardSlide .overlayIntro, #GiftCardSlide .overlayIntro *,
#GiftCardSlide .fun-message, #GiftCardSlide .fun-message * {
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
}

/* ---------- 2. Card shell ------------------------------------------ */
#GiftCardSlide .appointmentBox {
  width: 100%;
  max-width: 700px;
  margin: 0 auto;
  height: auto !important;
  box-sizing: border-box;
}
#GiftCardSlide .giftCardCardWrapper {
  font-size: 14px;
}
#GiftCardSlide .appointmentBox .giftCardC {
  background: var(--gcm-card-bg);
  border-radius: 20px;
  box-shadow: var(--gcm-shadow-float);
  display: flex;
  flex-direction: column;
  /* Legacy giftcardmain.css still forces height:100%, which stretches the
     standalone card below the actual step content and leaves a dead white
     band under the scrollable form. Embedded popup/slideout shells re-apply
     their own explicit viewport height lower in this file. */
  height: auto !important;
  box-sizing: border-box;
}
#GiftCardSlide #loadfirstpage { display: flex; flex-direction: column; min-height: 0; }
#GiftCardSlide #loadingwrapper { flex: 1; min-height: 0; height: auto !important; }
#GiftCardSlide #giftcardInfoDivWrapper { height: auto !important; position: relative; }
#GiftCardSlide .giftcardInfo.showscroll,
#GiftCardSlide #giftcardDiv.giftcardInfo,
#GiftCardSlide #giftcardInfoDivAll.giftcardInfo {
  height: auto !important;
  max-height: min(70vh, 620px);
  overflow-y: auto;
  overflow-x: hidden;
  margin-top: 0;
  padding: 4px 26px 6px;
  box-sizing: border-box;
}
@media (min-width: 768px) {
  /* Desktop standalone keeps the taller shell treatment. Mobile resets below
     to natural document flow so the keyboard cannot keep re-solving nested
     viewport-height math. */
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) .giftCardC:not(.gcm-embedded-shell) {
    min-height: calc((var(--vh, 1vh) * 100) - 40px);
  }
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) .giftcardInfo.showscroll,
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) #giftcardDiv.giftcardInfo,
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) #giftcardInfoDivAll.giftcardInfo {
    max-height: calc((var(--vh, 1vh) * 100) - 266px);
  }
}
#GiftCardSlide .showscroll::-webkit-scrollbar,
#GiftCardSlide .giftcardInfo::-webkit-scrollbar { width: 6px; }
#GiftCardSlide .showscroll::-webkit-scrollbar-thumb,
#GiftCardSlide .giftcardInfo::-webkit-scrollbar-thumb {
  background: var(--gcm-border); border-radius: 999px;
}
#GiftCardSlide .showscroll::-webkit-scrollbar-thumb:hover,
#GiftCardSlide .giftcardInfo::-webkit-scrollbar-thumb:hover { background: var(--gcm-text-faint); }
#GiftCardSlide .showscroll { scrollbar-width: thin; scrollbar-color: var(--gcm-border) transparent; }

@media (max-width: 767px) {
  html,
  body#GiftCardSlide,
  #GiftCardSlide {
    width: 100%;
    max-width: 100%;
    height: auto !important;
    min-height: 0;
    overflow-x: hidden !important;
  }
  #GiftCardSlide .appointmentBox { margin: 5px; max-width: calc(100vw - 10px); }
  #GiftCardSlide .appointmentBox .giftCardC { border-radius: 16px; }
  #GiftCardSlide .form-control,
  #GiftCardSlide input[type="text"],
  #GiftCardSlide input[type="email"],
  #GiftCardSlide input[type="tel"],
  #GiftCardSlide input[type="number"],
  #GiftCardSlide select,
  #GiftCardSlide textarea {
    font-size: 16px !important;
  }
  /* Standalone mobile should not keep stacking viewport-based heights on the
     body, card shell, and inner pane at the same time; let the standalone
     mobile page flow naturally again so the form can move with the page. */
  #GiftCardSlide #loadfirstpage,
  #GiftCardSlide #loadingwrapper,
  #GiftCardSlide #giftcardInfoDivWrapper {
    width: 100%;
    max-width: 100%;
    height: auto !important;
    min-height: 0;
    overflow: visible !important;
    box-sizing: border-box;
    background: var(--gcm-card-bg);
  }
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) {
    overflow: visible !important;
    overflow-y: visible !important;
    width: auto;
    box-sizing: border-box;
  }
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) .giftCardC:not(.gcm-embedded-shell) {
    width: 100%;
    max-width: 100%;
    min-height: auto !important;
    height: auto !important;
    padding: 0 0 20px 0 !important;
    overflow: visible !important;
    background: var(--gcm-card-bg) !important;
    border-radius: 16px;
  }
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) .giftcardInfo.showscroll,
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) #giftcardDiv.giftcardInfo,
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) #giftcardInfoDivAll.giftcardInfo,
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) .giftcardInfo .SummaryPage,
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) .giftCardC #giftcardDiv .showscroll {
    width: 100%;
    max-width: 100%;
    height: auto !important;
    max-height: none !important;
    overflow-y: visible !important;
    padding-right: 20px;
    padding-left: 20px;
    background: var(--gcm-card-bg);
  }
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) #giftcardDiv.giftcardInfo,
  #GiftCardSlide .appointmentBox:not(.gcm-embedded-shell) #giftcardInfoDivAll.giftcardInfo {
    border-radius: 0 0 16px 16px;
    padding-bottom: 20px;
  }
}

/* Modern loading visual -- replaces the old full-viewport white-flash + GIF
   spinner (gc/css/loading.css's .overlayerspinnerrel/-full, shared
   boilerplate copied across every app on this platform, including bn/) with
   the same gray diagonal shimmer-sweep skeleton bn/css/booknowmodern.css
   uses. gc/js/loading.js is byte-identical to bn/js/loading.js, so the same
   actionloadingtarget() calls already toggling giftcard.js already add
   these classes here too -- only the CSS was still the old look.
   !important only on position/top/height/width -- giftcardmain.css's own
   #GiftCardSlide #spinnerrel rule sets top/height with !important already,
   and loads before this file regardless of source order. background/
   background-size/animation deliberately do NOT carry !important: a CSS
   animation cannot override a property that's !important anywhere in the
   cascade (including a shorthand's implied sub-properties), which would
   freeze background-position at its static start value instead of letting
   the keyframes animate it. */
#GiftCardSlide #loadingwrapper #spinnerrel.overlayerspinnerrel,
#GiftCardSlide #loadingwrapper #spinnerrel.overlayerspinnerrelfull {
  position: absolute !important;
  inset: 0 !important;
  top: 0 !important;
  left: 0 !important;
  width: 100% !important;
  height: 100% !important;
  z-index: 5;
  border-radius: 12px;
  background: linear-gradient(100deg, var(--gcm-page-bg) 30%, var(--gcm-border) 45%, var(--gcm-page-bg) 60%);
  background-size: 200% 100%;
  animation: gcm-step-shimmer .9s ease-in-out infinite;
}
@keyframes gcm-step-shimmer {
  0% { background-position: 60% 0; }
  100% { background-position: -40% 0; }
}
@media (prefers-reduced-motion: reduce) {
  #GiftCardSlide #loadingwrapper #spinnerrel.overlayerspinnerrel,
  #GiftCardSlide #loadingwrapper #spinnerrel.overlayerspinnerrelfull {
    animation: none;
    background: var(--gcm-page-bg);
  }
}

/* .gcm-embedded-shell (index.cfm, added when gcType != 0) — gcType 1 (popup)
   and 2 (slideout) already load inside the host page's own modal/panel
   chrome, which draws its own card/shadow around this whole widget. Rendering
   our own card look on top of that nests a card inside a card, so this
   variant goes full-bleed white instead. gcType 0 (standalone full page) is
   the only one that keeps the floating card above. */
/* height:100% would need every ancestor (html/body) to carry an explicit
   height too, which they don't on desktop -- it silently collapses to auto
   and never actually fills the popup/slideout iframe. This page runs inside
   an iframe (see parent.jQuery('#iframeGiftCardTest') in giftcard.js), so
   the viewport-height custom property already used elsewhere in this
   codebase (--vh, kept in sync with the real visual viewport via JS) is
   what reliably fills it instead. */
#GiftCardSlide .appointmentBox.gcm-embedded-shell {
  max-width: 100%; width: 100%;
  height: calc(var(--vh, 1vh) * 100);
  margin: 0;
}
#GiftCardSlide .appointmentBox .giftCardC.gcm-embedded-shell {
  width: 100%;
  height: calc(var(--vh, 1vh) * 100);
  background: var(--gcm-card-bg);
  border-radius: 0;
  box-shadow: none;
}
@media (max-width: 767px) {
  #GiftCardSlide .appointmentBox.gcm-embedded-shell { margin: 0; }
  #GiftCardSlide .appointmentBox .giftCardC.gcm-embedded-shell { border-radius: 0; }
}

/* ---------- 3. Header ------------------------------------------------ */
#GiftCardSlide .header-container {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 22px 26px 4px;
}
/* Same structural change just made to bn's header logo
   (bn/css/booknowmodern.css's .header-logo/.header-logo-btn): give the logo
   its own sized container instead of just constraining the <img> directly,
   so the header row keeps a consistent height regardless of how small/thin
   a particular location's uploaded logo is. */
#GiftCardSlide .header-logo {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  min-height: 80px;
}
#GiftCardSlide .header-logo-btn {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  min-height: 80px;
}
#GiftCardSlide .header-logo img { height: 75px; width: auto; }
#GiftCardSlide .header-content .header-title-group {
  display: flex; align-items: center; gap: 10px; justify-content: flex-end;
}
#GiftCardSlide .header-content .header-title-icon {
  width: 34px; height: 34px; border-radius: 10px; flex: none;
  display: flex; align-items: center; justify-content: center;
  background: color-mix(in srgb, var(--theme-secondary-color) 14%, var(--gcm-card-bg));
  color: var(--theme-secondary-color);
}
#GiftCardSlide .header-content .header-title-icon svg { width: 18px; height: 18px; }
#GiftCardSlide .header-content .header-title {
  font-size: 19px; font-weight: 700; color: var(--gcm-text-h); letter-spacing: -.2px;
}
#GiftCardSlide .header-content { text-align: right; }
#GiftCardSlide .header-content .header-company {
  font-size: 12.5px; font-weight: 700; color: var(--gcm-text-muted); margin-top: 4px;
}
#GiftCardSlide .header-content .header-address {
  font-size: 11.5px; color: var(--gcm-text-faint); margin-top: 1px; line-height: 1.4;
}

/* ---------- 4. Breadcrumb / stepper ---------------------------------- */
#GiftCardSlide .breadcrumb {
  counter-reset: gcstep;
  display: flex; gap: 4px; align-items: center;
  margin: 10px 22px 6px;
  padding: 8px; border-radius: 14px;
  background: color-mix(in srgb, var(--theme-main-color) 25%, var(--gcm-card-bg));
  overflow-x: auto; scrollbar-width: none;
  /* Containing block for .breadcrumb-slider below -- its left/top are set in
     content-area pixels (giftcard.js's positionBreadcrumbSlider()) that only
     line up with each breaditem's own offsetLeft/offsetTop when both share
     this element as their offsetParent. */
  position: relative;
}
#GiftCardSlide .breadcrumb::-webkit-scrollbar { display: none; }
/* The moving white pill behind the current step -- bn's exact mechanism
   (booknowmodern.css's .breadcrumb-slider / booknow.js's
   positionBreadcrumbSlider()): a single element whose transform/width
   giftcard.js tweens to match whichever breaditem just gained .current,
   instead of the background simply popping in on the new step and out on
   the old one. Sized/positioned entirely from JS since every step's label
   is a different width. */
#GiftCardSlide .breadcrumb-slider {
  position: absolute; top: 0; left: 0; width: 0;
  border-radius: 999px;
  background: var(--gcm-card-bg);
  box-shadow: 0 1px 3px rgba(16, 24, 40, .12);
  transition: transform .28s cubic-bezier(.4, 0, .2, 1), width .28s cubic-bezier(.4, 0, .2, 1);
  pointer-events: none;
  z-index: 0;
}
#GiftCardSlide .breadcrumb .breaditem {
  counter-increment: gcstep;
  /* giftcard.js toggles inline display:none/block on .clientinfocaret /
     .summarycaret at each step transition (steps only reveal progressively);
     !important keeps every step visible from the start instead, matching the
     "always show all steps" stepper look -- clickability (not visibility) is
     what should gate on reaching a step, handled by pointer-events below. */
  display: flex !important;
  flex: 1 0 auto; align-items: center; justify-content: center; gap: 7px;
  font-size: 13px; font-weight: 700; color: var(--gcm-text-faint) !important;
  padding: 8px 14px; border-radius: 999px !important;
  white-space: nowrap;
  /* Stacks above .breadcrumb-slider (z-index:0), which renders behind every
     breaditem's own text/number instead of on top of it. */
  position: relative; z-index: 1;
}
/* Steps after the current one are visible but not yet reachable. Steps
   before it stay clickable so existing back-navigation (#serCaret/#clientCaret's
   onclick="scrollToPreviousBreadcrumb(...)") keeps working. */
#GiftCardSlide .breadcrumb .breaditem.current ~ .breaditem {
  pointer-events: none;
  cursor: default;
}
#GiftCardSlide .breadcrumb .breaditem::before {
  content: counter(gcstep);
  width: 19px; height: 19px; border-radius: 50%; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 11px; font-weight: 700;
  background: var(--gcm-border); color: var(--gcm-text-faint);
}
#GiftCardSlide .breadcrumb .breaditem.current {
  /* No background/box-shadow here -- .breadcrumb-slider (above) renders the
     actual pill and slides between steps; this class now only carries the
     text/number color change. */
  color: var(--gcm-text-h) !important;
  transition: color .2s ease;
}
#GiftCardSlide .breadcrumb .breaditem.current::before {
  background: var(--theme-secondary-color); color: var(--theme-buttonfontP-color);
}
/* Checkmark for steps already passed -- exactly bn's rule (booknowmodern.css):
   giftcard.js reveals a step by flipping its inline style from display:none
   to display:block as the visitor reaches it, same mechanism bn's own
   booknow.js uses. A step still carrying its original inline display:none
   hasn't been reached yet, so it keeps a plain number instead of a checkmark
   even though section 4 above force-shows it. */
#GiftCardSlide .breadcrumb .breaditem:not(.current):not([style*="display:none"]):not([style*="display: none"])::before {
  content: "\2713";
  background: var(--theme-secondary-color); color: var(--theme-buttonfontP-color);
  font-size: 10.5px;
}
#GiftCardSlide .breadcrumb .separator,
#GiftCardSlide .breadcrumb i.separator { display: none !important; }

/* ---------- 5. Buttons ------------------------------------------------- */
#GiftCardSlide .themeButtonFill {
  box-sizing: border-box;
  background-color: var(--theme-secondary-color) !important;
  color: var(--theme-buttonfontP-color) !important;
  border: none !important; border-radius: 999px !important;
  font-weight: 700; font-size: 14.5px;
  min-height: 44px;
  width: auto; max-width: 250px;
  padding: 12px 20px !important;
  margin: 0 !important;
  box-shadow: 0 10px 20px -10px color-mix(in srgb, var(--theme-secondary-color) 60%, transparent);
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  transition: filter .15s, transform .05s;
}
#GiftCardSlide .themeButtonFill:hover { filter: brightness(1.07); }
#GiftCardSlide .themeButtonFill:active { transform: translateY(1px); }
#GiftCardSlide .themeButtonEmpty {
  background: var(--gcm-card-bg) !important;
  color: var(--theme-secondary-color) !important;
  border: 1.5px solid var(--theme-secondary-color) !important;
  border-radius: 999px !important;
}
/* Real inline <svg class="nextBtn-arrow"> in the markup (index.cfm's
   #GiftCardBtn, dsp_giftcard_step1.cfm's #continueBtnaCC,
   dsp_giftcard_step2.cfm's #continueBtn) instead of a ::after mask-image --
   the mask approach rendered inconsistently on the .nextBtn.halfOverride
   buttons, so this replaces it with a plain SVG that only needs normal
   width/height/stroke styling, no mask support required. */
#GiftCardSlide .nextBtn-arrow {
  width: 15px; height: 15px; flex: none;
}
#GiftCardSlide .bottomBtn.serseldivBtn,
#GiftCardSlide .serseldivBtnFull { padding: 14px 26px 22px; }
/* Continue/Purchase Now/Done sit right-aligned, content-width -- only the
   intro splash's #GiftCardBtn (section 6 below) stays full-width. */
#GiftCardSlide .floatBtnPos, #GiftCardSlide .centerBtnPos {
  float: none !important;
  display: flex; justify-content: flex-end;
}
/* #giftCardPurchaseBtnWrap (index.cfm) sits outside #giftcardInfoDivWrapper
   so it survives the Summary step's repeated .html(response) swaps -- but
   that also puts it outside the ".giftcardInfo .bottomBtn"-scoped rules
   elsewhere in this file family, so it was inheriting stray positioning
   from those and rendering on top of the agreement text instead of below
   it. Forced back into normal flow at the bottom of the card, clearing
   anything above it. */
#GiftCardSlide #giftCardPurchaseBtnWrap {
  position: static !important;
  clear: both;
  margin-top: 16px;
}
#GiftCardSlide #giftCardPurchaseBtnWrap #GiftCardBtn {
  min-width: 250px !important;
  gap: 10px;
}
@media (max-width: 480px) {
  #GiftCardSlide .themeButtonFill, #GiftCardSlide .themeButtonEmpty { width: 100%; }
  #GiftCardSlide .floatBtnPos, #GiftCardSlide .centerBtnPos { justify-content: stretch; }
}

/* ---------- 6. Intro overlay -------------------------------------------- */
#GiftCardSlide #giftcardIntroOverlay {
  background: rgba(15, 23, 42, .45);
  backdrop-filter: blur(4px);
  display: flex; align-items: center; justify-content: center;
}
#GiftCardSlide #giftcardIntroOverlay .overlay-content {
  background: var(--gcm-card-bg);
  border-radius: 20px;
  min-width: 400px;
  box-shadow: var(--gcm-shadow-modal);
  padding: 36px 34px 30px;
  max-width: min(420px, 92vw);
  text-align: center;
}
/* Soft accent-colored glow behind the logo, matching bn/'s intro overlay
   treatment -- a radial wash of the tenant's own accent so the mark sits in
   front of a bit of brand color instead of directly on flat white. Lightened
   toward white before use as the glow's core color rather than mixing the
   raw accent straight into transparent, since a dark accent would otherwise
   glow as a muddy smudge instead of a soft color wash. */
#GiftCardSlide #giftcardIntroOverlay .header-logo {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 130px;
  margin-bottom: 6px;
}
#GiftCardSlide #giftcardIntroOverlay .header-logo::before {
  content: "";
  position: absolute;
  top: 50%; left: 50%;
  width: 170px; height: 170px;
  transform: translate(-50%, -50%);
  background: radial-gradient(circle, color-mix(in srgb, var(--theme-secondary-color) 38%, white) 0%, transparent 68%);
  filter: blur(10px);
  opacity: .65;
  z-index: 0;
}
/* The logo itself is the "badge" -- a white circle with its own shadow,
   sized/padded so any logo aspect ratio (square, wide, tall) scales down to
   fit inside via object-fit:contain instead of being cropped or overflowing
   the circle, regardless of the source image's real dimensions. */
#GiftCardSlide #giftcardIntroOverlay .header-logo img {
  position: relative; z-index: 1;
  width: 92px; height: 92px;
  object-fit: contain;
  background: #fff;
  border-radius: 50%;
  padding: 14px;
  box-sizing: border-box;
  box-shadow: 0 10px 24px -8px rgba(20,38,64,.28), 0 0 0 1px rgba(20,38,64,.05);
  margin: 0; display: block;
}
#GiftCardSlide #giftcardIntroOverlay .overlay-text h2 {
  font-size: 21px; color: var(--gcm-text-h); margin: 0 0 12px; text-wrap: balance;
}
#GiftCardSlide #giftcardIntroOverlay .overlayIntro p {
  font-size: 13.5px; line-height: 1.6; color: var(--gcm-text-muted); margin: 0 0 20px;
}
#GiftCardSlide #giftcardIntroOverlay #GiftCardBtn { width: 100%; }
@media (max-width: 480px) {
  #GiftCardSlide #giftcardIntroOverlay .overlay-content { border-radius: 16px; padding: 30px 22px 24px; }
}

/* .gcm-embedded-shell on the intro overlay itself (gcType != 0) — see the
   card-shell embedded-shell block further up for the full rationale. No
   dimmed/blurred wash, no floating card: full-bleed white, same as the main
   card gets once the intro is dismissed. */
#GiftCardSlide #giftcardIntroOverlay.gcm-embedded-shell {
  background: var(--gcm-card-bg);
  backdrop-filter: none;
  align-items: stretch;
  overflow-y: auto;
}
#GiftCardSlide #giftcardIntroOverlay .overlay-content.gcm-embedded-shell {
  background: var(--gcm-card-bg);
  border-radius: 0;
  box-shadow: none;
  max-width: 100%;
  width: 100%;
  min-height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
#GiftCardSlide #giftcardIntroOverlay.gcm-embedded-shell .overlayIntro {
  max-height: none;
  overflow: visible;
}

/* ---------- 7. Shared form-field look ------------------------------------ */
#GiftCardSlide .form-control,
#GiftCardSlide input[type="text"],
#GiftCardSlide input[type="email"],
#GiftCardSlide input[type="tel"] {
  height: 40px; padding: 0 13px;
  border: 1px solid var(--gcm-border) !important;
  border-radius: 11px !important;
  font-size: 14.5px; color: var(--gcm-text-h);
  box-shadow: var(--gcm-shadow-card);
  background: var(--gcm-card-bg);
}
#GiftCardSlide .form-control::placeholder { color: var(--gcm-text-faint); }
#GiftCardSlide .form-control:focus,
#GiftCardSlide input:focus {
  outline: none;
  border-color: var(--theme-secondary-color) !important;
  box-shadow: var(--gcm-focus-ring) !important;
}
/* Exact match to bn's validation-state colors (booknowmodern.css) rather
   than this file's own --gcm-red, per direct request to mirror bn's look --
   #dc4c64 (border/error-text accent) and #c0432f (inline field-error text)
   are bn's own literal values, not tokenized there either. */
#GiftCardSlide .form-control.is-invalid,
#GiftCardSlide input.is-invalid,
#GiftCardSlide input[type="text"].form-control.is-invalid,
#GiftCardSlide input[type="email"].form-control.is-invalid,
#GiftCardSlide input[type="tel"].form-control.is-invalid { border-color: #dc4c64 !important; }
#GiftCardSlide .form-control.is-invalid:focus {
  box-shadow: 0 0 0 3px color-mix(in srgb, #dc4c64 22%, transparent) !important;
}
#GiftCardSlide .cc-error-msg { color: #dc4c64; font-size: 13.5px; }
#GiftCardSlide .field-error-msg {
  display: none;
  margin-top: 6px;
  font-size: 12.5px;
  font-weight: 600;
  color: #c0432f;
  align-items: center;
  gap: 5px;
}
#GiftCardSlide .field-error-msg:not(:empty) { display: flex; }
#GiftCardSlide .field-error-msg:not(:empty)::before {
  content: "";
  width: 13px; height: 13px; flex-shrink: 0;
  background-color: currentColor;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='8' x2='12' y2='12'/%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='8' x2='12' y2='12'/%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'/%3E%3C/svg%3E");
  -webkit-mask-size: contain; mask-size: contain;
}
/* Matched to bn's field-label treatment (booknowmodern.css's
   .form-group label:not(.label):not(.form-label)) -- sentence case (not
   uppercase) and the dark heading color, not the small-caps faint style,
   which bn reserves for section-level headings instead of individual field
   labels. */
#GiftCardSlide label,
#GiftCardSlide .form-group label {
  font-size: 12.5px; font-weight: 700; text-transform: none; letter-spacing: .03em;
  color: var(--gcm-text-h); margin-bottom: 7px; display: block;
}
#GiftCardSlide .form-group { margin-bottom: 14px; }
#GiftCardSlide .form-group label span,
#GiftCardSlide label span {
  color: #c0432f; font-size: 11px; font-style: normal; font-weight: 700;
}
#GiftCardSlide .requiredmess { font-size: 12px; color: var(--gcm-text-faint); font-style: italic; }

/* Currency-symbol prefix (request.currdis, from the location's own locale
   setting) shown inside the amount field, same left-inset-icon treatment as
   the phone field's flag prefix, so the currency is always visible instead
   of only appearing in the placeholder text before anything is typed. */
#GiftCardSlide .amount-field { position: relative; display: inline-flex; align-items: center; width: 100%; }
#GiftCardSlide .amount-prefix {
  position: absolute; left: 13px;
  font-size: 14.5px; font-weight: 600; color: var(--gcm-text-muted);
  pointer-events: none;
}
#GiftCardSlide .amount-field #requestedAmount { padding-left: 30px !important; width: 100%; }
#GiftCardSlide #requestedAmount { max-width: 220px !important; font-weight: 400; }

/* ---------- 8. Credit Card Information ----------------------------------- */
#GiftCardSlide .cc-title {
  font-size: 15px; font-weight: 700; color: var(--gcm-text-h); margin: 18px 0 12px;
}
#GiftCardSlide .cc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 18px; }
#GiftCardSlide .cc-grid__column { min-width: 0; }
#GiftCardSlide .form-row--split.expiration { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
@media (max-width: 600px) {
  #GiftCardSlide .cc-grid { grid-template-columns: 1fr; }
}

/* ---------- 9. Phone field / intl-tel-input restyle ------------------------ */
#GiftCardSlide .iti { width: 100%; display: block; }
#GiftCardSlide .iti__selected-flag {
  border-radius: 11px 0 0 11px;
  background: var(--gcm-card-bg);
  border-right: 1px solid var(--gcm-border);
}
#GiftCardSlide .iti input#GCPhone,
#GiftCardSlide .iti input.form-control { border-radius: 11px !important; }
/* Width/max-height/background/z-index matching the already-fixed reference
   in portal/app/settings/index.cfm's .cp-settings-phone .iti__country-list --
   without these the base library CSS leaves the list unconstrained, so it
   renders full-bleed and un-scrollable instead of a bounded dropdown card. */
#GiftCardSlide .iti__country-list {
  width: min(360px, calc(100vw - 32px));
  min-width: 280px;
  max-height: 240px;
  overflow-y: auto;
  margin-top: 4px;
  background: var(--gcm-card-bg);
  border: 1px solid var(--gcm-border);
  border-radius: 12px;
  box-shadow: 0 12px 28px -8px rgba(20, 38, 64, .22);
  z-index: 1100;
}
#GiftCardSlide .iti__country { padding: 8px 10px; }
/* The plugin measures available space against the window viewport and adds
   .iti__country-list--dropup to flip the list upward when it thinks there
   isn't room below -- but the phone field sits inside a scrollable card
   (.giftcardInfo), not the raw viewport, so that measurement is unreliable
   here and it was flipping up over the fields above it even when there was
   plenty of room below in the actual scroll container. Forcing it to always
   open downward is simpler and more predictable than fighting the plugin's
   viewport math. */
#GiftCardSlide .iti__country-list--dropup {
  bottom: auto !important;
  top: 100% !important;
  margin-bottom: 0 !important;
  margin-top: 4px !important;
}
/* The shared .form-control rule above (section 7) sets `padding:0 13px` at
   higher specificity than intl-tel-input's own `.iti--allow-dropdown input`
   rule, which clobbers the ~52px left padding the plugin reserves for the
   flag button — without this, typed digits render underneath the flag. */
#GiftCardSlide .iti--allow-dropdown input,
#GiftCardSlide .iti--separate-dial-code input {
  padding-left: 52px !important;
  padding-right: 13px !important;
}

/* ---------- 10. Error / validation banners --------------------------------- */
#GiftCardSlide .form-messageerr.error,
#GiftCardSlide .form-messageerr.twofacomplete {
  background: #fef2f2; border-left: 4px solid #dc4c64; color: #991b1b;
  border-radius: 8px; padding: 10px 14px; font-size: 13.5px; margin-bottom: 14px;
}
#GiftCardSlide .form-messageerr.error p { margin: 0; }
#GiftCardSlide .decline-action-link { color: var(--theme-secondary-color); font-weight: 700; }

/* ---------- 11. Summary / row-icon component --------------------------------
   Shared by dsp_giftcard_step2.cfm's Summary screen and dsp_gccomplete.cfm's
   Purchase Details block. */
#GiftCardSlide .section-title {
  font-size: 15.5px; font-weight: 700; color: var(--gcm-text-h); margin: 4px 0 6px;
}
#GiftCardSlide .giftcard-summary-section .container > p {
  font-size: 13.5px; color: var(--gcm-text-muted); line-height: 1.55;
}
#GiftCardSlide .summary-grid {
  border: 1px solid var(--gcm-border); border-radius: 14px; overflow: hidden;
  box-shadow: var(--gcm-shadow-card); background: var(--gcm-card-bg);
}
#GiftCardSlide .summary-row {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 14px; border-bottom: 1px solid var(--gcm-divider);
}
#GiftCardSlide .summary-row:last-child { border-bottom: none; }
#GiftCardSlide .row-icon {
  width: 32px; height: 32px; border-radius: 9px; flex: none;
  display: flex; align-items: center; justify-content: center;
  background: var(--gcm-indigo-soft); color: var(--gcm-indigo);
}
#GiftCardSlide .row-icon svg { width: 16px; height: 16px; }
#GiftCardSlide .row-icon--name    { background: var(--gcm-indigo-soft); color: var(--gcm-indigo); }
#GiftCardSlide .row-icon--email   { background: var(--gcm-blue-soft);   color: var(--gcm-blue); }
#GiftCardSlide .row-icon--phone   { background: var(--gcm-green-soft); color: var(--gcm-green); }
#GiftCardSlide .row-icon--location{ background: var(--gcm-red-soft);   color: var(--gcm-red); }
#GiftCardSlide .row-icon--amount  { background: var(--gcm-amber-soft); color: var(--gcm-amber); }
#GiftCardSlide .row-icon--code    { background: var(--gcm-rose-soft);  color: var(--gcm-rose); }
#GiftCardSlide .row-body { flex: 1; min-width: 0; }
#GiftCardSlide .summary-row .label {
  font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .03em;
  color: var(--gcm-text-faint); margin: 0;
}
#GiftCardSlide .summary-row .value {
  font-size: 14px; font-weight: 600; color: var(--gcm-text-h); margin-top: 1px;
  overflow-wrap: anywhere;
}
#GiftCardSlide .disclosure,
#GiftCardSlide .showbold { font-size: 12.5px; line-height: 1.6; color: var(--gcm-text-muted); }
#GiftCardSlide .showbold b, #GiftCardSlide .showbold { font-weight: 600; }

/* ---------- 12. Confirmation / Thank You ------------------------------------- */
#GiftCardSlide .confirmation-header { text-align: center; margin-bottom: 18px; }
/* Soft-green circular badge behind a bold checkmark -- same tinted-circle-
   behind-an-icon convention as the Summary page's row-icon chips, matching
   bn's .success-badge treatment exactly (booknowmodern.css). */
#GiftCardSlide .success-badge {
  width: 68px; height: 68px; border-radius: 50%;
  background: var(--gcm-green-soft);
  display: flex; align-items: center; justify-content: center;
  margin: 0 auto 14px; position: relative;
}
#GiftCardSlide .success-badge::before {
  content: ""; position: absolute; inset: -6px; border-radius: 50%;
  border: 1.5px solid color-mix(in srgb, var(--gcm-green) 35%, transparent);
}
#GiftCardSlide .success-badge-check {
  width: 32px; height: 32px;
  background-color: var(--gcm-green);
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center; mask-position: center;
}
#GiftCardSlide .confirmation-header h2 {
  font-size: 22px; font-weight: 700; color: var(--gcm-text-h); margin: 0 0 6px; letter-spacing: -.01em;
}
#GiftCardSlide .subtext { font-size: 14.5px; color: var(--gcm-text-muted); line-height: 1.5; margin: 0 0 14px; }
/* Fixed semantic success green, not the tenant's brand color -- matches bn's
   .confirm-pill (booknowmodern.css), which deliberately uses its own fixed
   --bnm-teal/--bnm-teal-soft tokens here rather than --theme-secondary-color,
   so "confirmed" reads as a universal positive state regardless of a given
   location's configured brand color. */
#GiftCardSlide .confirm-pill {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 11.5px; font-weight: 700; letter-spacing: .03em; text-transform: uppercase;
  color: var(--gcm-green);
  background: var(--gcm-green-soft);
  padding: 5px 12px; border-radius: 999px; margin-top: 10px;
}
#GiftCardSlide .confirm-pill-check {
  width: 11px; height: 11px; background-color: currentColor;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center; mask-position: center;
}
#GiftCardSlide .appointment-details { margin: 20px 0 0; padding: 0; background: none; text-align: left; }
#GiftCardSlide .appointment-details .detailsTitle,
#GiftCardSlide .appointment-details h4 {
  font-size: 12.5px; font-weight: 700; color: var(--gcm-text-faint);
  text-transform: uppercase; letter-spacing: .04em; margin: 0 0 10px;
}
#GiftCardSlide .fun-message { font-size: 12.5px; color: var(--gcm-text-faint); text-align: center; margin-top: 18px; line-height: 1.6; }
#GiftCardSlide .fun-message p { margin: 0; }

/* ---------- 13. Disabled-feature modal (#gcdModal) ---------------------------- */
#GiftCardSlide ~ .modal-backdrop,
body > .modal-backdrop { background: rgba(15, 23, 42, .45); }
#GiftCardSlide #gcdModal .modal-content {
  border-radius: 18px; border: 1px solid var(--gcm-border);
  box-shadow: var(--gcm-shadow-modal); overflow: hidden;
}
#GiftCardSlide #gcdModal .modal-header {
  border-bottom: 1px solid var(--gcm-divider); padding: 18px 22px;
}
#GiftCardSlide #gcdModal .modal-title { font-size: 16px; font-weight: 700; color: var(--gcm-text-h); }
#GiftCardSlide #gcdModal .modal-body { font-size: 13.5px; color: var(--gcm-text-muted); padding: 20px 22px 26px; line-height: 1.6; }

@media (max-width: 480px) {
  #GiftCardSlide #giftcardIntroOverlay .overlay-content {
    min-width: 300px;
  }

}
