.gbbRemoveCartItemConfirmationMainContainer {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  top: 0;
  background-color: rgba(24, 24, 24, 0.8);
  z-index: 1000000000;
}
.gbbRemoveCartItemConfirmationContainerModal {
  position: fixed;
  z-index: 1000000000;
  transform: translate(0, -50%);
  background: #ffff;
  border-radius: 5px;
  text-align: center;
  padding: 10px;
  max-height: 95vh;
  /* left: 5vw;
    top: 5vh;
    right: 5vw; */
  left: 5vw;
  right: 5vw;
  top: 50vh;
}
.gbbRemoveCartItemConfirmationContainerModal {
  display: grid;
  grid-gap: 10px;
}

.gbbCartPageCartProductsContainerHeader {
  display: grid;
  /* grid-template-columns: 1fr 0.2fr; */
  justify-content: space-between;
  align-items: center;
}
.gbbCartPageCartProductsContainerHeaderLabel {
  justify-self: start;
  font-size: 16px;
  font-weight: bold;
}
.gbbCartPageCartProductsModalClose {
  justify-self: end;
  padding: 12px 10px;
  font-weight: bold;
  transform: rotate(45deg);
  font-size: 35px;
  position: absolute;
  top: -8px;
  right: 0px;
  color: #b2b5b9;
  cursor: pointer;
  user-select: none;
}
.gbbCartPageCartModalProductsContainer {
  display: grid;
  grid-auto-flow: column;
  grid-gap: 5px;
  /* overflow-x: auto; */
  overflow-y: auto;
  max-height: 70vh;
}
.gbbCartPageCartModalProductsContainer {
  grid-auto-flow: row;
}
.gbbCartPageCartModalProductContainer {
  display: grid;
  grid-auto-flow: column;
  grid-gap: 10px;
  position: relative;
  padding: 5px;
}
.gbbCartPageCartModalProductContainer {
  grid-template-columns: 0.5fr 3fr;
}

.gbbCartPageCartProductImageContainer {
  display: grid;
  width: 80px;
  height: 80px;
  border: 1px solid #cfc9c9;
  overflow: hidden;
  object-fit: contain;
}
.gbbCartPageCartModalProductImage {
  width: 100%;
  height: 100%;
}
.gbbCartPageCartModalProductTextContainer {
  font-size: 14px;
  /* width: 165px; */
  display: grid;
  grid-template-columns: 1fr 0.2fr;
  justify-content: space-between;
  align-items: start;
  grid-gap: 10px;
}
.gbbCartPageCartModalProductTitle {
  width: 100%;
  text-align: left;
}
.gbbCartModalProductTitleQty {
  display: grid;
  justify-content: start;
  width: unset;
}
.gbbCartPageCartModalProductQuantity {
  justify-self: start;
}
.gbbCartPageCartModalProductPriceQtyContainer {
  display: grid;
  grid-template-columns: 1fr 2fr;
  grid-gap: 5px;
}
.gbbCartPageCartModalProductPrice {
  font-weight: bold;
}
.gbbUnavailableProductsModalFooter {
  display: grid;
  grid-gap: 10px;
}
.gbbCartPageProductsModalFooterBackBtn,
.gbbCartPageProductsModalFooterRemoveBtn {
  padding: 10px 10px;
  text-align: center;
  color: #000;
  border-radius: 5px;
  font-size: 16px;
  cursor: pointer;
  width: 100%;
  font-weight: 500;
  background: black;
  color: white;
  border: none;
}
.gbbCartPageProductsModalFooter {
  display: grid;
  grid-gap: 10px;
  grid-auto-flow: column;
}
.gbbDisabled {
  pointer-events: none;
  opacity: 0.2;
  /* background-color: black; */
}

.gbbExtBundlesHTMLContainer{
  width: 100%;
}

.gbbExtBundleHTMLContainer{
  height: fit-content;
  display: grid;
  grid-template-columns: 1fr 4fr 1.2fr;
  margin: 20px 0px;
  padding: 10px;
  border-radius: 5px;
}


