Open demo

CSS code

HTML
<div class="duo">
<div><span class="lbl">Creator profile with tabs</span>
<article class="cr" aria-labelledby="cr-noor">
  <div class="cr-cover" aria-hidden="true"></div>
  <div class="cr-top">
    <span class="cr-av" aria-hidden="true"></span>
    <div class="cr-actions">
      <button class="cr-btn" type="button" aria-pressed="false" data-follow="cr-noor-count"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="off"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="on"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="sr-only"> Noor Haddad</span></button>
      <a class="cr-btn ghost" href="#">Message<span class="sr-only"> Noor Haddad</span></a>
    </div>
  </div>
  <div class="cr-id">
    <h2 class="cr-name" id="cr-noor">Noor Haddad</h2>
    <p class="cr-handle">@noorshoots35</p>
    <p class="cr-bio">Film photographer and darkroom teacher. Shooting 35mm along the Levant coast; print drops on the first of every month.</p>
    <dl class="cr-counts">
      <div><dt>posts</dt><dd>1,204</dd></div>
      <div><dt>followers</dt><dd id="cr-noor-count" data-count="48204">48,204</dd></div>
      <div><dt>following</dt><dd>312</dd></div>
    </dl>
  </div>
  <div class="cr-tabs" role="tablist" aria-label="Noor Haddad's profile">
    <button class="cr-tab" type="button" role="tab" id="cr-tab-posts" aria-controls="cr-posts" aria-selected="true">Posts</button>
    <button class="cr-tab" type="button" role="tab" id="cr-tab-about" aria-controls="cr-about" aria-selected="false" tabindex="-1">About</button>
  </div>
  <div class="cr-panel" id="cr-posts" role="tabpanel" aria-labelledby="cr-tab-posts">
    <ul class="cr-posts">
      <li><a href="#"><span>Harbour at 6 am</span></a></li>
      <li><a href="#"><span>Blue hour, Byblos</span></a></li>
      <li><a href="#"><span>Market light</span></a></li>
      <li><a href="#"><span>Cedars in fog</span></a></li>
      <li><a href="#"><span>Darkroom notes, part 4</span></a></li>
      <li><a href="#"><span>Portra 400 test roll</span></a></li>
    </ul>
  </div>
  <div class="cr-panel" id="cr-about" role="tabpanel" aria-labelledby="cr-tab-about">
    <dl class="cr-about">
      <dt>Based in</dt><dd>Beirut, Lebanon</dd>
      <dt>Joined</dt><dd>March 2019</dd>
      <dt>Shoots on</dt><dd>Leica M6, Kodak Portra 400</dd>
      <dt>Website</dt><dd><a href="#">noorhaddad.example</a></dd>
    </dl>
  </div>
</article></div>

<div><span class="lbl">Who to follow</span>
<section class="cr cr-list" aria-labelledby="cr-suggest">
  <h3 id="cr-suggest">Creators you might like</h3>
  <ul>
    <li><span class="cr-av a2" aria-hidden="true"></span><p class="cr-who"><b>Ilse Vermeer</b><span>@ilsedraws</span><span>21.4k followers</span></p>
      <button class="cr-btn" type="button" aria-pressed="false"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="off"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="on"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="sr-only"> Ilse Vermeer</span></button></li>
    <li><span class="cr-av a3" aria-hidden="true"></span><p class="cr-who"><b>Dami Adeyemi</b><span>@damicooks</span><span>96.1k followers</span></p>
      <button class="cr-btn" type="button" aria-pressed="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="off"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="on"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="sr-only"> Dami Adeyemi</span></button></li>
    <li><span class="cr-av a4" aria-hidden="true"></span><p class="cr-who"><b>Rafa Quintero</b><span>@rafaonbikes</span><span>8,730 followers</span></p>
      <button class="cr-btn" type="button" aria-pressed="false"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="off"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="on"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="sr-only"> Rafa Quintero</span></button></li>
  </ul>
