<article class="card card--cta card--fact">
    <header class="card__header card__banner" style="
      --cardBannerImage: url(https://d18lev1ok5leia.cloudfront.net/chesapeakebay/images/_652x206_crop_center-center_none/watershed-bg.jpg);
      --cardBannerImage2x: url(https://d18lev1ok5leia.cloudfront.net/chesapeakebay/images/_1304x412_crop_center-center_none/watershed-bg.jpg)
      ">
        <h2 class="card__title">
            <a href="#" class="card__link" aria-describedby="what-is-a-watershed-read-more">What is a watershed?</a>
        </h2>
    </header>
    <div class="card__body">
        <p class="card__description">The Bay itself is about 200 miles long, stretching from Havre de Grace, Maryland, to Virginia Beach, Virginia.</p>
        <span class="card__pseudoLink" id="what-is-a-watershed-read-more">Learn more<span class="appendedIcon">&zwj;<i class="fa-solid fa-angle-right"></i></span></span>
    </div>
    <div class="card__footer">
        <span class="card__category"><i class="prependedIcon fa-solid fa-earth-americas"></i>Bay Geography</span>
    </div>
</article>

<link media="all" rel="stylesheet" href="/card/card.css" />
<script src="/card/card.js"></script>
<article class="card card--cta card--{{ _self.name }}">
  <header class="card__header card__banner" style="
      --cardBannerImage: url({{ cardBannerImage }});
      --cardBannerImage2x: url({{ cardBannerImage2x }})
      ">
    <h2 class="card__title">
      <a href="#" class="card__link" aria-describedby="{{ slug }}-read-more">{{ title }}</a>
    </h2>
  </header>
  <div class="card__body">
    <p class="card__description">{{ cardBody }}</p>
    <span class="card__pseudoLink" id="{{ slug }}-read-more">{% render "@icon--appended" with linkIconArgs %}</span>
  </div>
  <div class="card__footer">
        <span class="card__category">
            {%- render "@icon--prepended" with footerIconArgs -%}
        </span>
  </div>
</article>

{% import "_macros.twig" as h %}
{{ h.componentAssets('card') }}
{
  "title": "What is a watershed?",
  "slug": "what-is-a-watershed",
  "subTitle": "Ocypode quadrata",
  "badge": "Critter of the month",
  "cardBody": "The Bay itself is about 200 miles long, stretching from Havre de Grace, Maryland, to Virginia Beach, Virginia.",
  "cardImgAlt": "Generic alt text example",
  "linkIconArgs": {
    "text": "Learn more",
    "iconClass": "fa-solid fa-angle-right"
  },
  "footerIconArgs": {
    "text": "Bay Geography",
    "iconClass": "fa-solid fa-earth-americas"
  },
  "cardBannerImage": "https://d18lev1ok5leia.cloudfront.net/chesapeakebay/images/_652x206_crop_center-center_none/watershed-bg.jpg",
  "cardBannerImage2x": "https://d18lev1ok5leia.cloudfront.net/chesapeakebay/images/_1304x412_crop_center-center_none/watershed-bg.jpg"
}
  • Content:
    @use "../_layout/mixins";
    
    .card {
      --card-bg: var(--neutral--light);
      display: flex;
      flex-direction: column;
      max-width: var(--cardMaxWidth, 400px);
    }
    .card--selectableContent {
      @at-root .selectableContent,
        & p {
        position: relative;
        z-index: calc(var(--z) * 11);
      }
      .card__imgCaption {
        pointer-events: auto;
      }
    }
    .card__header {
      background-color: var(--neutral--darker);
      color: var(--neutral--ultraLight);
      padding: 1rem;
      display: flex;
      flex: 1;
      align-items: center;
      justify-content: center;
    }
    .card__heading {
      display: flex;
      flex-direction: column;
      gap: 0.5em;
    }
    .card__banner {
      background-image: var(--cardBannerImage);
      background-size: cover;
      aspect-ratio: 19/6;
    
      @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
        background-image: var(--cardBannerImage2x);
      }
    }
    .card__postDate {
      order: -1;
      margin: 0;
    }
    .card__body {
      padding: 1em;
      background-color: var(--card-bg);
      border: 1px solid var(--neutral--dark);
      flex: 1;
      margin: 0;
    
      :where(& > *:not(:first-child)) {
        margin-block: 0.7em 0;
      }
    }
    .card__title {
      font-size: var(--step-2);
      margin: 0;
    }
    .card__description {
      margin-block-start: 0;
    }
    .card__link {
      background-image: none;
    }
    .card__subtitle {
      font-size: var(--step-1);
      font-style: italic;
      line-height: 1.4;
      font-weight: var(--normal-weight);
    }
    .card__attributes {
      margin-block-start: 0;
    }
    .card__badge {
      position: absolute;
      top: 0;
      left: 0;
      max-width: 100%;
      background-color: rgba(255, 205, 50, 0.8); //accent with 80% alpha
      pointer-events: none;
      margin: 0;
      padding: var(--step--1);
      border-radius: 0 0 10px 0;
      font-size: calc(0.9 * var(--step--1));
      font-weight: var(--cardBadgeFontWeight, var(--normal-weight));
      line-height: 1;
      text-transform: uppercase;
      z-index: calc(var(--z) * 11);
    }
    .card__pseudoLink {
      @include mixins.link();
      @include mixins.blockLink($color: var(--blue--dark));
      display: inline-block;
    }
    .card__moreLink {
      font-size: var(--step-09);
      @include mixins.blockLink();
      display: inline-block;
    }
    .card__imageCont {
      order: -1;
      background-color: var(--neutral--ultraDark);
    }
    .card__image {
      @include mixins.responsiveImg();
      width: 100%;
      vertical-align: top;
    }
    .card__imgCaption {
      font-size: var(--step--2);
      font-style: italic;
      padding: 0.2rem 1rem 0;
      background-color: var(--card-bg);
      border-inline: 1px solid var(--neutral--dark);
      margin-block-end: -0.4rem;
      position: relative;
      pointer-events: none;
    }
    .card__footer {
      --footer-bg: var(--neutral--dark);
      --footer-color: var(--neutral--ultraDark);
      background-color: var(--footer-bg);
      padding: 0.7em 1em;
      text-align: center;
      color: var(--footer-color);
    }
    .card__category {
      font-size: var(--step--1);
      line-height: 0.8;
      text-transform: uppercase;
      display: flex;
      justify-content: center;
      align-items: center;
    
      .prependedIcon {
        font-size: var(--step-1);
      }
    }
    
    .card--cta {
      position: relative;
    
      .card__link {
        &:after {
          content: "";
          z-index: calc(var(--z) * 10);
          @include mixins.fillParent();
        }
      }
    
      .card__image {
        transition: opacity 0.2s ease-out;
      }
      .card__footer {
        transition: color 0.2s ease-out, background-color 0.2s ease-out;
      }
      .card__body,
      .card__imgCaption {
        transition: background-color 0.2s ease-out;
      }
    
      &:hover {
        --card-bg: var(--neutral--dark);
    
        .card__image {
          opacity: 0.4;
        }
        .card__footer {
          --footer-bg: var(--neutral--ultraDark);
          --footer-color: var(--neutral--ultraLight);
        }
      }
    }
    
    .card--public-access {
      .card__title {
        font-weight: var(--normal-weight);
        text-align: center;
      }
    }
    .card--fact {
      .card__title {
        text-align: center;
        color: var(--white);
        font-size: var(--step-3);
        text-shadow: 0 2px 3px var(--neutral--ultraDark);
      }
      .card__link {
        color: inherit;
      }
      .card__banner--inverse {
        .card__title {
          color: var(--type);
          font-size: var(--step-4);
          font-weight: var(--normal-weight);
          text-shadow: none;
        }
      }
    }
    
  • URL: /components/raw/card/card.scss
  • Filesystem Path: src/components/card/card.scss
  • Size: 4.1 KB

Fact Card

Add .card__banner--inverse if the banner image is a lighter color to set the card title to a dark color and alternate style.