.gbbExtBundleHTMLContainer{
  border: 1px solid #bcbcbc;
}

.gbbExtBundleHTMLContainerSideCart{
  grid-template-columns: 2fr 4fr 1fr;
}

.gbbExtBundleImageContainer{
  /* height: 10%; */
  width: 80%;
}

.gbbExtBundleImage{
  width: 100%;
  object-fit: contain;
  border-radius: 4px;
}

.gbbExtBundleTextContainer{
  padding: 10px;
}

.gbbExtBundleTitle{
  display: grid;
  grid-template-columns: auto 1fr;
  grid-gap: 4px;
}

.gbbExtSideCartBundleTitle{
  grid-template-rows: 1fr 1fr;
  grid-template-columns: auto;
  grid-gap: 0px
}

.dbbExtBundleId{
  display: grid;
  grid-template-columns: auto 1fr;
  grid-gap: 4px;
}

.gbbExtBundleTitleLabel, .gbbExtBundleIdLabel, .gbbExtBundleContentsTextLabel{
  font-weight: 800;
}

.gbbExtPriceAndRemoveContainer{
  text-align: right;
  padding: 10px;
}

.gbbExtPriceContainer{
  display: grid;
  grid-template-columns: 1fr auto;
  grid-gap: 5px;
}

.gbbExtBundleOriginalPriceContainer{
  text-decoration: line-through;
  font-size: smaller;
}

.gbbExtBundleDiscountedPrice{
  font-weight: 900;
}

.gbbExtNoDiscountPrice{
  grid-template-columns: 1fr;
}
.gbbExtBundleRemoveContainerButton{
  display: flex;
  float: right;
}

.gbbExtBundleRemoveButton{
  color: red;
  cursor: pointer; 
  width: fit-content;
}

@media (min-width: 1023px) {
  .gbbCartPageProductsModalFooter {
    grid-template-columns: 1fr 1fr;
  }
  .gbbRemoveCartItemConfirmationContainerModal{
    left: 30vw;
    right: 30vw;
  }
}


.gbbExtBundleUpsellContainer:not(:empty){
  display: grid;
  margin: 5% 0;
  border-radius: 5px;
  grid-gap: 5px;
}

.gbbExtBundleRedirectButton {
  display: grid;
  justify-content: center;
  align-items: center;
  /* background: black; */
  /* color: white; */
  /* padding: 5px; */
  cursor: pointer;
  width: 100%;
  border: 2px solid gray;
  border-radius: 5px;
  min-height: 45px;
  text-align: center;
  overflow-wrap: break-word;
  word-break: break-word;
  white-space: normal;
  padding-inline: 10px;
}

.gbbExtHide{
  display: none;
}

.gbbOfferWidgetFieldSet {
  border-radius: 5px;
  border: 1.5px solid #00000047;
  padding: 10px;
  text-align: left;
}
.gbbOfferWidgetTitle{
  color: black;
  font-weight: 600;
  overflow-wrap: break-word;
  word-break: break-word;
  white-space: normal;
}

.gbbOfferWidgetBody{
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 10px;
}
.gbbOfferWidgetBody .gbbOfferWidgetDetailsSec .gbbOfferWidgetImg{
  height: 50px;
  width: 50px;
  min-width: 50px;
  min-height: 50px;
  border-radius:5px;
  object-fit: cover;
}
.gbbOfferWidgetBody .gbbOfferWidgetDetailsSec{
  display: flex;
  align-items: center;
  gap: 10px;
}
.gbbOfferWidgetBody .gbbOfferWidgetDetailsSec .gbbOfferWidgetDescription{
  font-size: 12px;
  text-align: left;
  overflow-wrap: break-word;
  word-break: break-word;
  white-space: normal;
}
.gbbOfferWidgetBody .gbbOfferWidgetBtnSec .gbbOfferWidgetRedirectBtn{
  background: none;
  outline: none;
  border: none;
  /* background-color: black;
  color: white; */
  padding: 5px;
  border-radius: 5px;
  cursor: pointer;
  /* white-space: nowrap; */
  overflow: hidden;
  /* text-overflow: ellipsis; */
  width: 100px;
  /* height: 30px; */
  /* display: inline-block; */
  font-size: 10px;
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
  min-height: 30px;
  overflow-wrap: break-word;
  word-break: break-word;
  white-space: normal;
}
.gbbSpinnerLoaderContainer {
  display: flex;
  justify-content: center;
  align-items: center;
}
.gbbSpinnerLoader {
  width: 12px;
  height: 12px;
  border: 2px solid;
  border-bottom-color: transparent;
  border-radius: 50%;
  display: inline-block;
  box-sizing: border-box;
  animation: spinnerLoaderRoatation .5s linear infinite;
}
.gbbExtBundleRedirectButton .gbbSpinnerLoader{
  width: 20px;
  height: 20px;
}

