Open demo

CSS code

HTML
<div class="agenda" tabindex="0" role="region" aria-label="Agenda, September 2026">
  <div class="bar"><h2>Agenda</h2><p>September 2026 · 9 events</p></div>
  <h3 class="today">Today · Mon 14 Sep</h3>
  <ul>
    <li><time>09:00</time><i style="background:#6d28d9" aria-hidden="true"></i><span><b>Standup</b><span>15 min · Video call</span></span></li>
    <li><time>11:30</time><i style="background:#f59e0b" aria-hidden="true"></i><span><b>1:1 with Rosa</b><span>1 hr · Focus 1</span></span></li>
    <li><time>14:00</time><i style="background:#16a34a" aria-hidden="true"></i><span><b>Q4 planning</b><span>1 hr 30 · Boardroom</span></span></li>
  </ul>
  <h3>Tue 15 Sep</h3>
  <ul>
    <li><time>09:00</time><i style="background:#6d28d9" aria-hidden="true"></i><span><b>Standup</b><span>15 min · Video call</span></span></li>
    <li><time>15:00</time><i style="background:#0ea5e9" aria-hidden="true"></i><span><b>Client — Meridian</b><span>2 hr · Boardroom</span></span></li>
  </ul>
  <h3>Wed 16 Sep</h3>
  <p class="free">Nothing scheduled</p>
  <h3>Thu 17 Sep</h3>
  <ul>
    <li><time>09:00</time><i style="background:#6d28d9" aria-hidden="true"></i><span><b>Standup</b><span>15 min · Video call</span></span></li>
    <li><time>10:00</time><i style="background:#16a34a" aria-hidden="true"></i><span><b>Photo shoot</b><span>3 hr · Studio A</span></span></li>
    <li><time>16:30</time><i style="background:#e11d48" aria-hidden="true"></i><span><b>Retro</b><span>45 min · Video call</span></span></li>
  </ul>
  <h3>Fri 18 Sep</h3>
  <ul>
    <li><time>09:00</time><i style="background:#6d28d9" aria-hidden="true"></i><span><b>Standup</b><span>15 min · Video call</span></span></li>
  </ul>
</div>
CSS
/* Mobile agenda: one scrolling panel, a sticky title bar and sticky day headings underneath it.
   The panel is a focusable region so keyboard users can scroll it. */
.agenda{--ag-accent:#6d28d9;--ag-muted:#5f6b7c;--ag-bar:60px;
  box-sizing:border-box;width:340px;max-width:100%;height:600px;overflow-y:auto;position:relative;background:#fff;border-radius:16px;
  box-shadow:0 14px 34px -18px rgba(18,24,40,.25)}
