Open demo

CSS code

HTML
<div><span class="lbl">Overlapping stack · +5 opens the full list</span>
<div class="grp">
  <ul class="stack" aria-label="Checkout redesign team">
    <li><span class="av" role="img" aria-label="Lena Vogt">LV</span></li>
    <li><span class="av teal" role="img" aria-label="Omar Aziz">OA</span></li>
    <li><span class="av rose" role="img" aria-label="June Park">JP</span></li>
    <li><span class="av green" role="img" aria-label="Ines Duarte">ID</span></li>
    <li>
      <details class="more">
        <summary><span class="av count" aria-hidden="true">+5</span><span class="sr-only">Show 5 more members</span></summary>
        <ul class="more-list">
          <li><span class="av xs slate" aria-hidden="true">TR</span>Tomás Ruiz</li>
          <li><span class="av xs amber" aria-hidden="true">KM</span>Kai Moreno</li>
          <li><span class="av xs" aria-hidden="true">PN</span>Priya Nair</li>
          <li><span class="av xs teal" aria-hidden="true">HS</span>Hana Sato</li>
          <li><span class="av xs rose" aria-hidden="true">FA</span>Femi Adeyemi</li>
        </ul>
      </details>
    </li>
  </ul>
  <p class="grp-name">Checkout redesign<small>9 members</small></p>
</div></div>

<div><span class="lbl">Fan-out stack of profile links · spreads on hover and focus</span>
<div class="grp">
  <ul class="stack fan" aria-label="Reviewers">
    <li><a class="av" href="#"><span aria-hidden="true">LV</span><span class="sr-only">Lena Vogt</span></a></li>
    <li><a class="av teal" href="#"><span aria-hidden="true">OA</span><span class="sr-only">Omar Aziz</span></a></li>
    <li><a class="av rose" href="#"><span aria-hidden="true">JP</span><span class="sr-only">June Park</span></a></li>
    <li><a class="av slate" href="#"><span aria-hidden="true">TR</span><span class="sr-only">Tomás Ruiz</span></a></li>
    <li><a class="av amber" href="#"><span aria-hidden="true">KM</span><span class="sr-only">Kai Moreno</span></a></li>
  </ul>
  <button class="add" type="button" aria-label="Add reviewer"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 3v10M3 8h10"/></svg></button>
</div></div>

<div><span class="lbl">Stacks in context · task card and reactions</span>
<div class="ctx">
  <article class="task">
    <h3>Spring catalogue photo shoot</h3>
    <p>Studio B · shot list due Thursday</p>
    <div class="task-foot">
      <ul class="stack tight" aria-label="Assignees">
        <li><span class="av sm" role="img" aria-label="Maya Chen"><svg viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" fill="#c7d2fe"/><path d="M10 64c2-11 11-16 22-16s20 5 22 16z" fill="#4f46e5"/><circle cx="32" cy="34" r="14" fill="#f6c9a4"/><path d="M17 33c0-11 6-18 15-18s15 7 15 18c-3-5-8-8-15-8s-12 3-15 8z" fill="#1e1b4b"/><circle cx="26.5" cy="36" r="1.8" fill="#1e1b4b"/><circle cx="37.5" cy="36" r="1.8" fill="#1e1b4b"/><path d="M28 41.5c2.4 2.2 5.6 2.2 8 0" fill="none" stroke="#1e1b4b" stroke-width="1.8" stroke-linecap="round"/></svg></span></li>
        <li><span class="av sm" role="img" aria-label="Kofi Mensah"><svg viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" fill="#fde68a"/><path d="M10 64c2-11 11-16 22-16s20 5 22 16z" fill="#0f766e"/><circle cx="32" cy="34" r="14" fill="#8d5a3b"/><path d="M18.5 31c1-8 6.5-12 13.5-12s12.5 4 13.5 12c-4-3-8.5-4-13.5-4s-9.5 1-13.5 4z" fill="#1c1917"/><circle cx="26.5" cy="35.5" r="1.8" fill="#1c1917"/><circle cx="37.5" cy="35.5" r="1.8" fill="#1c1917"/><path d="M27 41c2.8 2.6 7.2 2.6 10 0" fill="none" stroke="#1c1917" stroke-width="1.8" stroke-linecap="round"/></svg></span></li>
        <li><span class="av sm" role="img" aria-label="Sofia Lindqvist"><svg viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" fill="#bbf7d0"/><path d="M10 64c2-11 11-16 22-16s20 5 22 16z" fill="#c2410c"/><path d="M16 44V32c0-10 7-17 16-17s16 7 16 17v12z" fill="#ca8a04"/><circle cx="32" cy="34" r="13" fill="#f9d7b8"/><path d="M19 31c2-7 7-10 13-10s11 3 13 10c-5-2-9-6-13-6s-8 4-13 6z" fill="#ca8a04"/><circle cx="26.5" cy="36" r="3.6" fill="none" stroke="#14532d" stroke-width="1.5"/><circle cx="37.5" cy="36" r="3.6" fill="none" stroke="#14532d" stroke-width="1.5"/><path d="M30.1 36h3.8" stroke="#14532d" stroke-width="1.5"/><circle cx="26.5" cy="36" r="1.2" fill="#14532d"/><circle cx="37.5" cy="36" r="1.2" fill="#14532d"/><path d="M28.5 42c2 1.6 5 1.6 7 0" fill="none" stroke="#14532d" stroke-width="1.6" stroke-linecap="round"/></svg></span></li>
        <li><span class="av sm count" role="img" aria-label="2 more assignees">+2</span></li>
      </ul>
      <span class="pill">Due 21 Mar</span>
    </div>
  </article>
  <article class="task">
    <h3>Release notes for version 4.2</h3>
    <p>Posted in #product by Rafael Ortiz</p>
    <div class="task-foot">
      <div class="liked"><span class="mini" aria-hidden="true"><span class="av xs rose">JP</span><span class="av xs teal">OA</span><span class="av xs">LV</span></span>
        <span>Liked by <b>June Park</b>, <b>Omar Aziz</b> and 23 others</span></div>
    </div>
  </article>
