Footer

The site/app footer — pure CSS, no JS. Two flavors from one component: marketing (default: brand zone + link columns + optional social row + optional newsletter + legal row) and app (--app, one thin row). Plus an optional giant brand decorative variant. Consumes .lb-btn, .lb-input-wrap, .lb-badge, .lb-icon-btn, and the brand icon set.

a11y (built in): the footer must be the page's single body-scoped <footer> rendered outside <main> — nested inside main/section it silently loses its contentinfo landmark. Each link column is a <nav aria-labelledby> pointing at its real heading. Icon-only social links carry aria-label names. Mobile collapse is plain stacking — no accordion. (Demo pages nest footers in boxes for display only.)


A · App footer — --app

One thin row for app shells: copyright left, links + status right. Uses the .lb-badge status slot. App shells often need no footer at all — ship this only when legal/status must stay visible.

© 2026 letbe. All rights reserved.
Docs Support Privacy All systems normal

B · Marketing footer — newsletter inline

The full flavor: brand zone (logo + tagline + social row), link columns (4 default; the grid handles 3–5), newsletter beside the columns, legal row. Column count is just how many nav.lb-footer__col you place.

letbe

A token-driven design system for people who ship. No build step, no dependencies.

Product

  • Components
  • Tokens
  • Icons
  • Theme editor

Resources

  • Documentation
  • Figma library
  • Changelog

Company

  • About
  • Blog
  • Contact

Stay in the loop

Release notes and new components, once a month.

© 2026 letbe. All rights reserved.
Privacy Terms Cookies

C · Newsletter below + __giant brand

Same component, two options flipped on: the newsletter as its own full-width row (--row) between the columns and the legal row, and the decorative oversized wordmark (aria-hidden — pure ornament).

letbe

Design once, theme forever.

Product

  • Components
  • Tokens
  • Icons

Resources

  • Documentation
  • Changelog

Company

  • About
  • Contact

Legal

  • Privacy
  • Terms

Stay in the loop

Release notes and new components, once a month.

letbe

© 2026 letbe. All rights reserved.
Privacy Terms

Usage

Pure CSS — nothing to init. Place the footer as a sibling of <main>, never inside it. The newsletter <form> ships unwired — bring your own submit handler (same rule as the media player's engine).

<footer class="lb-footer">
  <div class="lb-footer__inner">
    <div class="lb-footer__top">
      <div class="lb-footer__brandcol">
        <a class="lb-footer__brand" href="/"><span class="lb-footer__logo" data-lb-icon="letbe"></span> Brand</a>
        <p class="lb-footer__tagline">Tagline.</p>
        <div class="lb-footer__social">
          <a class="lb-icon-btn lb-icon-btn--ghost lb-icon-btn--small" href="#" aria-label="Brand on X"><span data-lb-icon="x-logo"></span></a>
        </div>
      </div>
      <div class="lb-footer__cols">
        <nav class="lb-footer__col" aria-labelledby="f-product">
          <h3 class="lb-footer__col-title" id="f-product">Product</h3>
          <ul class="lb-footer__list"><li><a class="lb-footer__link" href="#">…</a></li></ul>
        </nav>
        <!-- 3–5 columns: just add/remove nav.lb-footer__col -->
      </div>
      <!-- optional inline newsletter: .lb-footer__newsletter here -->
    </div>
    <!-- optional: .lb-footer__newsletter.lb-footer__newsletter--row (full-width) -->
    <!-- optional: <p class="lb-footer__giant" aria-hidden="true">Brand</p> -->
    <div class="lb-footer__legal">
      <span>© 2026 Brand</span>
      <div class="lb-footer__legal-links">
        <a class="lb-footer__link" href="#">Privacy</a>
        <span class="lb-badge lb-badge--success lb-badge--small"><span class="lb-badge__dot"></span> All systems normal</span>
      </div>
    </div>
  </div>
</footer>