Snippets Admin

Bootstrap 5 Admin Panel with Sidebar Navigation

An admin panel shell with a top bar, an offcanvas sidebar built from nav pills, KPI tiles, and an orders table with search, status filter and pagination. Other sections show a tidy empty state.

Bootstrap 5 No jQuery Jan 2020 2.2K views

<section class="wdw-stage ap-stage">
  <div class="container px-2 px-lg-3" style="max-width: 1120px">
    <div class="wdw-card overflow-hidden" id="ap">
      <header class="ap-top d-flex align-items-center gap-3 px-3 px-lg-4">
        <button class="btn btn-outline-secondary btn-sm d-lg-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#apNav" aria-controls="apNav" aria-label="Open navigation"><i class="bi bi-list fs-5"></i></button>
        <div class="d-flex align-items-center gap-2"><span class="wdw-icon ap-logo"><i class="bi bi-shield-check"></i></span><strong class="wdw-heading fs-6">Admin Panel</strong></div>
        <div class="ms-auto d-flex align-items-center gap-3">
          <span class="small text-body-secondary d-none d-sm-inline">George User</span>
          <img src="https://i.pravatar.cc/80?img=12" alt="George User" width="36" height="36" class="rounded-circle">
          <button class="btn btn-sm btn-outline-secondary" type="button" aria-label="Log out"><i class="bi bi-box-arrow-right"></i></button>
        </div>
      </header>
      <div class="d-lg-flex">
        <aside class="ap-side">
          <div class="offcanvas-lg offcanvas-start" tabindex="-1" id="apNav" aria-labelledby="apNavLabel">
            <div class="offcanvas-header d-lg-none">
              <h2 class="offcanvas-title h6 mb-0" id="apNavLabel">Navigation</h2>
              <button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#apNav" aria-label="Close"></button>
            </div>
            <div class="offcanvas-body flex-column">
              <nav aria-label="Main">
                <ul class="nav nav-pills flex-column gap-1" id="apTabs">
            <li class="nav-item"><button type="button" class="nav-link d-flex align-items-center gap-3 w-100 text-start" data-ap-tab="Dashboard"><i class="bi bi-grid-1x2"></i><span>Dashboard</span></button></li>
            <li class="nav-item"><button type="button" class="nav-link d-flex align-items-center gap-3 w-100 text-start active" data-ap-tab="Orders" aria-current="page"><i class="bi bi-archive"></i><span>Orders</span></button></li>
            <li class="nav-item"><button type="button" class="nav-link d-flex align-items-center gap-3 w-100 text-start" data-ap-tab="Users"><i class="bi bi-people"></i><span>Users</span></button></li>
            <li class="nav-item"><button type="button" class="nav-link d-flex align-items-center gap-3 w-100 text-start" data-ap-tab="Content"><i class="bi bi-file-text"></i><span>Content</span></button></li>
            <li class="nav-item"><button type="button" class="nav-link d-flex align-items-center gap-3 w-100 text-start" data-ap-tab="Inbox"><i class="bi bi-envelope"></i><span>Inbox</span><span class="badge rounded-pill text-bg-primary ms-auto">13</span></button></li>
            <li class="nav-item"><button type="button" class="nav-link d-flex align-items-center gap-3 w-100 text-start" data-ap-tab="Statistics"><i class="bi bi-graph-up"></i><span>Statistics</span></button></li>
            <li class="nav-item"><button type="button" class="nav-link d-flex align-items-center gap-3 w-100 text-start" data-ap-tab="Settings"><i class="bi bi-gear"></i><span>Settings</span></button></li>
                </ul>
              </nav>
            </div>
          </div>
        </aside>
        <main class="ap-main flex-grow-1 p-3 p-lg-4">
          <h1 class="wdw-heading h4 mb-3" id="apTitle">Orders</h1>

          <div id="apOrders">
            <div class="row g-3 mb-3">
              <div class="col-4"><div class="ap-kpi"><div class="ap-kpi-label">Open orders</div><div class="ap-kpi-value">24</div></div></div>
              <div class="col-4"><div class="ap-kpi"><div class="ap-kpi-label">Revenue</div><div class="ap-kpi-value">$12.4k</div></div></div>
              <div class="col-4"><div class="ap-kpi"><div class="ap-kpi-label">Shipped</div><div class="ap-kpi-value">86%</div></div></div>
            </div>

            <ul class="nav nav-pills gap-2 mb-3" id="apSub">
              <li class="nav-item"><button class="nav-link active" type="button" data-ap-sub="list">List</button></li>
              <li class="nav-item"><button class="nav-link" type="button" data-ap-sub="new">New order</button></li>
            </ul>

            <div id="apList">
              <div class="d-flex flex-wrap gap-2 mb-2">
                <div class="flex-grow-1 position-relative">
                  <label class="visually-hidden" for="apSearch">Search orders</label>
                  <i class="bi bi-search ap-search-icon"></i>
                  <input id="apSearch" type="search" class="form-control ps-5" placeholder="Search orders">
                </div>
                <label class="visually-hidden" for="apStatus">Filter by status</label>
                <select id="apStatus" class="form-select w-auto"><option value="">All statuses</option><option value="shipped">Shipped</option><option value="processing">Processing</option><option value="cancelled">Cancelled</option></select>
              </div>
              <div class="table-responsive">
                <table class="table align-middle mb-0">
                  <thead><tr class="small text-body-secondary text-uppercase"><th class="d-none d-md-table-cell">Order</th><th>Customer</th><th class="d-none d-md-table-cell">City</th><th class="d-none d-md-table-cell">Status</th><th class="text-end">Total</th></tr></thead>
                  <tbody id="apRows">
              <tr data-ap-row="marta keller berlin shipped 4821" data-status="shipped"><td class="fw-semibold d-none d-md-table-cell">#4821</td><td><div class="fw-semibold">Marta Keller</div><div class="d-md-none small text-body-secondary mt-1">#4821 · <span class="badge rounded-pill text-success-emphasis bg-success-subtle">Shipped</span></div></td><td class="d-none d-md-table-cell text-body-secondary">Berlin</td><td class="d-none d-md-table-cell"><span class="badge rounded-pill text-success-emphasis bg-success-subtle">Shipped</span></td><td class="text-end fw-semibold">$240.00</td></tr>
              <tr data-ap-row="jonas weber hamburg processing 4820" data-status="processing"><td class="fw-semibold d-none d-md-table-cell">#4820</td><td><div class="fw-semibold">Jonas Weber</div><div class="d-md-none small text-body-secondary mt-1">#4820 · <span class="badge rounded-pill text-warning-emphasis bg-warning-subtle">Processing</span></div></td><td class="d-none d-md-table-cell text-body-secondary">Hamburg</td><td class="d-none d-md-table-cell"><span class="badge rounded-pill text-warning-emphasis bg-warning-subtle">Processing</span></td><td class="text-end fw-semibold">$89.50</td></tr>
              <tr data-ap-row="lena fischer munich shipped 4819" data-status="shipped"><td class="fw-semibold d-none d-md-table-cell">#4819</td><td><div class="fw-semibold">Lena Fischer</div><div class="d-md-none small text-body-secondary mt-1">#4819 · <span class="badge rounded-pill text-success-emphasis bg-success-subtle">Shipped</span></div></td><td class="d-none d-md-table-cell text-body-secondary">Munich</td><td class="d-none d-md-table-cell"><span class="badge rounded-pill text-success-emphasis bg-success-subtle">Shipped</span></td><td class="text-end fw-semibold">$412.00</td></tr>
              <tr data-ap-row="tom becker cologne cancelled 4818" data-status="cancelled"><td class="fw-semibold d-none d-md-table-cell">#4818</td><td><div class="fw-semibold">Tom Becker</div><div class="d-md-none small text-body-secondary mt-1">#4818 · <span class="badge rounded-pill text-danger-emphasis bg-danger-subtle">Cancelled</span></div></td><td class="d-none d-md-table-cell text-body-secondary">Cologne</td><td class="d-none d-md-table-cell"><span class="badge rounded-pill text-danger-emphasis bg-danger-subtle">Cancelled</span></td><td class="text-end fw-semibold">$56.00</td></tr>
              <tr data-ap-row="ana silva lisbon processing 4817" data-status="processing"><td class="fw-semibold d-none d-md-table-cell">#4817</td><td><div class="fw-semibold">Ana Silva</div><div class="d-md-none small text-body-secondary mt-1">#4817 · <span class="badge rounded-pill text-warning-emphasis bg-warning-subtle">Processing</span></div></td><td class="d-none d-md-table-cell text-body-secondary">Lisbon</td><td class="d-none d-md-table-cell"><span class="badge rounded-pill text-warning-emphasis bg-warning-subtle">Processing</span></td><td class="text-end fw-semibold">$178.25</td></tr>
                  </tbody>
                </table>
              </div>
              <div class="d-flex flex-wrap align-items-center justify-content-between gap-2 pt-3">
                <span class="small text-body-secondary" id="apCount" aria-live="polite">Showing 5 of 24 orders</span>
                <nav aria-label="Orders pages"><ul class="pagination pagination-sm mb-0"><li class="page-item disabled"><span class="page-link">Prev</span></li><li class="page-item active"><span class="page-link" aria-current="page">1</span></li><li class="page-item"><a class="page-link" href="#">2</a></li><li class="page-item"><a class="page-link" href="#">Next</a></li></ul></nav>
              </div>
            </div>

            <form id="apNew" class="row g-3" hidden>
              <div class="col-sm-6"><label class="form-label small fw-semibold" for="apCust">Customer</label><input id="apCust" class="form-control" placeholder="Marta Keller"></div>
              <div class="col-sm-6"><label class="form-label small fw-semibold" for="apCity">City</label><input id="apCity" class="form-control" placeholder="Berlin"></div>
              <div class="col-12"><label class="form-label small fw-semibold" for="apNote">Notes</label><textarea id="apNote" class="form-control" rows="3" placeholder="Delivery instructions"></textarea></div>
              <div class="col-12"><button type="submit" class="btn btn-primary rounded-pill px-4">Create order</button></div>
            </form>
          </div>

          <div id="apEmpty" class="text-center py-5" hidden>
            <span class="wdw-icon mb-3"><i class="bi bi-inbox"></i></span>
            <h2 class="h6 mb-1">Nothing here yet</h2>
            <p class="small text-body-secondary mb-0">The <span id="apEmptyName">Dashboard</span> section has no content to show.</p>
          </div>
        </main>
      </div>
    </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.