@import './global/global';

.cu-card {
  border-radius: var(--cu-card-border-radius);
  display: flex;
  flex-direction: column;
  position: relative;

  &__content {
    display: flex;
    height: 100%;
    flex-direction: column;
    align-items: flex-start;
    order: 2;
    padding: var(--cu-card-content-padding);
  }

  &__meta {
    margin-bottom: var(--cu-vr1);
  }

  &__media {
    order: 1;
    margin-bottom: var(--cu-vr0);

    .cu-image, .cu-video {
      width: 100%;
    }

    .cu-card__media-link {
      display: block;
    }
  }

  /*=============================================
  =            Modifiers            =
  =============================================*/

  /*----------  Teaser  ----------*/
  &--teaser {
    --cu-composite-heading-align: left;
    --cu-composite-heading-text-align: left;
    --cu-composite-heading-accent-display: none;

    .cu-card__meta {
      margin-bottom: var(--cu-vr-1);
    }

    &[class*="cu-colorscheme--"] {
      .cu-card__content {
        padding: 0 var(--cu-ps0) var(--cu-vr1);

        @include breakpoint(md) {
          padding: 0 var(--cu-ps1) var(--cu-vr1);
        }
      }
    }
  }

  /*----------  Stacked  ----------*/
  &--stacked {
    --cu-composite-heading-accent-display: none;
    // Push the last element (often a button, to the bottom).
    .cu-card__meta + * {
      flex-grow: 2;
    }

    .cu-card__content {
      align-items: center;
      text-align: center;

      .cu-button {
        margin-top: var(--cu-vr-1);
      }
    }
  }

  // Only pad the content if a colorscheme is applied.
  &--stacked[class*="cu-colorscheme--"] {
    .cu-card__content {
      padding: 0 var(--cu-ps1);
    }
  }

  /*----------  Promos  ----------*/
  &--promo {
    --cu-composite-heading-accent-display: none;

    .cu-card__content {
      justify-content: center;
      align-items: center;
      padding: var(--cu-vr1) var(--cu-ps1);
      text-align: center;

      @include breakpoint(md) {
        padding: var(--cu-vr2) var(--cu-ps2);
      }

      @include breakpoint(md) {
        padding: var(--cu-vr3) var(--cu-ps3);
      }
    }
  }

  /*----------  Inset  ----------*/
  &--inset {
    display: block;
    overflow: auto;

    .cu-card__content {
      position: absolute;
      bottom: var(--cu-vr1);
      left: var(--cu-ps1);
      right: var(--cu-ps1);
      height: unset;
      align-items: center;
      padding: var(--cu-vr1) var(--cu-ps1);
      text-align: center;
      background-color: var(--cu-colorscheme-background, white);

      @include breakpoint(md) {
        bottom: var(--cu-vr3);
        left: var(--cu-ps3);
        right: var(--cu-ps3);
      }
    }

    .cu-card__media {
      margin-bottom: 0;
      height: 100%;

      img, video {
        aspect-ratio: 1/2;
        width: 100%;
        height: 100%;

        @include breakpoint(sm) {
          aspect-ratio: var(--image-aspect-ratio);
        }
      }

      // Any element in the media section that isn't a replaced element should
      // be ignored. This will allow the object-fit property to work even if the
      // img or video is nested in other markup.
      :not(img):not(video) {
        display: contents;
      }
    }
  }

  /*----------  Popouts  ----------*/
  &--popout {
    background-color: transparent;

    .cu-composite-heading::after {
      content: none;
    }

    .cu-card__content {
      background-color: var(--cu-colorscheme-background, #FCFCFC);
      padding: var(--cu-vr2) var(--cu-ps2);
      margin: calc(var(--cu-vr2) * -1) var(--cu-vr1) 0;
      align-items: center;
      text-align: center;

      &::before {
        content: '';
        width: 25%;
        border-top: 8px solid var(--cu-colorscheme-accent);
        padding-bottom: var(--cu-vr1);
      }

      > * {
        word-wrap: anywhere;
      }
    }

    @include breakpoint(md) {
      display: grid;
      grid-template-columns: 1fr 1fr;
      padding-bottom: calc(var(--cu-vr1));

      .cu-card__media {
        grid-column: 1 / -1;
        grid-row: 1;
        margin-bottom: 0;
      }

      .cu-card__content {
        grid-column: 2;
        grid-row: 1;
        align-self: flex-end;
        height: auto;
        margin-top: 55%;
        margin-bottom: calc(var(--cu-vr1) * -1);
        padding: var(--cu-vr3) var(--cu-ps3);
      }

      &.cu-card--popout-left .cu-card__content {
        grid-column: 1;
      }
    }
  }

  /*----------  Panel  ----------*/
  &--panel {
    @include breakpoint(sm) {
      display: grid;
      // Using fr here instead of percent to allow wide text to push the width
      // of a column if necessary.
      grid-template-columns: 2fr 1fr;
      padding: 0;
    }

    .cu-card__content {
      padding: var(--cu-vr1) var(--cu-ps1);

      @include breakpoint(sm) {
        display: flex;
        flex-direction: column;
        justify-content: center;
        padding: var(--cu-vr1) var(--cu-ps2);
      }
    }

    .cu-button,
    .cu-card__link {
      width: 100%;

      @include breakpoint(sm) {
        width: auto;
      }
    }

    .cu-card__media {
      width: 100%;
      height: 100%;
      margin: 0;

      // Only specific Replaced Elements can cover the media div.
      // See https://html.spec.whatwg.org/multipage/rendering.html#replaced-elements
      img, video {
        width: 100%;
        height: 100%;

        @include breakpoint(xs) {
          aspect-ratio: 1.7/1;
        }

        @include breakpoint(sm) {
          aspect-ratio: initial;
        }
      }

      // Any element in the media section that isn't a replaced element should
      // be ignored. This will allow the object-fit property to work even if the
      // img or video is nested in other markup.
      :not(img):not(video) {
        display: contents;
      }

      @include breakpoint(sm) {
        position: relative;
        grid-column: 1;
        grid-row: 1;
      }
    }
  }

  &--panel-left {
    @include breakpoint(sm) {
      grid-template-columns: 1fr 2fr;
    }

    .cu-card__media {
      @include breakpoint(sm) {
        grid-column: 2;
      }
    }
  }

  /*----------  Promo with media and letterbox  ----------*/
  &--promo.cu-card--with-media,
  &--with-aside {
    @include overlay;
    --cu-text-color: #{$white};

    .cu-card__media {
      position: absolute;
      overflow: hidden;
      max-width: none;
      width: 100%;
      height: 100%;
      z-index: 1;

      // Only specific Replaced Elements can cover the media div.
      // See https://html.spec.whatwg.org/multipage/rendering.html#replaced-elements
      img, video {
        width: 100%;
        height: 100%;
      }

      // Any element in the media section that isn't a replaced element should
      // be ignored. This will allow the object-fit property to work even if the
      // img or video is nested in other markup.
      :not(img):not(video) {
        display: contents;
      }
    }

    .cu-card__content {
      position: relative;
      z-index: 3;
      pointer-events: all;
    }

    .cu-card__fact-list {
      list-style-type: none;
      padding: 0;

      @include breakpoint(md) {
        display: flex;
        justify-content: space-between;
        align-items: stretch;
      }
    }

    .cu-card__fact {
      --cu-font-size: var(--cu-ms5);
      --cu-line-height: 1.2;
      padding: var(--cu-vr0);
      border-bottom: 2px solid rgba($white, 0.2);

      &:last-child {
        border: none;
      }

      @include breakpoint(md) {
        border-bottom: none;
        border-right: 2px solid rgba($white, 0.2);
        padding: 0 var(--cu-vr2);
      }

      &-label {
        --cu-font-size: var(--cu-ms0);
        --cu-font-weight: 300;
        display: block;
      }
    }
  }

  &--use-aspect-ratio.cu-card--promo {
    display: grid;

    .cu-card__content,
    .cu-card__media {
      grid-column: 1;
      grid-row: 1;

      position: relative;
    }
  }

  /*----------  Pinned ----------*/
  &--pinned {
    .cu-card__content {
      justify-content: flex-end;

      > :first-child {
        margin-bottom: auto; // Align to the top of the flex column (e.g. justify-self)
      }
    }
  }

  &--pinned-bottom {
    .cu-card__content {
      justify-content: flex-end;
    }
  }

  &--pinned-top {
    .cu-card__content {
      justify-content: flex-start;
    }
  }

  /*----------  Centered content  ----------*/
  &--centered {
    .cu-card__content {
      text-align: center;
      justify-content: center;
      padding: var(--cu-vr1);
    }
  }

  /*----------  Padded  ----------*/
  &--padded {
    .cu-card__content {
      padding: var(--cu-vr1) var(--cu-ps1);
    }
  }

  /*----------  Cinematic  ----------*/
  &--cinematic {
    display: flex;
    flex-direction: column;

    &[class*="cu-colorscheme--"] {
      padding: var(--cu-vr1) var(--cu-ps1);
    }

    @include breakpoint(md) {
      .cu-card__content {
        display: grid;
        grid-template-columns: 1fr 1fr;
        grid-template-rows: 1fr; // Fix for Safari bug.
        column-gap: var(--cu-vr1);

        &>* {
          grid-column: 2;
        }

        .cu-card__meta {
          grid-column: 1;
          grid-row: 1 / 10; // For some reason, "-1" isn't working so we choose a large #.
        }
      }

      &[class*="cu-colorscheme--"] {
        padding: var(--cu-vr3) var(--cu-ps2);
      }
    }

    .cu-icon--color-light { // Default bg is light, so icon should be dark.
      --cu-text-color: #{$black};
    }

    &.cu-card--with-media {
      @include breakpoint (md) {
        .cu-card__meta {
          padding-left: var(--cu-ps5);
          padding-right: var(--cu-ps2);
        }
      }
    }

    .cu-button,
    .cu-card__link {
      width: 100%;
      justify-self: start;

      @include breakpoint(sm) {
        width: auto;
      }
    }

    .cu-card__media {
      margin-bottom: var(--cu-vr1);

      @include breakpoint(md) {
        margin-bottom: var(--cu-vr2);
      }

      .cu-image {
        aspect-ratio: 3/2;

        @include breakpoint(md) {
          aspect-ratio: unset;
        }
      }
    }
  }

  &--cinematic-reversed {
    .cu-card__media {
      order: 10;
      margin: var(--cu-vr1) 0 0;

      @include breakpoint(md) {
        margin-top: var(--cu-vr2);
      }
    }
  }

  &--post-small {
    --cu-composite-heading-accent-display: none;

    .cu-card__content {
      height: unset;
    }

    .cu-card__media {
      margin-bottom: 0;
      line-height: 1;
    }

    .cu-card__meta {
      margin: 0;
    }

    .cu-composite-heading__heading {
      --cu-font-size: var(--cu-ms0) !important;
    }

    display: grid;
    grid-template-columns: 88px auto;
    gap: var(--cu-ps0);
  }

  /*----------  Icon  ----------*/
  // @deprecated
  &--icon {
    padding: 0 var(--cu-ps-1);
    --cu-card-border-radius: 3px;
    flex-direction: row;
    align-items: center;

    .cu-card__content {
      width: 100%;
    }
  }

  /*----------  Dynamic  ----------*/
  &--dynamic {
    --cu-card-border-radius: 3px;
    padding: var(--cu-vr1) var(--cu-ps1) var(--cu-vr0);
    background-color: var(--cu-colorscheme-background, #FCFCFC);

    .cu-card__meta {
      margin-bottom: var(--cu-vr0);
    }

    .cu-card__content {
      align-items: center;
      text-align: center;
    }

    .cu-composite-heading__heading {
      --cu-font-size: var(--cu-ms3);
    }
  }

  /*----------  Hover Reveal  ----------*/
  &--hover-content-reveal {
    .cu-card__content {
      display: block;
    }

    .cu-card__hover-content {
      overflow: hidden;
      max-height: 0;
      transition: max-height .25s ease, opacity .375s, margin-bottom .25s;
      opacity: 0;

      &:last-child {
        margin-bottom: unset;
      }
    }

    .cu-composite-heading::after {
      display: none;
    }

    &:hover {
      .cu-card__hover-content {
        max-height: 500px;
        opacity: 1;

        &:last-child {
          margin-bottom: revert;
        }
      }

      .cu-composite-heading::after {
        display: revert;
      }
    }
  }

  /*----------  Hover Overlay  ----------*/
  &--hover-overlay {
    display: grid;
    grid-template-columns: 1fr;
    grid-template-rows: 1fr;

    .cu-card__content,
    .cu-card__media {
      grid-row: 1;
      grid-column: 1;
    }

    .cu-card__media {
      margin: 0;
      z-index: 1;
    }

    .cu-card__content {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      text-align: center;

      // The background color is set here on a pseudo-element, rather than on
      // .cu-card__content, so that we can adjust its opacity without affecting
      // the opacity of the other card content.
      &::before {
        content: '';
        background-color: var(--cu-colorscheme-background);
        opacity: var(--cu-overlay-opacity, 0.75);
        position: absolute;
        inset: 0 0 0 0;
        z-index: -1;
      }
    }

    &:hover {
      .cu-card__content {
        z-index: 2;
      }
    }
  }

  /*----------  Portrait (2 rows tall)  ----------*/
  &--portrait {
    @include overlay($opacity: 0.7, $gradient: 1);

    grid-row-start: span 2; // Must be part of a grid.

    .cu-card__heading {
      padding-top: var(--cu-vr4); // Add padding for mobile to make room for portrait image.
    }
  }

  /*----------  Landscape (span all columns)  ----------*/
  &--landscape {
    grid-column: 1 / -1; // Must be part of a grid

    .cu-card__content {
      --cu-card-content-padding: var(--cu-vr3) 25%;

      &--narrow {
        max-width: 50%;
        margin: 0 auto;
      }
    }
  }

  /*----------  With aside  ----------*/
  &--with-aside {
    display: grid; // This fixes an issue in Safari when display is flex.

    .cu-card__content {
      display: grid;
      grid-template-columns: 5% 57% 5% 28% 5%;
      padding: 25% 0 var(--cu-vr0);

      > * {
        grid-column: 2;
        grid-row: auto;

        &:last-child {
          grid-column: 4;
          align-self: center;
          text-align: center;
        }
      }
    }

    .cu-heading--strong {
      --cu-font-size: var(--cu-ms2);
    }
  }
  /*=====  End of Modifiers  ======*/
}

.cu-card__link {
  cursor: pointer;
  text-decoration: none;
  position: absolute;
  z-index: 4;
  opacity: 0;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  overflow: hidden;
  text-indent: 200%;
  white-space: nowrap;
  background: transparent;
  pointer-events: all;
}
