<article class="card card--public-access">
<header class="card__header">
<h2 class="card__title">1st Street & Spa Creek</h2>
</header>
<div class="card__body">
<dl class="attributeList card__attributes">
<dt class="attributeList__attribute">Produced by</dt>
<dd class="attributeList__value">Will Parson</dd>
<dt class="attributeList__attribute">Music</dt>
<dd class="attributeList__value">Doctor Turtle via FreeMusicArchive.org</dd>
<dt class="attributeList__attribute">Additional footage</dt>
<dd class="attributeList__value">Jim Thompson</dd>
<dt class="attributeList__attribute">Special thanks to</dt>
<dd class="attributeList__value">Jim Thompson and the Maryland Department of Natural Resources</dd>
</dl>
<link media="all" rel="stylesheet" href="/attribute-list/attribute-list.css" />
<script src="/attribute-list/attribute-list.js"></script> <a href="#" target="_blank" class="card__moreLink">View in Google Maps<span class="appendedIcon">‍<i class="fa-solid fa-angle-right"></i></span></a>
</div>
<div class="card__footer">
<span class="card__category"><i class="prependedIcon fa-solid fa-location-dot"></i>Anne Arundel County, Maryland</span>
</div>
</article>
<link media="all" rel="stylesheet" href="/card/card.css" />
<script src="/card/card.js"></script>
<article class="card card--{{ _self.name }}">
<header class="card__header"><h2 class="card__title">{{ title }}</h2></header>
<div class="card__body">
{% render "@attribute-list" with {containerClass: "card__attributes"} %}
<a href="#" target="_blank" class="card__moreLink">{% render "@icon--appended" with linkIconArgs %}</a>
</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": "1st Street & Spa Creek",
"slug": "atlantic-ghost-crab",
"subTitle": "Ocypode quadrata",
"badge": "Critter of the month",
"cardBody": "<p>Also known as the sand crab, the Atlantic ghost crab is a sand-colored crustacean with a distinct pair of white claws. Ghost crabs are active on coastal beaches in the Chesapeake Bay region from spring through autumn.</p>",
"cardImgAlt": "A yellow sand crab with large white front claws and two black eyes protruding on stalks from the top of its head.",
"linkIconArgs": {
"text": "View in Google Maps",
"iconClass": "fa-solid fa-angle-right"
},
"footerIconArgs": {
"text": "Anne Arundel County, Maryland",
"iconClass": "fa-solid fa-location-dot"
},
"attributes": [
{
"attribute": "Boat Ramp",
"icon": "fa-solid fa-ship",
"value": "Yes"
},
{
"attribute": "Fishing",
"icon": "fa-solid fa-fish",
"value": "No"
},
{
"attribute": "Swimming",
"icon": "fa-solid fa-person-swimming",
"value": "Yes"
},
{
"attribute": "Trail",
"icon": "fa-solid fa-person-hiking",
"value": "Yes"
},
{
"attribute": "Parking",
"icon": "fa-solid fa-car-side",
"value": "No"
}
]
}
import "./card.scss";
@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;
}
}
}
Add .card__banner--inverse if the banner image is a lighter color to set the card title to a dark color and alternate style.