.gbbExtProductCardPrice--hidden{
  visibility: hidden !important;
}

@keyframes spinnerLoaderRoatation {
  0% {
    transform: rotate(0deg);
  }

  100% {
    transform: rotate(360deg);
  }
}

.gbbUpsellCard {
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-areas:
    "media content"
    "button button";
  align-items: center;
  gap: 10px;
  padding: 12px;
  border: 1px solid var(--upsell-card-border-color, #e1e1e1);
  border-radius: var(--upsell-card-radius, 12px);
  background-color: var(--upsell-card-bg, #ffffff);
  font-family: var(--upsell-card-font-family, inherit);
  line-height: 1.4;
  text-align: left;
  overflow: hidden;
}
.gbbUpsellCard, .gbbUpsellCard * {
  box-sizing: border-box;
}
.gbbUpsellCardMedia {
  grid-area: media;
  box-sizing: border-box;
  width: 65px;
  height: 65px;
  border: 1px solid rgba(0, 0, 0, 0.1);
  border-radius: 12px;
  overflow: hidden;
}
.gbbUpsellCardMediaImage {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* "contains" shows the whole image, so the tile behind it would sit bare. A blurred copy of the
   same image fills it instead, painted from the URL the card writes into --upsell-card-media-image. */
.gbbUpsellCardMedia[data-image-fit="contains"] {
  position: relative;
}
.gbbUpsellCardMedia[data-image-fit="contains"]::before {
  content: "";
  position: absolute;
  /* Bleeds past every edge so the blur's own soft border falls outside the tile, which clips it. */
  inset: -20%;
  background-image: var(--upsell-card-media-image);
  background-size: cover;
  background-position: center;
  filter: blur(10px);
}
.gbbUpsellCardMedia[data-image-fit="contains"] .gbbUpsellCardMediaImage {
  position: relative;
  object-fit: contain;
}
.gbbUpsellCardContent {
  grid-area: content;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 4px;
  min-width: 0;
}
.gbbUpsellCardTitle {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  color: var(--upsell-card-headline-color, #1a1a1a);
  font-size: 16px;
  font-weight: 600;
  overflow-wrap: anywhere;
  overflow: hidden;
}
.gbbUpsellCardDescription {
  color: var(--upsell-card-body-color, #6d727f);
  font-size: 14px;
  text-wrap: pretty;
  overflow-wrap: anywhere;
}
.gbbUpsellCardPriceRow {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 4px;
}
.gbbUpsellCardBundlePrice {
  color: var(--upsell-card-headline-color, #1a1a1a);
  font-size: 16px;
  font-weight: 600;
  white-space: nowrap;
}
.gbbUpsellCardRegularPrice {
  color: var(--upsell-card-body-color, #6d727f);
  font-size: 15px;
  text-decoration: line-through;
  white-space: nowrap;
}
.gbbUpsellCardPill {
  padding: 4px 10px;
  border-radius: 999px;
  background-color: #37784a;
  color: #ffffff;
  font-size: 12px;
  font-weight: 700;
  white-space: nowrap;
}
.gbbUpsellCardButton {
  grid-area: button;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  width: 100%;
  min-width: 0;
  min-height: 45px;
  padding: 8px 16px;
  border: 1px solid var(--upsell-card-button-border-color, transparent);
  border-radius: var(--upsell-card-button-radius, 5px);
  background-color: var(--upsell-card-button-bg, #1a1a1a);
  background-image: none;
  box-shadow: none;
  color: var(--upsell-card-button-text-color, #ffffff);
  font-family: inherit;
  font-size: 16px;
  font-weight: 500;
  text-transform: none;
  letter-spacing: normal;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}
.gbbUpsellCardButtonLabel {
  display: flex;
  align-items: center;
  justify-content: center;
  overflow-wrap: normal;
  word-break: normal;
}
.gbbUpsellCardButtonSeparator {
  flex: 0 0 auto;
}
.gbbUpsellCardButtonPrice {
  flex: 0 0 auto;
}
.gbbUpsellCardButton .gbbSpinnerLoader {
  width: 20px;
  height: 20px;
}
.gbbUpsellCard[data-upsell-layout="SPLIT"] {
  grid-template-areas: "media content";
  grid-template-columns: 38% 1fr;
  align-items: stretch;
  gap: 0;
  padding: 0;
}
.gbbUpsellCard[data-upsell-layout="SPLIT"] .gbbUpsellCardMedia {
  width: auto;
  height: auto;
  border: 0;
  border-radius: 0;
  min-height: 150px;
}
.gbbUpsellCard[data-upsell-layout="SPLIT"] .gbbUpsellCardContent {
  gap: 6px;
  padding: 12px;
}
.gbbUpsellCard[data-upsell-layout="SPLIT"] .gbbUpsellCardButton {
  margin-top: 6px;
}

.gbbExtBodyScrollLock {
  overflow: hidden;
}
.gbbExtUpsellModal {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  max-height: none;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  border: 0;
  /* 6px on phones, 14px from 1024px up, ramping between — no media query. Applies to the
     M&M and PB dialogs alike, since both sit inside this one overlay.
     0.03125 = (14 - 6) / (1024 - 768). */
  padding: clamp(6px, 6px + (100vw - 768px) * 0.03125, 14px);
  background: transparent;
  color: inherit;
  font-family: inherit;
  font-size: 16px;
  line-height: 1.4;
  text-align: left;
  transition: opacity 200ms ease;

  &::backdrop {
    background-color: rgba(24, 24, 24, 0.8);
    transition: opacity 200ms ease;
  }
}
.gbbExtUpsellModal, .gbbExtUpsellModal * {
  box-sizing: border-box;
}
/* In the document so the builder can mount into a container that is really in it — invisible, and not
   hit-tested, until reveal(). */
/* Also the animation's start frame: the shell is inserted with this class and reveal() removes it,
   so opacity and transform animate from here. The mount that happens in between guarantees a paint,
   without which the browser would jump straight to the end state. */
.gbbExtUpsellModalHidden,
.gbbExtUpsellModalHidden::backdrop {
  visibility: hidden;
  opacity: 0;
}
.gbbExtUpsellModalHidden .gbbExtUpsellModalDialog {
  transform: translateY(28px);
  opacity: 0;
}
@media (prefers-reduced-motion: reduce) {
  .gbbExtUpsellModal,
  .gbbExtUpsellModal::backdrop {
    transition: none;
  }
  .gbbExtUpsellModalDialog {
    transition: none;
  }
  .gbbExtUpsellModalHidden .gbbExtUpsellModalDialog {
    transform: none;
  }
}
.gbbExtUpsellModalDialog {
  position: relative;
  width: 100%;
  max-width: min(100%, 1500px);
  max-height: 100%;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 12px;
  background-color: var(--upsell-card-popup-bg, #ffffff);
  background-image: none;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25);
  color: #1a1a1a;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  transition: transform 260ms cubic-bezier(0.2, 0.8, 0.2, 1), opacity 200ms ease;
  /* opacity ONLY — never transform. `will-change: transform` makes this a containing block for
     position:fixed descendants, so every overlay the builder opens inside the dialog (variant
     modal, drawers) would be positioned against the DIALOG instead of the viewport. Measured:
     a fixed inset:0 child came back as the dialog's 600x300 box rather than the 1200x800 viewport.
     The entry transform still animates; it just no longer traps anything permanently. */
  will-change: opacity;
}
/* Product Bundle is a fixed-contents list and reads better narrow. Mix & Match keeps the wide
   default above: it mounts the full-page builder, which 500px would squeeze. */
.gbbExtUpsellModalDialogCompact {
  max-width: min(100%, 500px);
}
/* ...and Mix & Match takes the full height as well as the full width. That builder owns its own
   scrolling body and sticky footer, so a dialog sized to its content leaves the footer floating
   mid-overlay instead of pinned to the bottom. Scoped by the ABSENCE of the compact class, which
   is set only for Product Bundle (giftBoxLogicv1.js#open, options.isCompactDialog) — a third
   engine mounted in this popup would inherit this until it is given a marker of its own. */
.gbbExtUpsellModalDialog:not(.gbbExtUpsellModalDialogCompact) {
  height: 100%;
}
/* The dialog carries no padding of its own, so this border spans it edge to edge. */
/* Not sticky: the header is a flex row the dialog never scrolls, and the content below is the
   scroll container. That is why it needs no z-index — nothing can paint over it, where a sticky
   header inside the scroller lost to the builder's own z-index 2. */
.gbbExtUpsellModalHeader {
  flex: 0 0 auto;
  display: flex;
  align-items: flex-start;
  padding: 12px 14px;
  border-bottom: 1px solid #e7e7e7;
  background-color: var(--upsell-card-popup-bg, #ffffff);
}
.gbbExtUpsellModalTitle {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  min-width: 0;
  margin: 0;
  /* The 5px puts the close button's centre on the first line's, at these two elements' sizes. */
  padding: 5px 12px 0 0;
  color: #1a1a1a;
  font-family: inherit;
  font-size: 19px;
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: normal;
  text-transform: none;
  overflow-wrap: anywhere;
  overflow: hidden;
}
.gbbExtUpsellModalContent {
  flex: 1 1 auto;
  /* Without this a flex child refuses to shrink below its content and the dialog grows instead. */
  min-height: 0;
  /* No media query: below 768px the middle term is NEGATIVE so the 0px floor wins, and it
     reaches the 14px ceiling at 1024px. 0.0547 is the slope between those two widths,
     14 / (1024 - 768). Mobile therefore gets nothing and desktop the full inset. */
  padding: clamp(0px, (100vw - 768px) * 0.0547, 14px);
  overflow-y: auto;
}
/* Phone popup only. Fills the dialog so a short list parks the Mix & Match bar on the bottom. */
@media (max-width: 768px) {
  .gbbExtUpsellModalContent {
    display: flex;
    flex-direction: column;

    .gbbFullPageBundle,
    .gbbBundleContent,
    .gbbBundleBody,
    .gbbCategoriesContainer,
    .gbbCategoriesBodyContainer {
      display: flex;
      flex: 1 0 auto;
      flex-direction: column;
    }

    .gbbFullPageBundle {
      height: auto;
      min-height: 100%;
    }

    .gbbCategoriesBodyContainer {
      display: grid;
      grid-template-rows: auto minmax(auto, 1fr);
    }

    .gbbBundleFooter {
      align-self: end;
      width: 100%;
      margin-top: auto;
      position: sticky;
      top: auto;
      bottom: 0;
    }

    .gbbCompactCartDrawer:not([data-status=opened]) {
      height: 0;
      max-height: 0;
      overflow: hidden;
    }
  }
}
/* PB's builder is a compact widget that needs the dialog to inset it. The M&M full-page builder
   brings its own page padding, so the base rule above leaves it alone rather than doubling it. */
.gbbExtUpsellModalDialogCompact .gbbExtUpsellModalContent {
  padding: 14px 14px 0 14px;
}
/* FUNCTIONAL_STACK paints its own full-bleed panel, so the dialog must not inset it as well. Reads
   the design off the HOST — the layout element carries it too, but that lives inside the shadow
   root and no selector out here can see it. */
.gbbExtUpsellModalDialogCompact .gbbExtUpsellModalContent:has(.gbbPbWidgetWrapper[data-gbb-pb-design="FUNCTIONAL_STACK"]) {
  padding: 0;
}
.gbbExtUpsellModalClose svg {
  width: 20px;
  height: 20px;
  fill: currentColor;
}
.gbbExtUpsellModalClose {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  min-width: 0;
  margin: 0 0 0 auto;
  padding: 0;
  border: 0;
  border-radius: 999px;
  background-color: var(--upsell-card-popup-icon-bg, #f1f2f4);
  background-image: none;
  box-shadow: none;
  color: var(--upsell-card-popup-icon-color, #6d727f);
  font-family: inherit;
  line-height: 1;
  letter-spacing: normal;
  text-transform: none;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}
/* Cart upsell (gbbExtCartUpsell). Colours arrive as --cart-upsell-* on the gbb-cart-upsell host. [data-surface] (always set) lifts the
   reset above generic theme rules such as .cart-items > *. */
gbb-cart-upsell[data-surface] {
  display: block;
  box-sizing: border-box;
  width: 100%;
  max-width: 100%;
  min-width: 0;
  margin: 8px 0;
  padding: 0;
  float: none;
}
/* Stacked widgets: the one above already gives 8px, and flex columns never collapse margins. */
gbb-cart-upsell[data-surface] + gbb-cart-upsell[data-surface] {
  margin-top: 0;
}
.gbbCartUpsellCompact,
.gbbCartUpsellRow {
  box-sizing: border-box;
  width: 100%;
  min-height: 0;
  height: auto;
  margin: 0;
  border: 0;
  border-radius: var(--cart-upsell-radius, 8px);
  background: var(--cart-upsell-bg, #f1f4f2);
  box-shadow: none;
  color: var(--cart-upsell-heading-color, #121212);
  font: inherit;
  letter-spacing: normal;
  text-transform: none;
  text-align: start;
  -webkit-appearance: none;
  appearance: none;
}
.gbbCartUpsellCompact {
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 10px;
  padding-block: 8px;
  padding-inline: 8px 10px;
  font-size: 13px;
  line-height: 1.3;
}
/* Heading and second line stay stacked. The pill sits beside them and wraps under the block when it does not fit. */
.gbbCartUpsellCompactCopy {
  display: flex;
  flex: 1;
  flex-wrap: wrap;
  align-items: center;
  column-gap: 8px;
  row-gap: 4px;
  min-width: 0;
}
.gbbCartUpsellCompactText {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}
/* The row layout: with no second line to fill the body, the pill sits next to the action at the end (the action already
   pushes itself right when there is no pill). */
.gbbCartUpsellRow.gbbCartUpsellNoSecondLine .gbbCartUpsellPill {
  margin-inline-start: auto;
}
.gbbCartUpsellRow.gbbCartUpsellNoSecondLine .gbbCartUpsellPill + .gbbCartUpsellAction {
  margin-inline-start: 0;
}
.gbbCartUpsellImage {
  display: block;
  box-sizing: border-box;
  width: 36px;
  height: 36px;
  max-width: none;
  margin: 0;
  border-radius: 4px;
  background: #ffffff;
  object-fit: cover;
}
.gbbCartUpsellCompact .gbbCartUpsellImage {
  flex: none;
  align-self: center;
}
.gbbCartUpsellCompact .gbbCartUpsellHeading {
  min-width: 0;
  font-weight: 700;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.gbbCartUpsellCompact .gbbCartUpsellSecondLine {
  display: -webkit-box;
  min-width: 0;
  overflow: hidden;
  color: var(--cart-upsell-body-color, #555555);
  white-space: normal;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}
.gbbCartUpsellPill {
  padding: 3px 9px;
  border-radius: 999px;
  background: var(--cart-upsell-pill-bg, #37784a);
  color: var(--cart-upsell-pill-text-color, #ffffff);
  font-size: 12px;
  font-weight: 700;
  line-height: 1.3;
  white-space: nowrap;
}
.gbbCartUpsellCompact .gbbCartUpsellPill {
  flex: none;
}
.gbbCartUpsellChevron {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  color: #777777;
  margin-inline-end: -6px;
}
.gbbCartUpsellChevron svg {
  width: 18px;
  height: 18px;
  fill: currentColor;
}
.gbbCartUpsellRow {
  display: block;
  padding: 12px;
}
.gbbCartUpsellRow .gbbCartUpsellHeading {
  display: block;
  margin-bottom: 8px;
  font-size: 15px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--cart-upsell-heading-color, #121212);
}
.gbbCartUpsellRowBody {
  display: flex;
  align-items: center;
  gap: 12px;
}
.gbbCartUpsellRow .gbbCartUpsellImage {
  flex: none;
  width: 56px;
  height: 56px;
  border-radius: 6px;
}
.gbbCartUpsellRow .gbbCartUpsellSecondLine {
  display: -webkit-box;
  flex: 1;
  min-width: 0;
  overflow: hidden;
  color: var(--cart-upsell-body-color, #555555);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.3;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}
.gbbCartUpsellRow .gbbCartUpsellPill {
  flex: none;
}
/* Text and pill wrap together. A long second line takes the row and the pill drops under it; the image and action stay beside the group. */
.gbbCartUpsellRowCopy {
  display: flex;
  flex: 1;
  flex-wrap: wrap;
  align-items: center;
  column-gap: 12px;
  row-gap: 6px;
  min-width: 0;
}
.gbbCartUpsellRowCopy .gbbCartUpsellSecondLine {
  flex: 1 0 max-content;
  max-width: 100%;
  min-width: auto;
}
/* The row's only clickable part: a button, so theme button rules are reset here. */
gbb-cart-upsell .gbbCartUpsellAction {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  width: auto;
  min-width: 0;
  height: auto;
  min-height: 32px;
  margin: 0;
  margin-inline-start: auto;
  padding: 0 12px;
  border: 1px solid var(--cart-upsell-heading-color, #121212);
  border-radius: 4px;
  background: transparent;
  box-shadow: none;
  color: var(--cart-upsell-heading-color, #121212);
  font: inherit;
  font-size: 13px;
  font-weight: 600;
  line-height: 1.3;
  letter-spacing: normal;
  text-transform: none;
  white-space: nowrap;
  cursor: pointer;
  position: relative;
  -webkit-appearance: none;
  appearance: none;
}
gbb-cart-upsell .gbbCartUpsellAction:focus-visible {
  outline: 2px solid var(--cart-upsell-heading-color, #121212);
  outline-offset: 2px;
}
/* The label stays in the button while it is busy, so the width does not collapse around the spinner. */
gbb-cart-upsell .gbbCartUpsellAction[aria-busy="true"] {
  color: transparent;
}
gbb-cart-upsell .gbbCartUpsellAction[aria-busy="true"]::after {
  content: "";
  position: absolute;
  inset: 0;
  width: 14px;
  height: 14px;
  margin: auto;
  box-sizing: border-box;
  border: 2px solid var(--cart-upsell-heading-color, #121212);
  border-bottom-color: transparent;
  border-radius: 50%;
  animation: spinnerLoaderRoatation .5s linear infinite;
}
/* prepareSpinnerLoader paints its colour inline for the upsell button; here it must follow the widget's text. */
gbb-cart-upsell .gbbSpinnerLoader {
  width: 14px;
  height: 14px;
  border-color: currentColor !important;
  border-bottom-color: transparent !important;
}
/* A blank copy slot must not keep its row, pill, or button box. :empty ignores whitespace. */
.gbbCartUpsellHeading:empty,
.gbbCartUpsellSecondLine:empty,
.gbbCartUpsellPill:empty,
gbb-cart-upsell .gbbCartUpsellAction:empty {
  display: none !important;
}