.agenda:focus-visible{outline:2px solid var(--ag-accent);outline-offset:3px}
.agenda .bar{position:sticky;top:0;z-index:4;height:var(--ag-bar);box-sizing:border-box;background:#fff;padding:14px 18px 0;border-bottom:1px solid #eef1f5}
.agenda h2{font-size:1rem;letter-spacing:-.01em;margin:0}
.agenda .bar p{font-size:.76rem;color:var(--ag-muted);margin:2px 0 0}
.agenda h3{position:sticky;top:var(--ag-bar);z-index:3;margin:0;background:#f6f8fb;padding:8px 18px;font-size:.7rem;font-weight:800;
  letter-spacing:.08em;text-transform:uppercase;color:var(--ag-muted);border-bottom:1px solid #eef1f5}
.agenda h3.today{color:var(--ag-accent)}
.agenda ul{list-style:none;margin:0;padding:0}
.agenda li{display:flex;gap:12px;padding:13px 18px;border-bottom:1px solid #f4f6f9}
.agenda time{width:52px;flex-shrink:0;font-size:.74rem;color:var(--ag-muted);font-variant-numeric:tabular-nums;padding-top:1px}
.agenda li i{width:3px;border-radius:3px;flex-shrink:0}
.agenda li b{display:block;font-size:.85rem}
.agenda li span span{font-size:.76rem;color:var(--ag-muted)}
.agenda .free{padding:14px 18px;margin:0;font-size:.78rem;color:var(--ag-muted);font-style:italic}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div class="agenda card" tabindex="0" role="region" aria-label="Agenda, September 2026">
  <div class="bar bg-white"><h2 class="fs-6 fw-bold m-0">Agenda</h2><p class="m-0" style="margin-top:2px!important;font-size:.76rem;color:var(--ag-muted)">September 2026 · 9 events</p></div>
  <h3 class="today text-uppercase m-0">Today · Mon 14 Sep</h3>
  <ul class="list-group list-group-flush">
    <li class="list-group-item d-flex"><time class="flex-shrink-0">09:00</time><i class="flex-shrink-0" style="background:#6d28d9" aria-hidden="true"></i><span><b class="d-block" style="font-size:.85rem">Standup</b><span style="font-size:.76rem;color:var(--ag-muted)">15 min · Video call</span></span></li>
    <li class="list-group-item d-flex"><time class="flex-shrink-0">11:30</time><i class="flex-shrink-0" style="background:#f59e0b" aria-hidden="true"></i><span><b class="d-block" style="font-size:.85rem">1:1 with Rosa</b><span style="font-size:.76rem;color:var(--ag-muted)">1 hr · Focus 1</span></span></li>
    <li class="list-group-item d-flex"><time class="flex-shrink-0">14:00</time><i class="flex-shrink-0" style="background:#16a34a" aria-hidden="true"></i><span><b class="d-block" style="font-size:.85rem">Q4 planning</b><span style="font-size:.76rem;color:var(--ag-muted)">1 hr 30 · Boardroom</span></span></li>
  </ul>
  <h3 class="text-uppercase m-0">Tue 15 Sep</h3>
  <ul class="list-group list-group-flush">
    <li class="list-group-item d-flex"><time class="flex-shrink-0">09:00</time><i class="flex-shrink-0" style="background:#6d28d9" aria-hidden="true"></i><span><b class="d-block" style="font-size:.85rem">Standup</b><span style="font-size:.76rem;color:var(--ag-muted)">15 min · Video call</span></span></li>
    <li class="list-group-item d-flex"><time class="flex-shrink-0">15:00</time><i class="flex-shrink-0" style="background:#0ea5e9" aria-hidden="true"></i><span><b class="d-block" style="font-size:.85rem">Client — Meridian</b><span style="font-size:.76rem;color:var(--ag-muted)">2 hr · Boardroom</span></span></li>
  </ul>
  <h3 class="text-uppercase m-0">Wed 16 Sep</h3>
  <p class="fst-italic m-0" style="padding:14px 18px;font-size:.78rem;color:var(--ag-muted)">Nothing scheduled</p>
  <h3 class="text-uppercase m-0">Thu 17 Sep</h3>
  <ul class="list-group list-group-flush">
    <li class="list-group-item d-flex"><time class="flex-shrink-0">09:00</time><i class="flex-shrink-0" style="background:#6d28d9" aria-hidden="true"></i><span><b class="d-block" style="font-size:.85rem">Standup</b><span style="font-size:.76rem;color:var(--ag-muted)">15 min · Video call</span></span></li>
    <li class="list-group-item d-flex"><time class="flex-shrink-0">10:00</time><i class="flex-shrink-0" style="background:#16a34a" aria-hidden="true"></i><span><b class="d-block" style="font-size:.85rem">Photo shoot</b><span style="font-size:.76rem;color:var(--ag-muted)">3 hr · Studio A</span></span></li>
    <li class="list-group-item d-flex"><time class="flex-shrink-0">16:30</time><i class="flex-shrink-0" style="background:#e11d48" aria-hidden="true"></i><span><b class="d-block" style="font-size:.85rem">Retro</b><span style="font-size:.76rem;color:var(--ag-muted)">45 min · Video call</span></span></li>
  </ul>
  <h3 class="text-uppercase m-0">Fri 18 Sep</h3>
  <ul class="list-group list-group-flush">
    <li class="list-group-item d-flex"><time class="flex-shrink-0">09:00</time><i class="flex-shrink-0" style="background:#6d28d9" aria-hidden="true"></i><span><b class="d-block" style="font-size:.85rem">Standup</b><span style="font-size:.76rem;color:var(--ag-muted)">15 min · Video call</span></span></li>
  </ul>
</div>
CSS
/* Bootstrap card and .list-group-flush, restyled through --bs-list-group-* variables; the sticky parts are custom. */
.agenda{--ag-accent:#6d28d9;--ag-muted:#5f6b7c;--ag-bar:60px;
  width:340px;max-width:100%;height:600px;overflow-y:auto;border:0;border-radius:16px;box-shadow:0 14px 34px -18px rgba(18,24,40,.25)}
.agenda:focus-visible{outline:2px solid var(--ag-accent);outline-offset:3px}
.agenda > *{flex-shrink:0}
.agenda .bar{position:sticky;top:0;z-index:4;height:var(--ag-bar);padding:14px 18px 0;border-bottom:1px solid #eef1f5}
.agenda h3{position:sticky;top:var(--ag-bar);z-index:3;background:#f6f8fb;padding:8px 18px;font-size:.7rem;font-weight:800;
  letter-spacing:.08em;color:var(--ag-muted);border-bottom:1px solid #eef1f5}
.agenda h3.today{color:var(--ag-accent)}
.agenda .list-group{--bs-list-group-border-color:#f4f6f9;--bs-list-group-item-padding-x:18px;--bs-list-group-item-padding-y:13px;--bs-list-group-color:#191e28}
.agenda time{width:52px;font-size:.74rem;color:var(--ag-muted);font-variant-numeric:tabular-nums;padding-top:1px}
.agenda .list-group-item{gap:12px;font-size:1rem}
.agenda .list-group-item i{width:3px;border-radius:3px}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div class="agenda relative h-[600px] w-[340px] max-w-full overflow-y-auto rounded-2xl bg-white shadow-[0_14px_34px_-18px_rgba(18,24,40,.25)] focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-ag-accent" tabindex="0" role="region" aria-label="Agenda, September 2026">
  <div class="sticky top-0 z-4 h-[60px] border-b border-[#eef1f5] bg-white px-[18px] pt-3.5"><h2 class="text-base font-bold tracking-[-.01em]">Agenda</h2><p class="mt-0.5 text-[.76rem] text-ag-muted">September 2026 · 9 events</p></div>
  <h3 class="sticky top-[60px] z-3 border-b border-[#eef1f5] bg-[#f6f8fb] px-[18px] py-2 text-[.7rem] font-extrabold tracking-[.08em] uppercase text-ag-accent">Today · Mon 14 Sep</h3>
  <ul>
    <li class="flex gap-3 border-b border-[#f4f6f9] px-[18px] py-[13px]"><time class="w-[52px] shrink-0 pt-px text-[.74rem] text-ag-muted tabular-nums">09:00</time><i class="w-[3px] shrink-0 rounded-[3px]" style="background:#6d28d9" aria-hidden="true"></i><span><b class="block text-[.85rem]">Standup</b><span class="text-[.76rem] text-ag-muted">15 min · Video call</span></span></li>
    <li class="flex gap-3 border-b border-[#f4f6f9] px-[18px] py-[13px]"><time class="w-[52px] shrink-0 pt-px text-[.74rem] text-ag-muted tabular-nums">11:30</time><i class="w-[3px] shrink-0 rounded-[3px]" style="background:#f59e0b" aria-hidden="true"></i><span><b class="block text-[.85rem]">1:1 with Rosa</b><span class="text-[.76rem] text-ag-muted">1 hr · Focus 1</span></span></li>
    <li class="flex gap-3 border-b border-[#f4f6f9] px-[18px] py-[13px]"><time class="w-[52px] shrink-0 pt-px text-[.74rem] text-ag-muted tabular-nums">14:00</time><i class="w-[3px] shrink-0 rounded-[3px]" style="background:#16a34a" aria-hidden="true"></i><span><b class="block text-[.85rem]">Q4 planning</b><span class="text-[.76rem] text-ag-muted">1 hr 30 · Boardroom</span></span></li>
  </ul>
  <h3 class="sticky top-[60px] z-3 border-b border-[#eef1f5] bg-[#f6f8fb] px-[18px] py-2 text-[.7rem] font-extrabold tracking-[.08em] uppercase text-ag-muted">Tue 15 Sep</h3>
  <ul>
    <li class="flex gap-3 border-b border-[#f4f6f9] px-[18px] py-[13px]"><time class="w-[52px] shrink-0 pt-px text-[.74rem] text-ag-muted tabular-nums">09:00</time><i class="w-[3px] shrink-0 rounded-[3px]" style="background:#6d28d9" aria-hidden="true"></i><span><b class="block text-[.85rem]">Standup</b><span class="text-[.76rem] text-ag-muted">15 min · Video call</span></span></li>
    <li class="flex gap-3 border-b border-[#f4f6f9] px-[18px] py-[13px]"><time class="w-[52px] shrink-0 pt-px text-[.74rem] text-ag-muted tabular-nums">15:00</time><i class="w-[3px] shrink-0 rounded-[3px]" style="background:#0ea5e9" aria-hidden="true"></i><span><b class="block text-[.85rem]">Client — Meridian</b><span class="text-[.76rem] text-ag-muted">2 hr · Boardroom</span></span></li>
  </ul>
  <h3 class="sticky top-[60px] z-3 border-b border-[#eef1f5] bg-[#f6f8fb] px-[18px] py-2 text-[.7rem] font-extrabold tracking-[.08em] uppercase text-ag-muted">Wed 16 Sep</h3>
  <p class="px-[18px] py-3.5 text-[.78rem] text-ag-muted italic">Nothing scheduled</p>
  <h3 class="sticky top-[60px] z-3 border-b border-[#eef1f5] bg-[#f6f8fb] px-[18px] py-2 text-[.7rem] font-extrabold tracking-[.08em] uppercase text-ag-muted">Thu 17 Sep</h3>
  <ul>
    <li class="flex gap-3 border-b border-[#f4f6f9] px-[18px] py-[13px]"><time class="w-[52px] shrink-0 pt-px text-[.74rem] text-ag-muted tabular-nums">09:00</time><i class="w-[3px] shrink-0 rounded-[3px]" style="background:#6d28d9" aria-hidden="true"></i><span><b class="block text-[.85rem]">Standup</b><span class="text-[.76rem] text-ag-muted">15 min · Video call</span></span></li>
    <li class="flex gap-3 border-b border-[#f4f6f9] px-[18px] py-[13px]"><time class="w-[52px] shrink-0 pt-px text-[.74rem] text-ag-muted tabular-nums">10:00</time><i class="w-[3px] shrink-0 rounded-[3px]" style="background:#16a34a" aria-hidden="true"></i><span><b class="block text-[.85rem]">Photo shoot</b><span class="text-[.76rem] text-ag-muted">3 hr · Studio A</span></span></li>
    <li class="flex gap-3 border-b border-[#f4f6f9] px-[18px] py-[13px]"><time class="w-[52px] shrink-0 pt-px text-[.74rem] text-ag-muted tabular-nums">16:30</time><i class="w-[3px] shrink-0 rounded-[3px]" style="background:#e11d48" aria-hidden="true"></i><span><b class="block text-[.85rem]">Retro</b><span class="text-[.76rem] text-ag-muted">45 min · Video call</span></span></li>
  </ul>
  <h3 class="sticky top-[60px] z-3 border-b border-[#eef1f5] bg-[#f6f8fb] px-[18px] py-2 text-[.7rem] font-extrabold tracking-[.08em] uppercase text-ag-muted">Fri 18 Sep</h3>
  <ul>
    <li class="flex gap-3 border-b border-[#f4f6f9] px-[18px] py-[13px]"><time class="w-[52px] shrink-0 pt-px text-[.74rem] text-ag-muted tabular-nums">09:00</time><i class="w-[3px] shrink-0 rounded-[3px]" style="background:#6d28d9" aria-hidden="true"></i><span><b class="block text-[.85rem]">Standup</b><span class="text-[.76rem] text-ag-muted">15 min · Video call</span></span></li>
  </ul>
</div>
CSS
@theme {
  --color-ag-accent: #6d28d9;
  --color-ag-muted: #5f6b7c;
}

About this set

A phone-sized agenda: a sticky title bar with the month and event count, then one sticky heading per day and the events under it, each with a start time, a coloured marker, a title and its length and place. Today is labelled Today and coloured violet, and a day with no events says Nothing scheduled instead of disappearing. Use it as the mobile view of a calendar app, a conference schedule or a booking list. The panel is a fixed-height scroll container; the title bar is sticky at the top, and each day heading is sticky just below it, so the current day stays visible while its events scroll past. Day headings are real h3 elements and each day’s events are a list, so screen reader users can jump between days by heading. Because the panel scrolls on its own, it is a focusable region with a label, so keyboard users can scroll it with the arrow keys. Grey text was darkened to 4.5:1 contrast. The Bootstrap version uses .card and .list-group-flush, and the Tailwind version builds the same sticky layers from utilities.

What’s included

  • Sticky title bar plus sticky day headings
  • Day headings as h3, events as lists
  • Empty days say "Nothing scheduled"
  • Keyboard-scrollable labelled region
  • Plain CSS, Bootstrap .list-group and Tailwind versions of the same design

Accessibility

Day headings are h3 elements and events are list items with their time in a time element. The scrolling panel has tabindex="0", role="region" and an aria-label, and shows a 2px violet outline on keyboard focus. Today is identified by the word Today, not only by colour. Nothing animates.

Customise it

Change --ag-accent, --ag-muted and --ag-bar (the title bar height that the day headings stick under) on .agenda in plain CSS and Bootstrap, or the --color-ag-* theme colours in Tailwind. The panel size is the 340px width and 600px height.