</div></div>
CSS
/* Avatar groups. Every avatar has a name in text (role="img" + aria-label, or visually hidden text in a link), never only a tooltip.
   The "+5" overflow is a native <details> disclosure that lists the hidden members, so it works without JavaScript. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.av{--av:40px;--a:#4f46e5;--b:#9333ea;--ring:#f8fafc;display:inline-grid;place-items:center;flex:none;width:var(--av);height:var(--av);border-radius:50%;
  background:linear-gradient(135deg,var(--a),var(--b));box-shadow:0 0 0 2.5px var(--ring);color:#fff;font-size:calc(var(--av) * .36);font-weight:700;
  line-height:1;text-decoration:none;overflow:hidden}
.av svg{width:100%;height:100%}
.av.teal{--a:#0f766e;--b:#0369a1}.av.rose{--a:#c2410c;--b:#be185d}.av.slate{--a:#334155;--b:#475569}.av.green{--a:#047857;--b:#0e7490}.av.amber{--a:#b45309;--b:#c2410c}
.av.sm{--av:32px}.av.xs{--av:24px;font-size:.58rem}
.av.count{background:#e2e8f0;color:#1e293b;font-size:.8rem}
/* overlapping stack */
.stack{position:relative;display:flex;align-items:center;margin:0;padding:0;list-style:none}
.stack>li+li{margin-left:-8px}
.stack.tight>li+li{margin-left:-6px}
.grp{display:flex;flex-wrap:wrap;align-items:center;gap:12px 16px}
.grp-name{font-size:.9rem;font-weight:700;color:#0f172a}
.grp-name small{display:block;margin-top:2px;font-size:.78rem;font-weight:500;color:#526072}
/* +5 disclosure */
.more summary{list-style:none;cursor:pointer;border-radius:50%}
.more summary::-webkit-details-marker{display:none}
.more summary:hover .av{background:#cbd5e1}
.more summary:focus-visible{outline:2px solid #4f46e5;outline-offset:4px}
.more[open] summary .av{background:#1e293b;color:#fff}
.more-list{position:absolute;z-index:5;top:calc(100% + 10px);left:0;width:220px;margin:0;padding:8px;list-style:none;background:#fff;
  border:1px solid #e2e8f0;border-radius:14px;box-shadow:0 18px 40px -18px rgba(15,23,42,.35)}
.more-list li{display:flex;align-items:center;gap:10px;padding:6px 8px;font-size:.85rem;font-weight:600;color:#1e293b}
.more-list .av{--ring:transparent}
/* fan-out stack of links */
.fan>li+li{margin-left:-10px;transition:margin-left .2s ease}
.fan:hover>li+li,.fan:focus-within>li+li{margin-left:4px}
.fan .av:hover{transform:translateY(-2px)}
.fan .av{transition:transform .2s ease}
.fan .av:focus-visible{outline:2px solid #4f46e5;outline-offset:3px}
.add{display:grid;place-items:center;width:40px;height:40px;border:1.5px dashed #64748b;border-radius:50%;background:#fff;color:#334155;cursor:pointer;
  transition:border-color .15s,color .15s}
.add:hover{border-color:#4f46e5;color:#4338ca}
.add:focus-visible{outline:2px solid #4f46e5;outline-offset:3px}
.add svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round}
/* in context */
.ctx{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px}
.task{padding:18px;border:1px solid #e2e8f0;border-radius:16px;background:#fff}
.task .av{--ring:#fff}
.task h3{font-size:.98rem;font-weight:700;color:#0f172a}
.task p{margin-top:4px;font-size:.82rem;color:#526072}
.task-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:14px;border-top:1px solid #f1f5f9}
.pill{padding:3px 9px;border-radius:999px;background:#fef3c7;color:#92400e;font-size:.72rem;font-weight:700}
.liked{display:flex;align-items:center;gap:10px;font-size:.85rem;color:#334155;line-height:1.4}
.liked b{color:#0f172a}
.mini{display:flex;flex:none}
.mini>*+*{margin-left:-6px}
@media (prefers-reduced-motion:reduce){.fan>li+li,.fan .av,.add{transition:none}.fan .av:hover{transform:none}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div><span class="lbl">Overlapping stack · +5 opens the full list</span>
<div class="grp d-flex flex-wrap align-items-center">
  <ul class="stack list-unstyled d-flex align-items-center position-relative m-0" aria-label="Checkout redesign team">
    <li><span class="av rounded-circle text-white fw-bold" role="img" aria-label="Lena Vogt">LV</span></li>
    <li><span class="av teal rounded-circle text-white fw-bold" role="img" aria-label="Omar Aziz">OA</span></li>
    <li><span class="av rose rounded-circle text-white fw-bold" role="img" aria-label="June Park">JP</span></li>
    <li><span class="av green rounded-circle text-white fw-bold" role="img" aria-label="Ines Duarte">ID</span></li>
    <li>
      <details class="more">
        <summary class="rounded-circle"><span class="av count rounded-circle fw-bold" aria-hidden="true">+5</span><span class="visually-hidden">Show 5 more members</span></summary>
        <ul class="dropdown-menu show more-list">
          <li class="dropdown-item-text d-flex align-items-center"><span class="av xs slate rounded-circle text-white fw-bold" aria-hidden="true">TR</span>Tomás Ruiz</li>
          <li class="dropdown-item-text d-flex align-items-center"><span class="av xs amber rounded-circle text-white fw-bold" aria-hidden="true">KM</span>Kai Moreno</li>
          <li class="dropdown-item-text d-flex align-items-center"><span class="av xs rounded-circle text-white fw-bold" aria-hidden="true">PN</span>Priya Nair</li>
          <li class="dropdown-item-text d-flex align-items-center"><span class="av xs teal rounded-circle text-white fw-bold" aria-hidden="true">HS</span>Hana Sato</li>
          <li class="dropdown-item-text d-flex align-items-center"><span class="av xs rose rounded-circle text-white fw-bold" aria-hidden="true">FA</span>Femi Adeyemi</li>
        </ul>
      </details>
    </li>
  </ul>
  <p class="grp-name m-0">Checkout redesign<small class="d-block">9 members</small></p>
</div></div>

<div><span class="lbl">Fan-out stack of profile links · spreads on hover and focus</span>
<div class="grp d-flex flex-wrap align-items-center">
  <ul class="stack fan list-unstyled d-flex align-items-center m-0" aria-label="Reviewers">
    <li><a class="av rounded-circle text-white fw-bold text-decoration-none" href="#"><span aria-hidden="true">LV</span><span class="visually-hidden">Lena Vogt</span></a></li>
    <li><a class="av teal rounded-circle text-white fw-bold text-decoration-none" href="#"><span aria-hidden="true">OA</span><span class="visually-hidden">Omar Aziz</span></a></li>
    <li><a class="av rose rounded-circle text-white fw-bold text-decoration-none" href="#"><span aria-hidden="true">JP</span><span class="visually-hidden">June Park</span></a></li>
    <li><a class="av slate rounded-circle text-white fw-bold text-decoration-none" href="#"><span aria-hidden="true">TR</span><span class="visually-hidden">Tomás Ruiz</span></a></li>
    <li><a class="av amber rounded-circle text-white fw-bold text-decoration-none" href="#"><span aria-hidden="true">KM</span><span class="visually-hidden">Kai Moreno</span></a></li>
  </ul>
  <button class="btn add rounded-circle" type="button" aria-label="Add reviewer"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 3v10M3 8h10"/></svg></button>
</div></div>

<div><span class="lbl">Stacks in context · task card and reactions</span>
<div class="ctx">
  <article class="card task">
    <div class="card-body">
    <h3 class="m-0">Spring catalogue photo shoot</h3>
    <p class="mb-0">Studio B · shot list due Thursday</p>
    <div class="task-foot d-flex align-items-center justify-content-between">
      <ul class="stack tight list-unstyled d-flex align-items-center m-0" aria-label="Assignees">
        <li><span class="av sm rounded-circle" role="img" aria-label="Maya Chen"><svg viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" fill="#c7d2fe"/><path d="M10 64c2-11 11-16 22-16s20 5 22 16z" fill="#4f46e5"/><circle cx="32" cy="34" r="14" fill="#f6c9a4"/><path d="M17 33c0-11 6-18 15-18s15 7 15 18c-3-5-8-8-15-8s-12 3-15 8z" fill="#1e1b4b"/><circle cx="26.5" cy="36" r="1.8" fill="#1e1b4b"/><circle cx="37.5" cy="36" r="1.8" fill="#1e1b4b"/><path d="M28 41.5c2.4 2.2 5.6 2.2 8 0" fill="none" stroke="#1e1b4b" stroke-width="1.8" stroke-linecap="round"/></svg></span></li>
        <li><span class="av sm rounded-circle" role="img" aria-label="Kofi Mensah"><svg viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" fill="#fde68a"/><path d="M10 64c2-11 11-16 22-16s20 5 22 16z" fill="#0f766e"/><circle cx="32" cy="34" r="14" fill="#8d5a3b"/><path d="M18.5 31c1-8 6.5-12 13.5-12s12.5 4 13.5 12c-4-3-8.5-4-13.5-4s-9.5 1-13.5 4z" fill="#1c1917"/><circle cx="26.5" cy="35.5" r="1.8" fill="#1c1917"/><circle cx="37.5" cy="35.5" r="1.8" fill="#1c1917"/><path d="M27 41c2.8 2.6 7.2 2.6 10 0" fill="none" stroke="#1c1917" stroke-width="1.8" stroke-linecap="round"/></svg></span></li>
        <li><span class="av sm rounded-circle" role="img" aria-label="Sofia Lindqvist"><svg viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" fill="#bbf7d0"/><path d="M10 64c2-11 11-16 22-16s20 5 22 16z" fill="#c2410c"/><path d="M16 44V32c0-10 7-17 16-17s16 7 16 17v12z" fill="#ca8a04"/><circle cx="32" cy="34" r="13" fill="#f9d7b8"/><path d="M19 31c2-7 7-10 13-10s11 3 13 10c-5-2-9-6-13-6s-8 4-13 6z" fill="#ca8a04"/><circle cx="26.5" cy="36" r="3.6" fill="none" stroke="#14532d" stroke-width="1.5"/><circle cx="37.5" cy="36" r="3.6" fill="none" stroke="#14532d" stroke-width="1.5"/><path d="M30.1 36h3.8" stroke="#14532d" stroke-width="1.5"/><circle cx="26.5" cy="36" r="1.2" fill="#14532d"/><circle cx="37.5" cy="36" r="1.2" fill="#14532d"/><path d="M28.5 42c2 1.6 5 1.6 7 0" fill="none" stroke="#14532d" stroke-width="1.6" stroke-linecap="round"/></svg></span></li>
        <li><span class="av sm count rounded-circle fw-bold" role="img" aria-label="2 more assignees">+2</span></li>
      </ul>
      <span class="badge rounded-pill pill">Due 21 Mar</span>
    </div>
    </div>
  </article>
  <article class="card task">
    <div class="card-body">
    <h3 class="m-0">Release notes for version 4.2</h3>
    <p class="mb-0">Posted in #product by Rafael Ortiz</p>
    <div class="task-foot d-flex align-items-center justify-content-between">
      <div class="liked d-flex align-items-center"><span class="mini d-flex flex-shrink-0" aria-hidden="true"><span class="av xs rose rounded-circle text-white fw-bold">JP</span><span class="av xs teal rounded-circle text-white fw-bold">OA</span><span class="av xs rounded-circle text-white fw-bold">LV</span></span>
        <span>Liked by <b>June Park</b>, <b>Omar Aziz</b> and 23 others</span></div>
    </div>
    </div>
  </article>
</div></div>
CSS
/* Avatar groups on Bootstrap utilities, .card, .badge and a .dropdown-menu inside a native <details> for the "+5" overflow (no Bootstrap JS).
   Every avatar has a name in text (role="img" + aria-label, or .visually-hidden text in a link), never only a tooltip. */
.av{--av:40px;--a:#4f46e5;--b:#9333ea;--ring:#f8fafc;display:inline-grid;place-items:center;flex:none;width:var(--av);height:var(--av);
  background:linear-gradient(135deg,var(--a),var(--b));box-shadow:0 0 0 2.5px var(--ring);font-size:calc(var(--av) * .36);line-height:1;overflow:hidden}
.av svg{width:100%;height:100%}
.av.teal{--a:#0f766e;--b:#0369a1}.av.rose{--a:#c2410c;--b:#be185d}.av.slate{--a:#334155;--b:#475569}.av.green{--a:#047857;--b:#0e7490}.av.amber{--a:#b45309;--b:#c2410c}
.av.sm{--av:32px}.av.xs{--av:24px;font-size:.58rem}
.av.count{background:#e2e8f0;color:#1e293b!important;font-size:.8rem}
.stack>li+li{margin-left:-8px}
.stack.tight>li+li{margin-left:-6px}
.grp{gap:12px 16px}
.grp-name{font-size:.9rem;font-weight:700;color:#0f172a}
.grp-name small{margin-top:2px;font-size:.78rem;font-weight:500;color:#526072}
.more summary{list-style:none;cursor:pointer}
.more summary::-webkit-details-marker{display:none}
.more summary:hover .av{background:#cbd5e1}
.more summary:focus-visible{outline:2px solid #4f46e5;outline-offset:4px}
.more[open] summary .av{background:#1e293b;color:#fff!important}
.more-list{--bs-dropdown-min-width:220px;--bs-dropdown-padding-x:8px;--bs-dropdown-padding-y:8px;--bs-dropdown-border-color:#e2e8f0;--bs-dropdown-border-radius:14px;
  --bs-dropdown-item-padding-x:8px;--bs-dropdown-item-padding-y:6px;--bs-dropdown-color:#1e293b;top:calc(100% + 10px);left:0;box-shadow:0 18px 40px -18px rgba(15,23,42,.35)}
.more-list .dropdown-item-text{gap:10px;font-size:.85rem;font-weight:600}
.more-list .av{--ring:transparent}
.fan>li+li{margin-left:-10px;transition:margin-left .2s ease}
.fan:hover>li+li,.fan:focus-within>li+li{margin-left:4px}
.fan .av{transition:transform .2s ease}
.fan .av:hover{transform:translateY(-2px)}
.fan .av:focus-visible,.add:focus-visible{outline:2px solid #4f46e5;outline-offset:3px;box-shadow:0 0 0 2.5px var(--ring)}
.add{--bs-btn-padding-x:0;--bs-btn-padding-y:0;--bs-btn-color:#334155;--bs-btn-bg:#fff;--bs-btn-border-color:#64748b;--bs-btn-border-width:1.5px;
  --bs-btn-hover-color:#4338ca;--bs-btn-hover-bg:#fff;--bs-btn-hover-border-color:#4f46e5;--bs-btn-active-color:#4338ca;--bs-btn-active-bg:#eef2ff;--bs-btn-active-border-color:#4f46e5;
  display:grid;place-items:center;width:40px;height:40px;border-style:dashed;transition:border-color .15s,color .15s}
.add:focus-visible{box-shadow:none}
.add svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round}
.ctx{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px}
.task{--bs-card-spacer-y:18px;--bs-card-spacer-x:18px;--bs-card-border-color:#e2e8f0;--bs-card-border-radius:16px}
.task .av{--ring:#fff}
.task h3{font-size:.98rem;font-weight:700;color:#0f172a}
.task p{margin-top:4px;font-size:.82rem;color:#526072}
.task-foot{gap:12px;margin-top:16px;padding-top:14px;border-top:1px solid #f1f5f9}
.pill{--bs-badge-padding-x:9px;--bs-badge-padding-y:3px;--bs-badge-font-size:.72rem;--bs-badge-color:#92400e;background:#fef3c7;line-height:1.2}
.liked{gap:10px;font-size:.85rem;color:#334155;line-height:1.4}
.liked b{color:#0f172a}
.mini>*+*{margin-left:-6px}
@media (prefers-reduced-motion:reduce){.fan>li+li,.fan .av,.add{transition:none}.fan .av:hover{transform:none}}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#526072] uppercase">Overlapping stack · +5 opens the full list</span>
<div class="flex flex-wrap items-center gap-x-4 gap-y-3">
  <ul class="relative flex items-center [&>li+li]:-ml-2" aria-label="Checkout redesign team">
    <li><span class="inline-grid flex-none place-items-center overflow-hidden size-10 text-[14.4px] rounded-full bg-linear-135 from-[#4f46e5] to-[#9333ea] leading-none font-bold text-white shadow-[0_0_0_2.5px_#f8fafc]" role="img" aria-label="Lena Vogt">LV</span></li>
    <li><span class="inline-grid flex-none place-items-center overflow-hidden size-10 text-[14.4px] rounded-full bg-linear-135 from-[#0f766e] to-[#0369a1] leading-none font-bold text-white shadow-[0_0_0_2.5px_#f8fafc]" role="img" aria-label="Omar Aziz">OA</span></li>
    <li><span class="inline-grid flex-none place-items-center overflow-hidden size-10 text-[14.4px] rounded-full bg-linear-135 from-[#c2410c] to-[#be185d] leading-none font-bold text-white shadow-[0_0_0_2.5px_#f8fafc]" role="img" aria-label="June Park">JP</span></li>
    <li><span class="inline-grid flex-none place-items-center overflow-hidden size-10 text-[14.4px] rounded-full bg-linear-135 from-[#047857] to-[#0e7490] leading-none font-bold text-white shadow-[0_0_0_2.5px_#f8fafc]" role="img" aria-label="Ines Duarte">ID</span></li>
    <li>
      <details class="group">
        <summary class="cursor-pointer list-none rounded-full focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-[#4f46e5] [&::-webkit-details-marker]:hidden"><span class="inline-grid flex-none place-items-center size-10 rounded-full bg-[#e2e8f0] text-[.8rem] leading-none font-bold text-[#1e293b] shadow-[0_0_0_2.5px_#f8fafc] hover:bg-[#cbd5e1] group-open:bg-[#1e293b]! group-open:text-white" aria-hidden="true">+5</span><span class="sr-only">Show 5 more members</span></summary>
        <ul class="absolute top-[calc(100%+10px)] left-0 z-5 w-[220px] rounded-[14px] border border-[#e2e8f0] bg-white p-2 shadow-[0_18px_40px_-18px_rgba(15,23,42,.35)]">
          <li class="flex items-center gap-2.5 px-2 py-1.5 text-[.85rem] font-semibold text-[#1e293b]"><span class="inline-grid flex-none place-items-center overflow-hidden size-6 text-[.58rem] rounded-full bg-linear-135 from-[#334155] to-[#475569] leading-none font-bold text-white shadow-[0_0_0_2.5px_transparent]" aria-hidden="true">TR</span>Tomás Ruiz</li>
          <li class="flex items-center gap-2.5 px-2 py-1.5 text-[.85rem] font-semibold text-[#1e293b]"><span class="inline-grid flex-none place-items-center overflow-hidden size-6 text-[.58rem] rounded-full bg-linear-135 from-[#b45309] to-[#c2410c] leading-none font-bold text-white shadow-[0_0_0_2.5px_transparent]" aria-hidden="true">KM</span>Kai Moreno</li>
          <li class="flex items-center gap-2.5 px-2 py-1.5 text-[.85rem] font-semibold text-[#1e293b]"><span class="inline-grid flex-none place-items-center overflow-hidden size-6 text-[.58rem] rounded-full bg-linear-135 from-[#4f46e5] to-[#9333ea] leading-none font-bold text-white shadow-[0_0_0_2.5px_transparent]" aria-hidden="true">PN</span>Priya Nair</li>
          <li class="flex items-center gap-2.5 px-2 py-1.5 text-[.85rem] font-semibold text-[#1e293b]"><span class="inline-grid flex-none place-items-center overflow-hidden size-6 text-[.58rem] rounded-full bg-linear-135 from-[#0f766e] to-[#0369a1] leading-none font-bold text-white shadow-[0_0_0_2.5px_transparent]" aria-hidden="true">HS</span>Hana Sato</li>
          <li class="flex items-center gap-2.5 px-2 py-1.5 text-[.85rem] font-semibold text-[#1e293b]"><span class="inline-grid flex-none place-items-center overflow-hidden size-6 text-[.58rem] rounded-full bg-linear-135 from-[#c2410c] to-[#be185d] leading-none font-bold text-white shadow-[0_0_0_2.5px_transparent]" aria-hidden="true">FA</span>Femi Adeyemi</li>
        </ul>
      </details>
    </li>
  </ul>
  <p class="text-[.9rem] font-bold text-[#0f172a]">Checkout redesign<small class="mt-0.5 block text-[.78rem] font-medium text-[#526072]">9 members</small></p>
</div></div>

<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#526072] uppercase">Fan-out stack of profile links · spreads on hover and focus</span>
<div class="flex flex-wrap items-center gap-x-4 gap-y-3">
  <ul class="group/fan flex items-center" aria-label="Reviewers">
    <li><a class="inline-grid flex-none place-items-center overflow-hidden size-10 text-[14.4px] rounded-full bg-linear-135 from-[#4f46e5] to-[#9333ea] leading-none font-bold text-white shadow-[0_0_0_2.5px_#f8fafc] transition-transform duration-200 ease-in-out hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[#4f46e5] motion-reduce:transition-none motion-reduce:hover:translate-y-0" href="#"><span aria-hidden="true">LV</span><span class="sr-only">Lena Vogt</span></a></li>
    <li class="-ml-2.5 transition-[margin-left] duration-200 ease-in-out group-hover/fan:ml-1 group-focus-within/fan:ml-1 motion-reduce:transition-none"><a class="inline-grid flex-none place-items-center overflow-hidden size-10 text-[14.4px] rounded-full bg-linear-135 from-[#0f766e] to-[#0369a1] leading-none font-bold text-white shadow-[0_0_0_2.5px_#f8fafc] transition-transform duration-200 ease-in-out hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[#4f46e5] motion-reduce:transition-none motion-reduce:hover:translate-y-0" href="#"><span aria-hidden="true">OA</span><span class="sr-only">Omar Aziz</span></a></li>
    <li class="-ml-2.5 transition-[margin-left] duration-200 ease-in-out group-hover/fan:ml-1 group-focus-within/fan:ml-1 motion-reduce:transition-none"><a class="inline-grid flex-none place-items-center overflow-hidden size-10 text-[14.4px] rounded-full bg-linear-135 from-[#c2410c] to-[#be185d] leading-none font-bold text-white shadow-[0_0_0_2.5px_#f8fafc] transition-transform duration-200 ease-in-out hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[#4f46e5] motion-reduce:transition-none motion-reduce:hover:translate-y-0" href="#"><span aria-hidden="true">JP</span><span class="sr-only">June Park</span></a></li>
    <li class="-ml-2.5 transition-[margin-left] duration-200 ease-in-out group-hover/fan:ml-1 group-focus-within/fan:ml-1 motion-reduce:transition-none"><a class="inline-grid flex-none place-items-center overflow-hidden size-10 text-[14.4px] rounded-full bg-linear-135 from-[#334155] to-[#475569] leading-none font-bold text-white shadow-[0_0_0_2.5px_#f8fafc] transition-transform duration-200 ease-in-out hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[#4f46e5] motion-reduce:transition-none motion-reduce:hover:translate-y-0" href="#"><span aria-hidden="true">TR</span><span class="sr-only">Tomás Ruiz</span></a></li>
    <li class="-ml-2.5 transition-[margin-left] duration-200 ease-in-out group-hover/fan:ml-1 group-focus-within/fan:ml-1 motion-reduce:transition-none"><a class="inline-grid flex-none place-items-center overflow-hidden size-10 text-[14.4px] rounded-full bg-linear-135 from-[#b45309] to-[#c2410c] leading-none font-bold text-white shadow-[0_0_0_2.5px_#f8fafc] transition-transform duration-200 ease-in-out hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[#4f46e5] motion-reduce:transition-none motion-reduce:hover:translate-y-0" href="#"><span aria-hidden="true">KM</span><span class="sr-only">Kai Moreno</span></a></li>
  </ul>
  <button class="grid size-10 cursor-pointer place-items-center rounded-full border-[1.5px] border-dashed border-[#64748b] bg-white text-[#334155] transition-[border-color,color] duration-150 hover:border-[#4f46e5] hover:text-[#4338ca] focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[#4f46e5] motion-reduce:transition-none" type="button" aria-label="Add reviewer"><svg class="size-4" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M8 3v10M3 8h10"/></svg></button>
</div></div>

<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#526072] uppercase">Stacks in context · task card and reactions</span>
<div class="grid grid-cols-[repeat(auto-fit,minmax(260px,1fr))] gap-4">
  <article class="rounded-2xl border border-[#e2e8f0] bg-white p-[18px]">
    <h3 class="text-[.98rem] font-bold text-[#0f172a]">Spring catalogue photo shoot</h3>
    <p class="mt-1 text-[.82rem] text-[#526072]">Studio B · shot list due Thursday</p>
    <div class="mt-4 flex items-center justify-between gap-3 border-t border-[#f1f5f9] pt-3.5">
      <ul class="flex items-center [&>li+li]:-ml-1.5" aria-label="Assignees">
        <li><span class="inline-grid size-8 flex-none overflow-hidden rounded-full shadow-[0_0_0_2.5px_#fff]" role="img" aria-label="Maya Chen"><svg class="size-full" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" fill="#c7d2fe"/><path d="M10 64c2-11 11-16 22-16s20 5 22 16z" fill="#4f46e5"/><circle cx="32" cy="34" r="14" fill="#f6c9a4"/><path d="M17 33c0-11 6-18 15-18s15 7 15 18c-3-5-8-8-15-8s-12 3-15 8z" fill="#1e1b4b"/><circle cx="26.5" cy="36" r="1.8" fill="#1e1b4b"/><circle cx="37.5" cy="36" r="1.8" fill="#1e1b4b"/><path d="M28 41.5c2.4 2.2 5.6 2.2 8 0" fill="none" stroke="#1e1b4b" stroke-width="1.8" stroke-linecap="round"/></svg></span></li>
        <li><span class="inline-grid size-8 flex-none overflow-hidden rounded-full shadow-[0_0_0_2.5px_#fff]" role="img" aria-label="Kofi Mensah"><svg class="size-full" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" fill="#fde68a"/><path d="M10 64c2-11 11-16 22-16s20 5 22 16z" fill="#0f766e"/><circle cx="32" cy="34" r="14" fill="#8d5a3b"/><path d="M18.5 31c1-8 6.5-12 13.5-12s12.5 4 13.5 12c-4-3-8.5-4-13.5-4s-9.5 1-13.5 4z" fill="#1c1917"/><circle cx="26.5" cy="35.5" r="1.8" fill="#1c1917"/><circle cx="37.5" cy="35.5" r="1.8" fill="#1c1917"/><path d="M27 41c2.8 2.6 7.2 2.6 10 0" fill="none" stroke="#1c1917" stroke-width="1.8" stroke-linecap="round"/></svg></span></li>
        <li><span class="inline-grid size-8 flex-none overflow-hidden rounded-full shadow-[0_0_0_2.5px_#fff]" role="img" aria-label="Sofia Lindqvist"><svg class="size-full" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" fill="#bbf7d0"/><path d="M10 64c2-11 11-16 22-16s20 5 22 16z" fill="#c2410c"/><path d="M16 44V32c0-10 7-17 16-17s16 7 16 17v12z" fill="#ca8a04"/><circle cx="32" cy="34" r="13" fill="#f9d7b8"/><path d="M19 31c2-7 7-10 13-10s11 3 13 10c-5-2-9-6-13-6s-8 4-13 6z" fill="#ca8a04"/><circle cx="26.5" cy="36" r="3.6" fill="none" stroke="#14532d" stroke-width="1.5"/><circle cx="37.5" cy="36" r="3.6" fill="none" stroke="#14532d" stroke-width="1.5"/><path d="M30.1 36h3.8" stroke="#14532d" stroke-width="1.5"/><circle cx="26.5" cy="36" r="1.2" fill="#14532d"/><circle cx="37.5" cy="36" r="1.2" fill="#14532d"/><path d="M28.5 42c2 1.6 5 1.6 7 0" fill="none" stroke="#14532d" stroke-width="1.6" stroke-linecap="round"/></svg></span></li>
        <li><span class="inline-grid size-8 flex-none place-items-center rounded-full bg-[#e2e8f0] text-[.8rem] leading-none font-bold text-[#1e293b] shadow-[0_0_0_2.5px_#fff]" role="img" aria-label="2 more assignees">+2</span></li>
      </ul>
      <span class="rounded-full bg-[#fef3c7] px-[9px] py-[3px] text-[.72rem] leading-[1.2] font-bold text-[#92400e]">Due 21 Mar</span>
    </div>
  </article>
  <article class="rounded-2xl border border-[#e2e8f0] bg-white p-[18px]">
    <h3 class="text-[.98rem] font-bold text-[#0f172a]">Release notes for version 4.2</h3>
    <p class="mt-1 text-[.82rem] text-[#526072]">Posted in #product by Rafael Ortiz</p>
    <div class="mt-4 flex items-center justify-between gap-3 border-t border-[#f1f5f9] pt-3.5">
      <div class="flex items-center gap-2.5 text-[.85rem] leading-[1.4] text-[#334155]"><span class="flex flex-none [&>*+*]:-ml-1.5" aria-hidden="true"><span class="inline-grid flex-none place-items-center overflow-hidden size-6 text-[.58rem] rounded-full bg-linear-135 from-[#c2410c] to-[#be185d] leading-none font-bold text-white shadow-[0_0_0_2.5px_#fff]">JP</span><span class="inline-grid flex-none place-items-center overflow-hidden size-6 text-[.58rem] rounded-full bg-linear-135 from-[#0f766e] to-[#0369a1] leading-none font-bold text-white shadow-[0_0_0_2.5px_#fff]">OA</span><span class="inline-grid flex-none place-items-center overflow-hidden size-6 text-[.58rem] rounded-full bg-linear-135 from-[#4f46e5] to-[#9333ea] leading-none font-bold text-white shadow-[0_0_0_2.5px_#fff]">LV</span></span>
        <span>Liked by <b class="text-[#0f172a]">June Park</b>, <b class="text-[#0f172a]">Omar Aziz</b> and 23 others</span></div>
    </div>
  </article>
</div></div>

About this set

Ways to show a group of people in a small space. The overlapping stack shows four members of a project team and a +5 button; it is a native details and summary disclosure that opens a panel listing the five hidden names, so it works without JavaScript and every member can be reached. The fan-out stack is a row of profile links that spread apart when the pointer is over the group or a link in it has keyboard focus, followed by a dashed Add reviewer button. Two cards show stacks in context: a task card with three drawn faces and a +2 assignee count, and a post with a small reaction stack and the text Liked by June Park, Omar Aziz and 23 others. Use the disclosure stack where people need to see who is in a group, the fan-out stack where each avatar is a link, and the in-context patterns for cards and feeds. No avatar depends on a hover tooltip for its name: names are in aria-label, visually hidden link text or visible text.

What’s included

  • +5 overflow as a native details disclosure listing the hidden members
  • Fan-out stack of profile links that spreads on hover and focus
  • Dashed Add reviewer button with an accessible name
  • Task card with drawn faces and a +2 count named 2 more assignees
  • Liked by line that names people in visible text

Accessibility

Each stack is a list with an aria-label, and every avatar has a name without a tooltip: role="img" with aria-label, visually hidden link text, or visible text beside it. The +5 summary reads Show 5 more members and opens with Enter or Space. Links, the summary and the add button show a 2px indigo focus outline, and the fan-out and lift transitions switch off under prefers-reduced-motion.

Customise it

Overlap is the negative margin on .stack > li + li, the ring colour is --ring on .av and the size is --av. Bootstrap styles the overflow panel through --bs-dropdown-* variables on .dropdown-menu; in Tailwind change the -ml- utilities and the shadow ring colour.