Snippets Layout

Bootstrap 5 Restaurant Menu with Category Filter

A restaurant menu with a featured chef's pick, sectioned dishes with counts, rounded photo tiles, dotted price leaders and scrollable category pills that filter the list.

Bootstrap 5 No jQuery Apr 2020 2.1K views

<section class="wdw-stage">
  <div class="container" style="max-width:760px">
    <div class="wdw-card p-4 p-md-5">
      <div class="text-center mb-4">
        <span class="wdw-eyebrow">Trattoria Nove</span>
        <h1 class="wdw-heading h2 mt-1 mb-3">Tonight’s menu</h1>
        <div class="wdw-tabs-scroll">
        <div class="nav nav-pills flex-nowrap gap-2" id="wdwMenuTabs" role="group" aria-label="Menu categories">
          <button class="nav-link rounded-pill active" type="button" data-filter="all" aria-pressed="true">All</button>
          <button class="nav-link rounded-pill" type="button" data-filter="starters" aria-pressed="false">Starters</button>
          <button class="nav-link rounded-pill" type="button" data-filter="mains" aria-pressed="false">Mains</button>
          <button class="nav-link rounded-pill" type="button" data-filter="desserts" aria-pressed="false">Desserts</button>
        </div>
        </div>
      </div>

      <article class="wdw-feature position-relative rounded-4 overflow-hidden mb-4" data-feature data-cat="mains">
        <img src="https://images.unsplash.com/photo-1559847844-5315695dadae?auto=format&fit=crop&w=900&h=420&q=80" alt="Shrimp creole served over rice in a white bowl" width="900" height="420" loading="lazy">
        <div class="wdw-scrim position-absolute bottom-0 start-0 end-0 p-3 p-md-4 text-white">
          <span class="badge rounded-pill text-bg-light mb-2 d-table">Chef's pick</span>
          <div class="d-flex align-items-baseline justify-content-between gap-3">
            <h2 class="h4 fw-bold mb-0">Shrimp creole</h2>
            <span class="fw-bold fs-5">$24</span>
          </div>
          <p class="small mb-0 opacity-75">Gulf shrimp, spiced tomato broth, jasmine rice, scallion</p>
        </div>
      </article>

      <section class="wdw-section mb-4" data-section="starters" aria-labelledby="sec-starters">
        <div class="d-flex align-items-center gap-2 mb-3 pb-2 border-bottom">
          <h2 class="h6 text-uppercase fw-bold mb-0 text-body-emphasis" id="sec-starters" style="letter-spacing:.08em">Starters</h2>
          <span class="badge rounded-pill bg-body-secondary text-body-secondary" data-count>3</span>
        </div>
        <div class="d-grid gap-3">
          <article class="wdw-dish d-flex align-items-start gap-3" data-cat="starters">
            <img src="https://images.unsplash.com/photo-1482049016688-2d3e1b311543?auto=format&fit=crop&w=240&h=240&q=80" alt="Egg and avocado toast" width="88" height="88" class="wdw-dish-img" loading="lazy">
            <div class="flex-grow-1 min-w-0">
              <div class="d-flex align-items-baseline gap-2">
                <h3 class="h6 fw-bold mb-0 text-body-emphasis">Egg and avocado toast</h3>
                <span class="wdw-leader flex-grow-1" aria-hidden="true"></span>
                <span class="fw-bold text-primary">$14</span>
              </div>
              <p class="wdw-muted small mb-0 mt-1">Soft egg, avocado, spinach, seeded sourdough</p>
              <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis d-table mt-1">Vegetarian</span>
            </div>
          </article>
          <article class="wdw-dish d-flex align-items-start gap-3" data-cat="starters">
            <img src="https://images.unsplash.com/photo-1540189549336-e6e99c3679fe?auto=format&fit=crop&w=240&h=240&q=80" alt="Garden salad" width="88" height="88" class="wdw-dish-img" loading="lazy">
            <div class="flex-grow-1 min-w-0">
              <div class="d-flex align-items-baseline gap-2">
                <h3 class="h6 fw-bold mb-0 text-body-emphasis">Garden salad</h3>
                <span class="wdw-leader flex-grow-1" aria-hidden="true"></span>
                <span class="fw-bold text-primary">$12</span>
              </div>
              <p class="wdw-muted small mb-0 mt-1">Crisp leaves, olives, shaved onion, feta</p>
              <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis d-table mt-1">Vegetarian</span>
            </div>
          </article>
          <article class="wdw-dish d-flex align-items-start gap-3" data-cat="starters">
            <img src="https://images.unsplash.com/photo-1476224203421-9ac39bcb3327?auto=format&fit=crop&w=240&h=240&q=80" alt="Grilled halloumi" width="88" height="88" class="wdw-dish-img" loading="lazy">
            <div class="flex-grow-1 min-w-0">
              <div class="d-flex align-items-baseline gap-2">
                <h3 class="h6 fw-bold mb-0 text-body-emphasis">Grilled halloumi</h3>
                <span class="wdw-leader flex-grow-1" aria-hidden="true"></span>
                <span class="fw-bold text-primary">$15</span>
              </div>
              <p class="wdw-muted small mb-0 mt-1">Charred halloumi, herb salad, roasted garlic dip</p>
              
            </div>
          </article>
        </div>
      </section>

      <section class="wdw-section mb-4" data-section="mains" aria-labelledby="sec-mains">
        <div class="d-flex align-items-center gap-2 mb-3 pb-2 border-bottom">
          <h2 class="h6 text-uppercase fw-bold mb-0 text-body-emphasis" id="sec-mains" style="letter-spacing:.08em">Mains</h2>
          <span class="badge rounded-pill bg-body-secondary text-body-secondary" data-count>3</span>
        </div>
        <div class="d-grid gap-3">
          <article class="wdw-dish d-flex align-items-start gap-3" data-cat="mains">
            <img src="https://images.unsplash.com/photo-1555939594-58d7cb561ad1?auto=format&fit=crop&w=240&h=240&q=80" alt="Mixed grill platter" width="88" height="88" class="wdw-dish-img" loading="lazy">
            <div class="flex-grow-1 min-w-0">
              <div class="d-flex align-items-baseline gap-2">
                <h3 class="h6 fw-bold mb-0 text-body-emphasis">Mixed grill platter</h3>
                <span class="wdw-leader flex-grow-1" aria-hidden="true"></span>
                <span class="fw-bold text-primary">$26</span>
              </div>
              <p class="wdw-muted small mb-0 mt-1">Chicken skewers, lamb, roast potatoes, smoked aubergine</p>
              
            </div>
          </article>
          <article class="wdw-dish d-flex align-items-start gap-3" data-cat="mains">
            <img src="https://images.unsplash.com/photo-1565299624946-b28f40a0ae38?auto=format&fit=crop&w=240&h=240&q=80" alt="Wood-fired pizza" width="88" height="88" class="wdw-dish-img" loading="lazy">
            <div class="flex-grow-1 min-w-0">
              <div class="d-flex align-items-baseline gap-2">
                <h3 class="h6 fw-bold mb-0 text-body-emphasis">Wood-fired pizza</h3>
                <span class="wdw-leader flex-grow-1" aria-hidden="true"></span>
                <span class="fw-bold text-primary">$16</span>
              </div>
              <p class="wdw-muted small mb-0 mt-1">Tomato, mozzarella, red onion, fresh herbs</p>
              <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis d-table mt-1">Vegetarian</span>
            </div>
          </article>
          <article class="wdw-dish d-flex align-items-start gap-3" data-cat="mains">
            <img src="https://images.unsplash.com/photo-1551782450-a2132b4ba21d?auto=format&fit=crop&w=240&h=240&q=80" alt="Dry-aged smash burger" width="88" height="88" class="wdw-dish-img" loading="lazy">
            <div class="flex-grow-1 min-w-0">
              <div class="d-flex align-items-baseline gap-2">
                <h3 class="h6 fw-bold mb-0 text-body-emphasis">Dry-aged smash burger</h3>
                <span class="wdw-leader flex-grow-1" aria-hidden="true"></span>
                <span class="fw-bold text-primary">$18</span>
              </div>
              <p class="wdw-muted small mb-0 mt-1">Aged cheddar, pickled shallot, hand-cut fries</p>
              
            </div>
          </article>
        </div>
      </section>

      <section class="wdw-section mb-4" data-section="desserts" aria-labelledby="sec-desserts">
        <div class="d-flex align-items-center gap-2 mb-3 pb-2 border-bottom">
          <h2 class="h6 text-uppercase fw-bold mb-0 text-body-emphasis" id="sec-desserts" style="letter-spacing:.08em">Desserts</h2>
          <span class="badge rounded-pill bg-body-secondary text-body-secondary" data-count>3</span>
        </div>
        <div class="d-grid gap-3">
          <article class="wdw-dish d-flex align-items-start gap-3" data-cat="desserts">
            <img src="https://images.unsplash.com/photo-1488477181946-6428a0291777?auto=format&fit=crop&w=240&h=240&q=80" alt="Strawberry panna cotta" width="88" height="88" class="wdw-dish-img" loading="lazy">
            <div class="flex-grow-1 min-w-0">
              <div class="d-flex align-items-baseline gap-2">
                <h3 class="h6 fw-bold mb-0 text-body-emphasis">Strawberry panna cotta</h3>
                <span class="wdw-leader flex-grow-1" aria-hidden="true"></span>
                <span class="fw-bold text-primary">$9</span>
              </div>
              <p class="wdw-muted small mb-0 mt-1">Vanilla cream, macerated strawberries, mint</p>
              <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis d-table mt-1">Vegetarian</span>
            </div>
          </article>
          <article class="wdw-dish d-flex align-items-start gap-3" data-cat="desserts">
            <img src="https://images.unsplash.com/photo-1565958011703-44f9829ba187?auto=format&fit=crop&w=240&h=240&q=80" alt="Raspberry layer cake" width="88" height="88" class="wdw-dish-img" loading="lazy">
            <div class="flex-grow-1 min-w-0">
              <div class="d-flex align-items-baseline gap-2">
                <h3 class="h6 fw-bold mb-0 text-body-emphasis">Raspberry layer cake</h3>
                <span class="wdw-leader flex-grow-1" aria-hidden="true"></span>
                <span class="fw-bold text-primary">$11</span>
              </div>
              <p class="wdw-muted small mb-0 mt-1">Mascarpone cream, fresh raspberries</p>
              <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis d-table mt-1">Vegetarian</span>
            </div>
          </article>
          <article class="wdw-dish d-flex align-items-start gap-3" data-cat="desserts">
            <img src="https://images.unsplash.com/photo-1567620905732-2d1ec7ab7445?auto=format&fit=crop&w=240&h=240&q=80" alt="Honey pancakes" width="88" height="88" class="wdw-dish-img" loading="lazy">
            <div class="flex-grow-1 min-w-0">
              <div class="d-flex align-items-baseline gap-2">
                <h3 class="h6 fw-bold mb-0 text-body-emphasis">Honey pancakes</h3>
                <span class="wdw-leader flex-grow-1" aria-hidden="true"></span>
                <span class="fw-bold text-primary">$10</span>
              </div>
              <p class="wdw-muted small mb-0 mt-1">Warm stack, banana, honey, toasted nuts</p>
              <span class="badge rounded-pill bg-primary-subtle text-primary-emphasis d-table mt-1">Vegetarian</span>
            </div>
          </article>
        </div>
      </section>

      <p class="wdw-muted small text-center mb-0" id="wdwMenuCount" role="status" aria-live="polite"></p>
    </div>
  </div>
</section>

Built on Bootstrap 5.3.8 with plain JavaScript — no jQuery. Supports light and dark mode via data-bs-theme.

Free to use in personal and commercial projects under the MIT license.