Skip to content

Level XP Profile

A copy-paste profile headers component in pure HTML & CSS. Zero dependencies, framework-agnostic, MIT-licensed.

Profile HeadersHTMLCSSany framework
RK
12
Rune Kahn
680 / 1000 XP

Copy into your project

HTML
<div class="nuda-xp">
  <div class="nuda-xp__ring">
    <svg viewBox="0 0 64 64" aria-hidden="true">
      <circle cx="32" cy="32" r="29" fill="none"
        stroke="rgba(255,255,255,.08)" stroke-width="3"/>
      <circle class="nuda-xp__progress" cx="32" cy="32" r="29"
        fill="none" stroke="currentColor" stroke-width="3"
        stroke-linecap="round" pathLength="100"
        stroke-dasharray="68 100" transform="rotate(-90 32 32)"/>
    </svg>
    <div class="nuda-xp__avatar">RK</div>
    <div class="nuda-xp__lvl">12</div>
  </div>
  <div class="nuda-xp__meta">
    <div class="nuda-xp__name">Rune Kahn</div>
    <div class="nuda-xp__sub">680 / 1000 XP</div>
  </div>
</div>
CSS
/* Level / XP Profile
   Avatar with circular XP progress ring + level badge.
   Customize: --c (ring color), stroke-dasharray (XP %) */

.nuda-xp {
  display: flex;
  gap: 14px;
  align-items: center;
  padding: 14px;
  background: #0c0c10;
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 14px;
  color: #fafafa;
  font-family: system-ui, sans-serif;
}

.nuda-xp__ring {
  position: relative;
  width: 64px;
  height: 64px;
  color: #e4ff54;
  flex-shrink: 0;
}

.nuda-xp__progress {
  stroke-dasharray: 0 100;
  animation: nuda-xp-fill 1.2s cubic-bezier(0.2, 0.7, 0.3, 1) forwards;
}

@keyframes nuda-xp-fill {
  from { stroke-dasharray: 0 100; }
  to   { stroke-dasharray: 68 100; }
}

.nuda-xp__avatar {
  position: absolute;
  inset: 6px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-weight: 600;
  font-size: 0.85rem;
  color: #09090b;
  background: linear-gradient(135deg, #62b6ff, #9d6dff);
}

.nuda-xp__lvl {
  position: absolute;
  bottom: -2px;
  right: -2px;
  background: #e4ff54;
  color: #09090b;
  font-size: 0.65rem;
  font-weight: 700;
  padding: 2px 6px;
  border-radius: 999px;
  border: 2px solid #0c0c10;
  line-height: 1;
}

.nuda-xp__name { font-size: 0.95rem; font-weight: 600; }
.nuda-xp__sub  { font-size: 0.78rem; color: #a0a0a8; font-variant-numeric: tabular-nums; }

@media (prefers-reduced-motion: reduce) {
  .nuda-xp__progress {
    animation: none;
    stroke-dasharray: 68 100;
  }
}

How to use Level XP Profile

Paste the HTML where you need it and the CSS into a global stylesheet (or a <style> tag). Every class is prefixed nuda- so it never collides with Tailwind or your own styles. Tweak the CSS custom properties to match your design system.

Works in React, Vue, Svelte, Astro, Next.js, Nuxt, Laravel Blade, Django, Rails — or a single .html file. No npm install, no build step.

More profile headers components

← Browse all NudaUI components