Skip to content

Card Patterns

Bullframe doesn't ship a .bf-card class. Cards are usually one box with padding, a border or shadow, and consistent spacing. Easy enough to compose from existing utilities.

Content card

html
<article class="bf-m-b-3" style="border: 1px solid var(--bf-gray-light); border-radius: 4px; padding: 1.5rem;">
  <h3 class="bf-m-t-0">Article title</h3>
  <p>One- or two-line summary of the article. Just enough to entice without giving away the lede.</p>
  <a class="bf-btn" href="#">Read more</a>
</article>

Why no .bf-card class? Because every team's card looks different. Different border radius, padding, shadow, spacing. Forcing a single class makes overrides ugly. Compose from utilities and a few inline custom properties.

Media card

Image on top, content below.

html
<article style="border: 1px solid var(--bf-gray-light); border-radius: 4px; overflow: hidden;">
  <img src="hero.jpg" alt="" style="display: block; width: 100%; height: auto;" />
  <div style="padding: 1.5rem;">
    <h3 class="bf-m-t-0">Card with image</h3>
    <p>Content sits below the image. The <code>overflow: hidden</code> on the parent clips the image to the rounded corner.</p>
    <a class="bf-btn bf-btn--primary" href="#">View</a>
  </div>
</article>

Note alt="" on decorative images; keeps the link list clean for screen readers. If the image is meaningful (a chart, a screenshot), give it a real alt.

Card grid (responsive)

3-up on desktop, 2-up on tablet, 1-up on phone.

html
<div class="bf-row">
  <div class="bf-col-12 bf-col-md-6 bf-col-lg-4">
    <!-- card -->
  </div>
  <div class="bf-col-12 bf-col-md-6 bf-col-lg-4">
    <!-- card -->
  </div>
  <div class="bf-col-12 bf-col-md-6 bf-col-lg-4">
    <!-- card -->
  </div>
</div>

Pricing card

html
<article class="bf-t-center" style="border: 2px solid var(--bf-blue); border-radius: 8px; padding: 2rem;">
  <h3 class="bf-m-t-0">Pro</h3>
  <p style="font-size: 3rem; margin: 0;">
    <strong>$12</strong>
    <small style="font-size: 1rem; color: var(--bf-gray-dark);">/month</small>
  </p>
  <ul class="bf-list-unstyled bf-m-b-2">
    <li>Unlimited projects</li>
    <li>Priority support</li>
    <li>Custom domains</li>
  </ul>
  <a class="bf-btn bf-btn--primary" style="width: 100%;" href="#">Choose Pro</a>
</article>

Linked card (whole card clickable)

Wrap in <a> and reset its appearance. Avoid nested interactive elements inside the link.

html
<a href="/article/42" style="display: block; text-decoration: none; color: inherit;">
  <article style="border: 1px solid var(--bf-gray-light); border-radius: 4px; padding: 1.5rem;">
    <h3 class="bf-m-t-0">Title</h3>
    <p>Whole card is the link target. No nested buttons or links inside.</p>
  </article>
</a>

Bullframe CSSCopyright © 2026 Marco Pontili