Zazz Design Framework
Primitives

Card

A bordered surface that groups related content. Composes with everything.

A card holds related content as a single unit: an article preview, a feature description, a product tile. Zazz's card is a flexible container with named slots for figure, content, body, and footer. Build whatever the design calls for by composing those parts.

Anatomy

<a class="card" href="/article">
  <a class="card__figure" href="/article">
    <img class="card__image" src="/cover.jpg" alt="" />
  </a>

  <div class="card__content">
    <div class="card__tags">
      <a class="badge badge-link" href="/category">Category</a>
      <a class="badge badge-link" href="/tag">Tag</a>
    </div>

    <div class="card__body">
      <a class="card__title-link" href="/article">
        <h3 class="card__title text-h6">How quickly zebras jump</h3>
      </a>
      <p class="card__description text-sm text-muted-foreground line-clamp-2">
        Short excerpt that wraps to two lines before truncating.
      </p>
    </div>

    <div class="card__footer">
      <div class="avatar-author">
        <div class="avatar"><img class="avatar__profile" src="/author.jpg" alt="" /></div>
        <div class="avatar-author__info">
          <span class="avatar-author__name text-sm">Author name</span>
          <span class="avatar-author__description text-xs text-muted-foreground">15 Mar 2025</span>
        </div>
      </div>
      <a class="card__button button button-muted" href="/article">Read article</a>
    </div>
  </div>
</a>
PartClassNotes
RootcardThe bordered surface. Width and height stretch to 100% of the container.
Figurecard__figureOptional media region. 3:2 aspect by default, --radius-md corners. Wrap in an anchor for click-through behavior.
Imagecard__imageAbsolute-positioned fill inside card__figure.
Contentcard__contentPadded text region. Stacks tags, body, and footer with --gap-sm between.
Tagscard__tagsInline badges row with --gap-xs. Often holds badge-link variants.
Bodycard__bodyTitle + description stack with --gap-xs.
Titlecard__titleHeading text. Apply a text style like text-h6 separately.
Title linkcard__title-linkAnchor wrapping the title for click-through.
Descriptioncard__descriptionShort excerpt. Pair with text-sm, text-muted-foreground, and line-clamp-2.
Footercard__footerAuthor meta + CTA row. Wraps when narrow.
Footer CTAcard__buttonThe card's outbound action. Compose with button button-muted or another variant.

The root can be any clickable element (commonly an <a>) or a plain <div> when the card itself isn't a single click target.

Tokens

PropertyToken / value
Width / height100% (fills parent)
Radius--radius-card (defaults to --radius-lg)
Color--card-foreground
BackgroundNone set on root. Add background: var(--card) if the card needs its own surface.
Internal gap--gap-sm (content, footer), --gap-xs (tags, body)
Figure aspect3 / 2, --radius-md
Title sizeWhatever text style you apply (the demo uses text-h6)

The card root is borderless by default. Combine with border: 1px solid var(--border) and background: var(--card) when the card needs to read as a surface. Without those, the card sits flush with the parent.

Composing

Cards compose with primitives:

For a card with an explicit surface and shadow, add a class with background, border, and a box-shadow token at the root.

Accessibility

  • Use a single primary clickable element. Either the root <a> or card__title-link should carry the article's accessible name; nesting both is fine when they point at the same URL.
  • Image alt should be empty when the title carries the same content (avoids double-announcement).
  • Tags inside card__tags are independent links and should have their own accessible names.

Cross-platform

PlatformReference
FigmaZazz v0.4.4 → card (component with figure, content, body, footer slots)
Webflowcard root with card__* child classes
CSS / TailwindThe same classes after installing utilities.css

Where to next

On this page