Snippets List

Bootstrap 5 Todo List with Tabs and Archive

A clean daily planner with Today and Tomorrow groups, time ranges, durations and tick-to-archive tasks. Add new tasks and switch between the Tasks and Archive tabs.

Bootstrap 5 No jQuery Dec 2019 2.5K views

<section class="wdw-stage">
  <div class="container" style="max-width:640px">
    <div class="wdw-card border-0 overflow-hidden" id="planner">
      <div class="d-flex align-items-center justify-content-between gap-3 px-4 pt-4 pb-3">
        <div>
          <span class="wdw-eyebrow">Planner · <span id="today-date">Tuesday, 14 May</span></span>
          <h2 class="wdw-heading h3 mb-0 mt-1">My day</h2>
        </div>
        <ul class="nav nav-pills bg-body-tertiary rounded-pill p-1 flex-nowrap" role="tablist" aria-label="Planner views">
          <li class="nav-item" role="presentation"><button class="nav-link rounded-pill active" data-bs-toggle="pill" data-bs-target="#pane-tasks" id="tab-tasks" type="button" role="tab" aria-controls="pane-tasks" aria-selected="true">Tasks</button></li>
          <li class="nav-item" role="presentation"><button class="nav-link rounded-pill" data-bs-toggle="pill" data-bs-target="#pane-archive" id="tab-archive" type="button" role="tab" aria-controls="pane-archive" aria-selected="false">Archive <span class="badge rounded-pill text-bg-primary ms-1" id="archive-count">0</span></button></li>
        </ul>
      </div>
      <div class="px-4 pb-3">
        <div class="d-flex justify-content-between small mb-2"><span class="text-body-secondary fw-semibold" id="progress-label">0 of 5 done</span><span class="text-body-secondary" id="progress-pct">0%</span></div>
        <div class="progress" style="height:.5rem" role="progressbar" aria-label="Tasks completed today" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="progress-bar" id="progress-bar" style="width:0"></div></div>
      </div>
      <div class="tab-content px-4 pb-4">
        <div class="tab-pane fade show active" id="pane-tasks" role="tabpanel" aria-labelledby="tab-tasks" tabindex="0">
          <div class="d-flex justify-content-between align-items-baseline mb-2">
            <h3 class="h5 fw-bold mb-0 text-body-emphasis mt-1">Today</h3>
            <span class="small text-body-secondary" data-total="today">4h 15min planned</span>
          </div>
          <ul class="list-unstyled mb-0" id="today-list">
            <li class="todo-item"><input class="form-check-input" type="checkbox" id="t1" aria-label="Take kids to school"><label for="t1" class="todo-title">Take kids to school</label><span class="todo-time"><i class="bi bi-calendar-event"></i> 8:00–8:30 AM</span><span class="todo-dur">30 min</span></li>
            <li class="todo-item"><input class="form-check-input" type="checkbox" id="t2" aria-label="Process email"><label for="t2" class="todo-title">Process email</label><span class="todo-time"><i class="bi bi-pin-angle-fill"></i> 8:00–9:30 AM</span><span class="todo-dur">1 h</span></li>
            <li class="todo-item"><input class="form-check-input" type="checkbox" id="t3" aria-label="Daily stand-up meeting"><label for="t3" class="todo-title">Daily stand-up meeting</label><span class="todo-time"><i class="bi bi-calendar-event"></i> 9:00–10:00 AM</span><span class="todo-dur">30 min</span></li>
            <li class="todo-item"><input class="form-check-input" type="checkbox" id="t4" aria-label="Create new templates"><label for="t4" class="todo-title">Create new templates</label><span class="todo-time"><i class="bi bi-pin-angle-fill"></i> 10:00–11:45 AM</span><span class="todo-dur">1 h 45 min</span></li>
            <li class="todo-item"><input class="form-check-input" type="checkbox" id="t5" aria-label="Lunch with Anna"><label for="t5" class="todo-title">Lunch with Anna</label><span class="todo-time"><i class="bi bi-calendar-event"></i> 12:00–12:30 PM</span><span class="todo-dur">30 min</span></li>
          </ul>
          <form class="d-flex gap-2 mt-3" id="add-form">
            <label class="visually-hidden" for="new-task">New task</label>
            <input class="form-control" id="new-task" type="text" placeholder="Add a task for today" autocomplete="off">
            <button class="btn btn-primary rounded-pill px-4" type="submit"><i class="bi bi-plus-lg"></i> Add</button>
          </form>

          <div class="d-flex justify-content-between align-items-baseline mt-4 mb-2 pt-4 border-top">
            <h3 class="h6 fw-bold mb-0 text-body-emphasis">Tomorrow</h3>
            <span class="small text-body-secondary">30min planned</span>
          </div>
          <ul class="list-unstyled mb-0">
            <li class="todo-item"><input class="form-check-input" type="checkbox" id="t6" aria-label="Breakfast with the marketing team"><label for="t6" class="todo-title">Breakfast with the marketing team</label><span class="todo-time"><i class="bi bi-calendar-event"></i> 8:00–8:30 AM</span><span class="todo-dur">30 min</span></li>
          </ul>
        </div>
        <div class="tab-pane fade" id="pane-archive" role="tabpanel" aria-labelledby="tab-archive" tabindex="0">
          <h3 class="h6 fw-bold text-body-emphasis mb-2">Completed</h3>
          <ul class="list-unstyled mb-0" id="archive-list" aria-live="polite">
            <li class="small text-body-secondary py-4 text-center" id="archive-empty">Nothing archived yet. Tick a task and it lands here.</li>
          </ul>
        </div>
      </div>
    </div>
    <div class="toast-container position-fixed bottom-0 start-50 translate-middle-x p-3">
      <div class="toast align-items-center text-bg-dark border-0" id="undo-toast" role="status" aria-live="polite" aria-atomic="true" data-bs-delay="4000">
        <div class="d-flex align-items-center">
          <div class="toast-body">Task moved to Archive.</div>
          <button type="button" class="btn btn-sm btn-link text-white fw-bold me-2 ms-auto" id="undo-btn">Undo</button>
          <button type="button" class="btn-close btn-close-white me-2" data-bs-dismiss="toast" aria-label="Close"></button>
        </div>
      </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.