</section></div>
</div>
CSS
/* Creator profile: counts in a <dl>, a Follow toggle button (aria-pressed) and Posts / About tabs (ARIA tabs with arrow keys). */
.cr{--cr-accent:#be185d;--cr-accent-dark:#9d174d;--cr-tint:#fce7f3;--cr-ink:#1f1630;--cr-muted:#5f5873;--cr-line:#ece6f2;--cr-edge:#8d84a3;
  background:#fff;color:var(--cr-ink);border:1px solid var(--cr-line);border-radius:24px;overflow:hidden;box-shadow:0 30px 60px -40px rgba(31,22,48,.45)}
.cr :where(h2,h3,p,dl,dd,ul){margin:0;padding:0}
.cr-cover{height:140px;background:radial-gradient(circle at 18% 30%,#f9a8d4 0,transparent 42%),radial-gradient(circle at 72% 20%,#c4b5fd 0,transparent 45%),radial-gradient(circle at 60% 90%,#fdba74 0,transparent 40%),linear-gradient(135deg,#fbcfe8,#ddd6fe)}
.cr-top{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;padding:0 24px;margin-top:-48px}
.cr-av{flex:none;width:100px;height:100px;border:5px solid #fff;border-radius:50%;
  background:radial-gradient(circle at 32% 30%,#fde68a 0,transparent 38%),conic-gradient(from 210deg,#be185d,#7c3aed,#0ea5e9,#f59e0b,#be185d)}
.cr-actions{display:flex;gap:8px;padding-bottom:4px}
.cr-btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:10px 18px;border:1.5px solid var(--cr-accent);border-radius:999px;background:var(--cr-accent);color:#fff;
  font:inherit;font-size:.92rem;font-weight:700;line-height:1.2;text-decoration:none;cursor:pointer;transition:background-color .2s,color .2s,border-color .2s}
.cr-btn:hover{background:var(--cr-accent-dark);border-color:var(--cr-accent-dark)}
.cr-btn svg{width:16px;height:16px}
.cr-btn .on,.cr-btn[aria-pressed=true] .off{display:none}
.cr-btn[aria-pressed=true] .on{display:block}
.cr-btn[aria-pressed=true]{background:var(--cr-tint);color:var(--cr-accent-dark);border-color:var(--cr-accent)}
.cr-btn.ghost{background:transparent;color:var(--cr-ink);border-color:var(--cr-edge)}
.cr-btn.ghost:hover{background:#f6f3fa}
.cr-btn:focus-visible{outline:3px solid var(--cr-accent);outline-offset:3px}
.cr-id{padding:14px 24px 0}
.cr-name{font-size:1.4rem;font-weight:800;letter-spacing:-.02em}
.cr-handle{margin-top:2px;font-size:.92rem;color:var(--cr-muted)}
.cr-bio{margin-top:12px;font-size:.95rem;line-height:1.55}
.cr-counts{display:flex;flex-wrap:wrap;gap:6px 22px;margin-top:16px}
.cr-counts div{display:flex;flex-direction:row-reverse;align-items:baseline;gap:5px}
.cr-counts dd{font-weight:800;font-variant-numeric:tabular-nums}
.cr-counts dt{font-size:.9rem;color:var(--cr-muted)}
.cr-tabs{display:flex;gap:4px;margin-top:20px;padding:0 24px;border-bottom:1px solid var(--cr-line)}
.cr-tab{position:relative;padding:12px 14px;border:0;background:none;color:var(--cr-muted);font:inherit;font-size:.92rem;font-weight:700;cursor:pointer}
.cr-tab::after{content:"";position:absolute;left:10px;right:10px;bottom:-1px;height:3px;border-radius:3px 3px 0 0;background:transparent;transition:background-color .2s}
.cr-tab[aria-selected=true]{color:var(--cr-ink)}
.cr-tab[aria-selected=true]::after{background:var(--cr-accent)}
.cr-tab:hover{color:var(--cr-ink)}
.cr-tab:focus-visible{outline:3px solid var(--cr-accent);outline-offset:-3px;border-radius:10px}
.cr-panel{padding:20px 24px 24px}
.cr-posts{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;list-style:none}
.cr-posts a{position:relative;display:flex;align-items:flex-end;aspect-ratio:4/3;padding:10px;border-radius:14px;overflow:hidden;color:#fff;font-size:.78rem;font-weight:700;line-height:1.25;text-decoration:none}
.cr-posts a::before{content:"";position:absolute;inset:0;background:linear-gradient(transparent 35%,rgba(20,12,32,.82));z-index:0}
.cr-posts a span{position:relative}
.cr-posts a:focus-visible{outline:3px solid var(--cr-accent);outline-offset:3px}
.cr-posts li:nth-child(1) a{background:linear-gradient(160deg,#fda4af,#7c2d12)}
.cr-posts li:nth-child(2) a{background:linear-gradient(160deg,#93c5fd,#1e3a8a)}
.cr-posts li:nth-child(3) a{background:linear-gradient(160deg,#fde68a,#9a3412)}
.cr-posts li:nth-child(4) a{background:linear-gradient(160deg,#a7f3d0,#065f46)}
.cr-posts li:nth-child(5) a{background:linear-gradient(160deg,#ddd6fe,#4c1d95)}
.cr-posts li:nth-child(6) a{background:linear-gradient(160deg,#fbcfe8,#831843)}
.cr-about{display:grid;grid-template-columns:auto 1fr;gap:10px 20px;font-size:.92rem}
.cr-about dt{color:var(--cr-muted)}
.cr-about dd{font-weight:600}
.cr-about a{color:var(--cr-accent);text-underline-offset:3px}
.cr-about a:focus-visible{outline:3px solid var(--cr-accent);outline-offset:2px;border-radius:3px}
/* "who to follow" list */
.cr-list{padding:20px 22px 8px}
.cr-list h3{font-size:1.05rem;font-weight:800}
.cr-list ul{list-style:none;margin-top:8px}
.cr-list li{display:flex;align-items:center;gap:12px;padding:12px 0;border-top:1px solid var(--cr-line)}
.cr-list li:first-child{border-top:0}
.cr-list .cr-av{width:46px;height:46px;border-width:0}
.cr-who{flex:1;min-width:0}
.cr-who b{display:block;font-size:.95rem}
.cr-who span{display:block;margin-top:2px;font-size:.82rem;color:var(--cr-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cr-list .cr-btn{padding:8px 14px;font-size:.85rem}
.cr-av.a2{background:radial-gradient(circle at 70% 28%,#a5f3fc 0,transparent 40%),conic-gradient(from 90deg,#0f766e,#22c55e,#facc15,#0f766e)}
.cr-av.a3{background:radial-gradient(circle at 30% 70%,#fecaca 0,transparent 40%),linear-gradient(135deg,#f97316,#db2777 60%,#6d28d9)}
.cr-av.a4{background:radial-gradient(circle at 60% 35%,#e0e7ff 0,transparent 35%),conic-gradient(from 0deg,#1e3a8a,#6366f1,#22d3ee,#1e3a8a)}
.cr .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}
@media (max-width:480px){.cr-top{flex-wrap:wrap}.cr-actions{order:2;width:100%;padding-top:12px}.cr-actions .cr-btn{flex:1}}
@media (prefers-reduced-motion:reduce){.cr-btn,.cr-tab::after{transition:none}}
JavaScript
/* Follow toggles: flip aria-pressed and, when the button names a counter (data-follow="id"), add one follower.
   Tabs: click or arrow keys / Home / End move between tabs; inactive panels are hidden only once this runs,
   so without JavaScript both panels show one after the other. */
document.querySelectorAll('.cr-btn[aria-pressed]').forEach(function (btn) {
  btn.addEventListener('click', function () {
    var on = btn.getAttribute('aria-pressed') !== 'true';
    btn.setAttribute('aria-pressed', String(on));
    var count = btn.dataset.follow && document.getElementById(btn.dataset.follow);
    if (count) count.textContent = (Number(count.dataset.count) + (on ? 1 : 0)).toLocaleString('en-US');
  });
});
document.querySelectorAll('.cr [role=tablist]').forEach(function (list) {
  var tabs = Array.prototype.slice.call(list.querySelectorAll('[role=tab]'));
  function select(tab, focus) {
    tabs.forEach(function (t) {
      var on = t === tab;
      t.setAttribute('aria-selected', String(on));
      t.tabIndex = on ? 0 : -1;
      document.getElementById(t.getAttribute('aria-controls')).hidden = !on;
    });
    if (focus) tab.focus();
  }
  list.addEventListener('click', function (e) { var t = e.target.closest('[role=tab]'); if (t) select(t); });
  list.addEventListener('keydown', function (e) {
    var i = tabs.indexOf(document.activeElement);
    var next = { ArrowRight: i + 1, ArrowLeft: i - 1, Home: 0, End: tabs.length - 1 }[e.key];
    if (i < 0 || next === undefined) return;
    e.preventDefault();
    select(tabs[(next + tabs.length) % tabs.length], true);
  });
  select(tabs.filter(function (t) { return t.getAttribute('aria-selected') === 'true'; })[0] || tabs[0]);
});

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS, Bootstrap 5.3.8 JS bundle

HTML
<div class="duo">
<div><span class="lbl">Creator profile with tabs</span>
<article class="card cr" aria-labelledby="cr-noor">
  <div class="cr-cover" aria-hidden="true"></div>
  <div class="cr-top d-flex align-items-end justify-content-between">
    <span class="cr-av rounded-circle" aria-hidden="true"></span>
    <div class="cr-actions d-flex gap-2">
      <button class="btn btn-primary" type="button" data-bs-toggle="button" aria-pressed="false" data-follow="cr-noor-count"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="off"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="on"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="visually-hidden"> Noor Haddad</span></button>
      <a class="btn btn-outline-secondary" href="#">Message<span class="visually-hidden"> Noor Haddad</span></a>
    </div>
  </div>
  <div class="cr-id">
    <h2 class="cr-name" id="cr-noor">Noor Haddad</h2>
    <p class="cr-handle">@noorshoots35</p>
    <p class="cr-bio">Film photographer and darkroom teacher. Shooting 35mm along the Levant coast; print drops on the first of every month.</p>
    <dl class="cr-counts d-flex flex-wrap">
      <div class="d-flex flex-row-reverse align-items-baseline gap-1"><dt>posts</dt><dd>1,204</dd></div>
      <div class="d-flex flex-row-reverse align-items-baseline gap-1"><dt>followers</dt><dd id="cr-noor-count" data-count="48204">48,204</dd></div>
      <div class="d-flex flex-row-reverse align-items-baseline gap-1"><dt>following</dt><dd>312</dd></div>
    </dl>
  </div>
  <ul class="nav nav-underline" role="tablist" aria-label="Noor Haddad's profile">
    <li class="nav-item" role="presentation"><button class="nav-link active" id="cr-tab-posts" data-bs-toggle="tab" data-bs-target="#cr-posts" type="button" role="tab" aria-controls="cr-posts" aria-selected="true">Posts</button></li>
    <li class="nav-item" role="presentation"><button class="nav-link" id="cr-tab-about" data-bs-toggle="tab" data-bs-target="#cr-about" type="button" role="tab" aria-controls="cr-about" aria-selected="false" tabindex="-1">About</button></li>
  </ul>
  <div class="tab-content">
    <div class="cr-panel tab-pane fade show active" id="cr-posts" role="tabpanel" aria-labelledby="cr-tab-posts">
      <ul class="cr-posts list-unstyled">
        <li><a href="#"><span>Harbour at 6 am</span></a></li>
        <li><a href="#"><span>Blue hour, Byblos</span></a></li>
        <li><a href="#"><span>Market light</span></a></li>
        <li><a href="#"><span>Cedars in fog</span></a></li>
        <li><a href="#"><span>Darkroom notes, part 4</span></a></li>
        <li><a href="#"><span>Portra 400 test roll</span></a></li>
      </ul>
    </div>
    <div class="cr-panel tab-pane fade" id="cr-about" role="tabpanel" aria-labelledby="cr-tab-about">
      <dl class="cr-about">
        <dt>Based in</dt><dd>Beirut, Lebanon</dd>
        <dt>Joined</dt><dd>March 2019</dd>
        <dt>Shoots on</dt><dd>Leica M6, Kodak Portra 400</dd>
        <dt>Website</dt><dd><a href="#">noorhaddad.example</a></dd>
      </dl>
    </div>
  </div>
</article></div>

<div><span class="lbl">Who to follow</span>
<section class="card cr cr-list" aria-labelledby="cr-suggest">
  <div class="card-body">
  <h3 id="cr-suggest">Creators you might like</h3>
  <ul class="list-group list-group-flush">
    <li class="list-group-item d-flex align-items-center gap-3"><span class="cr-av a2 rounded-circle" aria-hidden="true"></span><p class="cr-who"><b>Ilse Vermeer</b><span>@ilsedraws</span><span>21.4k followers</span></p>
      <button class="btn btn-primary" type="button" data-bs-toggle="button" aria-pressed="false"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="off"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="on"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="visually-hidden"> Ilse Vermeer</span></button></li>
    <li class="list-group-item d-flex align-items-center gap-3"><span class="cr-av a3 rounded-circle" aria-hidden="true"></span><p class="cr-who"><b>Dami Adeyemi</b><span>@damicooks</span><span>96.1k followers</span></p>
      <button class="btn btn-primary active" type="button" data-bs-toggle="button" aria-pressed="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="off"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="on"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="visually-hidden"> Dami Adeyemi</span></button></li>
    <li class="list-group-item d-flex align-items-center gap-3"><span class="cr-av a4 rounded-circle" aria-hidden="true"></span><p class="cr-who"><b>Rafa Quintero</b><span>@rafaonbikes</span><span>8,730 followers</span></p>
      <button class="btn btn-primary" type="button" data-bs-toggle="button" aria-pressed="false"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="off"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="on"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="visually-hidden"> Rafa Quintero</span></button></li>
  </ul>
  </div>
</section></div>
</div>
CSS
/* Creator profile on Bootstrap .card, .nav-underline tabs (Bootstrap's tab plugin) and .btn with data-bs-toggle="button" for Follow. */
.cr{--cr-accent:#be185d;--cr-accent-dark:#9d174d;--cr-tint:#fce7f3;--cr-ink:#1f1630;--cr-muted:#5f5873;--cr-line:#ece6f2;--cr-edge:#8d84a3;
  --bs-card-border-color:var(--cr-line);--bs-card-border-radius:24px;--bs-card-inner-border-radius:23px;--bs-card-color:var(--cr-ink);overflow:hidden;box-shadow:0 30px 60px -40px rgba(31,22,48,.45)}
.cr :where(h2,h3,p,dl,dd,dt,ul){margin:0}
.cr-cover{height:140px;background:radial-gradient(circle at 18% 30%,#f9a8d4 0,transparent 42%),radial-gradient(circle at 72% 20%,#c4b5fd 0,transparent 45%),radial-gradient(circle at 60% 90%,#fdba74 0,transparent 40%),linear-gradient(135deg,#fbcfe8,#ddd6fe)}
.cr-top{gap:12px;padding:0 24px;margin-top:-48px}
.cr-av{flex:none;width:100px;height:100px;border:5px solid #fff;
  background:radial-gradient(circle at 32% 30%,#fde68a 0,transparent 38%),conic-gradient(from 210deg,#be185d,#7c3aed,#0ea5e9,#f59e0b,#be185d)}
.cr-actions{padding-bottom:4px}
.cr .btn{--bs-btn-padding-x:18px;--bs-btn-padding-y:10px;--bs-btn-font-size:.92rem;--bs-btn-font-weight:700;--bs-btn-line-height:1.2;--bs-btn-border-width:1.5px;--bs-btn-border-radius:999px;--bs-btn-focus-box-shadow:none;
  display:inline-flex;align-items:center;justify-content:center;gap:7px;transition:background-color .2s,color .2s,border-color .2s}
.cr .btn-primary{--bs-btn-bg:var(--cr-accent);--bs-btn-border-color:var(--cr-accent);--bs-btn-hover-bg:var(--cr-accent-dark);--bs-btn-hover-border-color:var(--cr-accent-dark);
  --bs-btn-active-bg:var(--cr-tint);--bs-btn-active-color:var(--cr-accent-dark);--bs-btn-active-border-color:var(--cr-accent)}
.cr .btn-outline-secondary{--bs-btn-color:var(--cr-ink);--bs-btn-border-color:var(--cr-edge);--bs-btn-hover-color:var(--cr-ink);--bs-btn-hover-bg:#f6f3fa;--bs-btn-hover-border-color:var(--cr-edge);--bs-btn-active-color:var(--cr-ink);--bs-btn-active-bg:#efe9f5;--bs-btn-active-border-color:var(--cr-edge)}
.cr .btn svg{width:16px;height:16px}
.cr .btn .on,.cr .btn.active .off{display:none}
.cr .btn.active .on{display:block}
.cr .btn:focus-visible{outline:3px solid var(--cr-accent);outline-offset:3px}
.cr-id{padding:14px 24px 0}
.cr .cr-name{font-size:1.4rem;font-weight:800;letter-spacing:-.02em;line-height:normal}
.cr-handle{margin-top:2px;font-size:.92rem;color:var(--cr-muted)}
.cr .cr-bio{margin-top:12px;font-size:.95rem;line-height:1.55}
.cr-counts{gap:6px 22px;margin-top:16px}
.cr-counts dd{font-weight:800;font-variant-numeric:tabular-nums}
.cr-counts dt{font-size:.9rem;font-weight:400;color:var(--cr-muted)}
.cr .nav-underline{--bs-nav-underline-gap:4px;--bs-nav-underline-border-width:3px;--bs-nav-underline-link-active-color:var(--cr-ink);--bs-nav-link-color:var(--cr-muted);--bs-nav-link-hover-color:var(--cr-ink);
  --bs-nav-link-font-size:.92rem;--bs-nav-link-font-weight:700;--bs-nav-link-padding-x:14px;--bs-nav-link-padding-y:12px;margin-top:20px;padding:0 24px;border-bottom:1px solid var(--cr-line)}
.cr .nav-underline .nav-link{position:relative;padding:12px 14px;border:0;border-radius:0;line-height:normal}
.cr .nav-underline .nav-link::after{content:"";position:absolute;left:10px;right:10px;bottom:-1px;height:3px;border-radius:3px 3px 0 0;background:transparent;transition:background-color .2s}
.cr .nav-underline .nav-link.active::after{background:var(--cr-accent)}
.cr .nav-link:focus-visible{outline:3px solid var(--cr-accent);outline-offset:-3px;border-radius:10px;box-shadow:none}
.cr-panel{padding:20px 24px 24px}
.cr-posts{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.cr-posts a{position:relative;display:flex;align-items:flex-end;aspect-ratio:4/3;padding:10px;border-radius:14px;overflow:hidden;color:#fff;font-size:.78rem;font-weight:700;line-height:1.25;text-decoration:none}
.cr-posts a::before{content:"";position:absolute;inset:0;background:linear-gradient(transparent 35%,rgba(20,12,32,.82))}
.cr-posts a span{position:relative}
.cr-posts a:focus-visible{outline:3px solid var(--cr-accent);outline-offset:3px}
.cr-posts li:nth-child(1) a{background:linear-gradient(160deg,#fda4af,#7c2d12)}
.cr-posts li:nth-child(2) a{background:linear-gradient(160deg,#93c5fd,#1e3a8a)}
.cr-posts li:nth-child(3) a{background:linear-gradient(160deg,#fde68a,#9a3412)}
.cr-posts li:nth-child(4) a{background:linear-gradient(160deg,#a7f3d0,#065f46)}
.cr-posts li:nth-child(5) a{background:linear-gradient(160deg,#ddd6fe,#4c1d95)}
.cr-posts li:nth-child(6) a{background:linear-gradient(160deg,#fbcfe8,#831843)}
.cr-about{display:grid;grid-template-columns:auto 1fr;gap:10px 20px;font-size:.92rem}
.cr-about dt{font-weight:400;color:var(--cr-muted)}
.cr-about dd{font-weight:600}
.cr-about a{color:var(--cr-accent);text-underline-offset:3px}
.cr-about a:focus-visible{outline:3px solid var(--cr-accent);outline-offset:2px;border-radius:3px}
/* who to follow */
.cr-list .card-body{padding:20px 22px 8px}
.cr-list h3{font-size:1.05rem;font-weight:800;line-height:normal}
.cr-list .list-group{--bs-list-group-border-color:var(--cr-line);--bs-list-group-item-padding-x:0;--bs-list-group-item-padding-y:12px;--bs-list-group-color:var(--cr-ink);margin-top:8px}
.cr-list .cr-av{width:46px;height:46px;border-width:0}
.cr-who{flex:1;min-width:0}
.cr-who b{display:block;font-size:.95rem}
.cr-who span{display:block;margin-top:2px;font-size:.82rem;color:var(--cr-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cr-list .btn{--bs-btn-padding-x:14px;--bs-btn-padding-y:8px;--bs-btn-font-size:.85rem}
.cr-av.a2{background:radial-gradient(circle at 70% 28%,#a5f3fc 0,transparent 40%),conic-gradient(from 90deg,#0f766e,#22c55e,#facc15,#0f766e)}
.cr-av.a3{background:radial-gradient(circle at 30% 70%,#fecaca 0,transparent 40%),linear-gradient(135deg,#f97316,#db2777 60%,#6d28d9)}
.cr-av.a4{background:radial-gradient(circle at 60% 35%,#e0e7ff 0,transparent 35%),conic-gradient(from 0deg,#1e3a8a,#6366f1,#22d3ee,#1e3a8a)}
@media (max-width:480px){.cr-top{flex-wrap:wrap}.cr-actions{order:2;width:100%;padding-top:12px}.cr-actions .btn{flex:1}}
@media (prefers-reduced-motion:reduce){.cr .btn,.cr .nav-link,.cr .nav-link::after,.cr .fade{transition:none}}
JavaScript
/* Bootstrap's button plugin flips .active and aria-pressed on Follow, and its tab plugin runs the tabs (arrow keys included).
   This listener runs after Bootstrap's and adds one follower to the counter a button names with data-follow="id". */
document.addEventListener('click', function (e) {
  var btn = e.target.closest('[data-follow]');
  if (!btn) return;
  var count = document.getElementById(btn.dataset.follow);
  var on = btn.getAttribute('aria-pressed') === 'true';
  if (count) count.textContent = (Number(count.dataset.count) + (on ? 1 : 0)).toLocaleString('en-US');
});

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div class="flex flex-wrap items-start gap-x-7 gap-y-14">
<div class="min-w-0 flex-[1_1_540px]"><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#5f5873] uppercase">Creator profile with tabs</span>
<article class="overflow-hidden rounded-3xl border border-[#ece6f2] bg-white text-[#1f1630] shadow-[0_30px_60px_-40px_rgba(31,22,48,.45)]" aria-labelledby="cr-noor">
  <div class="h-[140px] bg-[radial-gradient(circle_at_18%_30%,#f9a8d4_0,transparent_42%),radial-gradient(circle_at_72%_20%,#c4b5fd_0,transparent_45%),radial-gradient(circle_at_60%_90%,#fdba74_0,transparent_40%),linear-gradient(135deg,#fbcfe8,#ddd6fe)]" aria-hidden="true"></div>
  <div class="-mt-12 flex items-end justify-between gap-3 px-6 max-[480px]:flex-wrap">
    <span class="size-[100px] flex-none rounded-full border-[5px] border-white bg-[radial-gradient(circle_at_32%_30%,#fde68a_0,transparent_38%),conic-gradient(from_210deg,#be185d,#7c3aed,#0ea5e9,#f59e0b,#be185d)]" aria-hidden="true"></span>
    <div class="flex gap-2 pb-1 max-[480px]:order-2 max-[480px]:w-full max-[480px]:pt-3">
      <button class="group inline-flex cursor-pointer items-center justify-center gap-[7px] rounded-full border-[1.5px] border-[#be185d] bg-[#be185d] px-[18px] py-2.5 text-[.92rem] leading-[1.2] font-bold text-white transition-[color,background-color,border-color] duration-200 hover:border-[#9d174d] hover:bg-[#9d174d] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d] aria-pressed:border-[#be185d] aria-pressed:bg-[#fce7f3] aria-pressed:text-[#9d174d] motion-reduce:transition-none max-[480px]:flex-1" type="button" aria-pressed="false" data-follow="cr-noor-count"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="size-4 group-aria-pressed:hidden"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="hidden size-4 group-aria-pressed:block"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="sr-only"> Noor Haddad</span></button>
      <a class="inline-flex items-center justify-center rounded-full border-[1.5px] border-[#8d84a3] px-[18px] py-2.5 text-[.92rem] leading-[1.2] font-bold text-[#1f1630] no-underline transition-[color,background-color,border-color] duration-200 hover:bg-[#f6f3fa] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d] motion-reduce:transition-none max-[480px]:flex-1" href="#">Message<span class="sr-only"> Noor Haddad</span></a>
    </div>
  </div>
  <div class="px-6 pt-3.5">
    <h2 class="text-[1.4rem] font-extrabold tracking-[-.02em]" id="cr-noor">Noor Haddad</h2>
    <p class="mt-0.5 text-[.92rem] text-[#5f5873]">@noorshoots35</p>
    <p class="mt-3 text-[.95rem] leading-[1.55]">Film photographer and darkroom teacher. Shooting 35mm along the Levant coast; print drops on the first of every month.</p>
    <dl class="mt-4 flex flex-wrap gap-x-[22px] gap-y-1.5">
      <div class="flex flex-row-reverse items-baseline gap-[5px]"><dt class="text-[.9rem] text-[#5f5873]">posts</dt><dd class="font-extrabold tabular-nums">1,204</dd></div>
      <div class="flex flex-row-reverse items-baseline gap-[5px]"><dt class="text-[.9rem] text-[#5f5873]">followers</dt><dd class="font-extrabold tabular-nums" id="cr-noor-count" data-count="48204">48,204</dd></div>
      <div class="flex flex-row-reverse items-baseline gap-[5px]"><dt class="text-[.9rem] text-[#5f5873]">following</dt><dd class="font-extrabold tabular-nums">312</dd></div>
    </dl>
  </div>
  <div class="mt-5 flex gap-1 border-b border-[#ece6f2] px-6" role="tablist" aria-label="Noor Haddad's profile">
    <button class="relative cursor-pointer px-3.5 py-3 text-[.92rem] font-bold text-[#5f5873] after:absolute after:inset-x-2.5 after:-bottom-px after:h-[3px] after:rounded-t-[3px] after:transition-[color,background-color,border-color] after:duration-200 hover:text-[#1f1630] focus-visible:rounded-[10px] focus-visible:outline-3 focus-visible:-outline-offset-3 focus-visible:outline-[#be185d] aria-selected:text-[#1f1630] aria-selected:after:bg-[#be185d] motion-reduce:after:transition-none" type="button" role="tab" id="cr-tab-posts" aria-controls="cr-posts" aria-selected="true">Posts</button>
    <button class="relative cursor-pointer px-3.5 py-3 text-[.92rem] font-bold text-[#5f5873] after:absolute after:inset-x-2.5 after:-bottom-px after:h-[3px] after:rounded-t-[3px] after:transition-[color,background-color,border-color] after:duration-200 hover:text-[#1f1630] focus-visible:rounded-[10px] focus-visible:outline-3 focus-visible:-outline-offset-3 focus-visible:outline-[#be185d] aria-selected:text-[#1f1630] aria-selected:after:bg-[#be185d] motion-reduce:after:transition-none" type="button" role="tab" id="cr-tab-about" aria-controls="cr-about" aria-selected="false" tabindex="-1">About</button>
  </div>
  <div class="px-6 pt-5 pb-6" id="cr-posts" role="tabpanel" aria-labelledby="cr-tab-posts">
    <ul class="grid grid-cols-3 gap-2">
      <li><a class="relative flex aspect-[4/3] items-end overflow-hidden rounded-[14px] bg-[linear-gradient(160deg,#fda4af,#7c2d12)] p-2.5 text-[.78rem] leading-[1.25] font-bold text-white no-underline before:absolute before:inset-0 before:bg-[linear-gradient(transparent_35%,rgba(20,12,32,.82))] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d]" href="#"><span class="relative">Harbour at 6 am</span></a></li>
      <li><a class="relative flex aspect-[4/3] items-end overflow-hidden rounded-[14px] bg-[linear-gradient(160deg,#93c5fd,#1e3a8a)] p-2.5 text-[.78rem] leading-[1.25] font-bold text-white no-underline before:absolute before:inset-0 before:bg-[linear-gradient(transparent_35%,rgba(20,12,32,.82))] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d]" href="#"><span class="relative">Blue hour, Byblos</span></a></li>
      <li><a class="relative flex aspect-[4/3] items-end overflow-hidden rounded-[14px] bg-[linear-gradient(160deg,#fde68a,#9a3412)] p-2.5 text-[.78rem] leading-[1.25] font-bold text-white no-underline before:absolute before:inset-0 before:bg-[linear-gradient(transparent_35%,rgba(20,12,32,.82))] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d]" href="#"><span class="relative">Market light</span></a></li>
      <li><a class="relative flex aspect-[4/3] items-end overflow-hidden rounded-[14px] bg-[linear-gradient(160deg,#a7f3d0,#065f46)] p-2.5 text-[.78rem] leading-[1.25] font-bold text-white no-underline before:absolute before:inset-0 before:bg-[linear-gradient(transparent_35%,rgba(20,12,32,.82))] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d]" href="#"><span class="relative">Cedars in fog</span></a></li>
      <li><a class="relative flex aspect-[4/3] items-end overflow-hidden rounded-[14px] bg-[linear-gradient(160deg,#ddd6fe,#4c1d95)] p-2.5 text-[.78rem] leading-[1.25] font-bold text-white no-underline before:absolute before:inset-0 before:bg-[linear-gradient(transparent_35%,rgba(20,12,32,.82))] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d]" href="#"><span class="relative">Darkroom notes, part 4</span></a></li>
      <li><a class="relative flex aspect-[4/3] items-end overflow-hidden rounded-[14px] bg-[linear-gradient(160deg,#fbcfe8,#831843)] p-2.5 text-[.78rem] leading-[1.25] font-bold text-white no-underline before:absolute before:inset-0 before:bg-[linear-gradient(transparent_35%,rgba(20,12,32,.82))] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d]" href="#"><span class="relative">Portra 400 test roll</span></a></li>
    </ul>
  </div>
  <div class="px-6 pt-5 pb-6" id="cr-about" role="tabpanel" aria-labelledby="cr-tab-about">
    <dl class="grid grid-cols-[auto_1fr] gap-x-5 gap-y-2.5 text-[.92rem]">
      <dt class="text-[#5f5873]">Based in</dt><dd class="font-semibold">Beirut, Lebanon</dd>
      <dt class="text-[#5f5873]">Joined</dt><dd class="font-semibold">March 2019</dd>
      <dt class="text-[#5f5873]">Shoots on</dt><dd class="font-semibold">Leica M6, Kodak Portra 400</dd>
      <dt class="text-[#5f5873]">Website</dt><dd class="font-semibold"><a class="rounded-[3px] text-[#be185d] underline underline-offset-3 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-[#be185d]" href="#">noorhaddad.example</a></dd>
    </dl>
  </div>
</article></div>

<div class="min-w-0 flex-[1_1_300px]"><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#5f5873] uppercase">Who to follow</span>
<section class="overflow-hidden rounded-3xl border border-[#ece6f2] bg-white px-[22px] pt-5 pb-2 text-[#1f1630] shadow-[0_30px_60px_-40px_rgba(31,22,48,.45)]" aria-labelledby="cr-suggest">
  <h3 class="text-[1.05rem] font-extrabold" id="cr-suggest">Creators you might like</h3>
  <ul class="mt-2 divide-y divide-[#ece6f2]">
    <li class="flex items-center gap-3 py-3"><span class="size-[46px] flex-none rounded-full bg-[radial-gradient(circle_at_70%_28%,#a5f3fc_0,transparent_40%),conic-gradient(from_90deg,#0f766e,#22c55e,#facc15,#0f766e)]" aria-hidden="true"></span><p class="min-w-0 flex-1"><b class="block text-[.95rem]">Ilse Vermeer</b><span class="mt-0.5 block truncate text-[.82rem] text-[#5f5873]">@ilsedraws</span><span class="mt-0.5 block truncate text-[.82rem] text-[#5f5873]">21.4k followers</span></p>
      <button class="group inline-flex cursor-pointer items-center justify-center gap-[7px] rounded-full border-[1.5px] border-[#be185d] bg-[#be185d] px-3.5 py-2 text-[.85rem] leading-[1.2] font-bold text-white transition-[color,background-color,border-color] duration-200 hover:border-[#9d174d] hover:bg-[#9d174d] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d] aria-pressed:border-[#be185d] aria-pressed:bg-[#fce7f3] aria-pressed:text-[#9d174d] motion-reduce:transition-none" type="button" aria-pressed="false"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="size-4 group-aria-pressed:hidden"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="hidden size-4 group-aria-pressed:block"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="sr-only"> Ilse Vermeer</span></button></li>
    <li class="flex items-center gap-3 py-3"><span class="size-[46px] flex-none rounded-full bg-[radial-gradient(circle_at_30%_70%,#fecaca_0,transparent_40%),linear-gradient(135deg,#f97316,#db2777_60%,#6d28d9)]" aria-hidden="true"></span><p class="min-w-0 flex-1"><b class="block text-[.95rem]">Dami Adeyemi</b><span class="mt-0.5 block truncate text-[.82rem] text-[#5f5873]">@damicooks</span><span class="mt-0.5 block truncate text-[.82rem] text-[#5f5873]">96.1k followers</span></p>
      <button class="group inline-flex cursor-pointer items-center justify-center gap-[7px] rounded-full border-[1.5px] border-[#be185d] bg-[#be185d] px-3.5 py-2 text-[.85rem] leading-[1.2] font-bold text-white transition-[color,background-color,border-color] duration-200 hover:border-[#9d174d] hover:bg-[#9d174d] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d] aria-pressed:border-[#be185d] aria-pressed:bg-[#fce7f3] aria-pressed:text-[#9d174d] motion-reduce:transition-none" type="button" aria-pressed="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="size-4 group-aria-pressed:hidden"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="hidden size-4 group-aria-pressed:block"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="sr-only"> Dami Adeyemi</span></button></li>
    <li class="flex items-center gap-3 py-3"><span class="size-[46px] flex-none rounded-full bg-[radial-gradient(circle_at_60%_35%,#e0e7ff_0,transparent_35%),conic-gradient(from_0deg,#1e3a8a,#6366f1,#22d3ee,#1e3a8a)]" aria-hidden="true"></span><p class="min-w-0 flex-1"><b class="block text-[.95rem]">Rafa Quintero</b><span class="mt-0.5 block truncate text-[.82rem] text-[#5f5873]">@rafaonbikes</span><span class="mt-0.5 block truncate text-[.82rem] text-[#5f5873]">8,730 followers</span></p>
      <button class="group inline-flex cursor-pointer items-center justify-center gap-[7px] rounded-full border-[1.5px] border-[#be185d] bg-[#be185d] px-3.5 py-2 text-[.85rem] leading-[1.2] font-bold text-white transition-[color,background-color,border-color] duration-200 hover:border-[#9d174d] hover:bg-[#9d174d] focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#be185d] aria-pressed:border-[#be185d] aria-pressed:bg-[#fce7f3] aria-pressed:text-[#9d174d] motion-reduce:transition-none" type="button" aria-pressed="false"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true" focusable="false" class="size-4 group-aria-pressed:hidden"><path d="M12 5v14M5 12h14"/></svg><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="hidden size-4 group-aria-pressed:block"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg>Follow<span class="sr-only"> Rafa Quintero</span></button></li>
  </ul>
</section></div>
</div>
JavaScript
/* Follow toggles: flip aria-pressed and, when the button names a counter (data-follow="id"), add one follower.
   Tabs: click or arrow keys / Home / End move between tabs; inactive panels are hidden only once this runs,
   so without JavaScript both panels show one after the other. */
document.querySelectorAll('button[aria-pressed]').forEach(function (btn) {
  btn.addEventListener('click', function () {
    var on = btn.getAttribute('aria-pressed') !== 'true';
    btn.setAttribute('aria-pressed', String(on));
    var count = btn.dataset.follow && document.getElementById(btn.dataset.follow);
    if (count) count.textContent = (Number(count.dataset.count) + (on ? 1 : 0)).toLocaleString('en-US');
  });
});
document.querySelectorAll('[role=tablist]').forEach(function (list) {
  var tabs = Array.prototype.slice.call(list.querySelectorAll('[role=tab]'));
  function select(tab, focus) {
    tabs.forEach(function (t) {
      var on = t === tab;
      t.setAttribute('aria-selected', String(on));
      t.tabIndex = on ? 0 : -1;
      document.getElementById(t.getAttribute('aria-controls')).hidden = !on;
    });
    if (focus) tab.focus();
  }
  list.addEventListener('click', function (e) { var t = e.target.closest('[role=tab]'); if (t) select(t); });
  list.addEventListener('keydown', function (e) {
    var i = tabs.indexOf(document.activeElement);
    var next = { ArrowRight: i + 1, ArrowLeft: i - 1, Home: 0, End: tabs.length - 1 }[e.key];
    if (i < 0 || next === undefined) return;
    e.preventDefault();
    select(tabs[(next + tabs.length) % tabs.length], true);
  });
  select(tabs.filter(function (t) { return t.getAttribute('aria-selected') === 'true'; })[0] || tabs[0]);
});

About this set

A social profile for creators and community sites, plus a suggestions list. The creator profile with tabs has a soft gradient cover, an abstract gradient avatar, a Follow toggle and a Message link, the name and handle, a bio, counts for posts, followers and following, and Posts and About tabs. The Posts tab shows six post tiles with titles over gradients, and About is a short description list with location, join date, gear and website. Who to follow lists three creators with their handle, follower count and their own Follow toggle. Follow is a button with aria-pressed: pressing it fills or clears the button, swaps a plus icon for a tick and, on the main card, adds one to the follower count. The label stays Follow in both states so the accessible name never changes, and the pressed state is announced. The tabs follow the ARIA tabs pattern with arrow keys, Home and End. About thirty lines of vanilla JavaScript run both, and in the plain CSS and Tailwind versions both tab panels show one after the other when JavaScript is off. The Bootstrap version uses its own tab and button plugins.

What’s included

  • Follow toggle with aria-pressed and a live follower count
  • Posts and About tabs with arrow key, Home and End navigation
  • Abstract gradient avatars and post tiles, no photos
  • Who to follow list with one toggle per creator
  • Bootstrap version uses .nav-underline tabs and data-bs-toggle="button"

Accessibility

Follow is a toggle button whose pressed state screen readers announce, and its name includes the creator's name. The tabs use role="tablist", role="tab" with aria-selected and aria-controls, and labelled tab panels; only the selected tab is in the Tab order and arrow keys move between tabs. All controls show a 3px focus outline, and transitions stop under prefers-reduced-motion.

Customise it

Change --cr-accent, --cr-accent-dark and --cr-tint on .cr for the button and tab colours, and the gradients on .cr-cover, .cr-av and the post tiles. Bootstrap maps the same variables onto --bs-btn-* and --bs-nav-* variables; Tailwind uses colour utilities such as bg-[#be185d].