Checklist Card
A copy-paste onboarding & coachmarks component in pure HTML & CSS. Zero dependencies, framework-agnostic, MIT-licensed.
Onboarding & CoachmarksHTMLCSSany framework
Get started2/4
Create accountVerify email- Invite team
- Connect repo
Copy into your project
HTML
<!-- Checklist Card — onboarding tasks with progress bar and per-row state -->
<div class="nuda-clist">
<div class="nuda-clist__head">
<span>Get started</span>
<span class="nuda-clist__pct">2/4</span>
</div>
<div class="nuda-clist__bar"><span></span></div>
<ul>
<li class="is-done"><span class="nuda-clist__chk"></span><s>Create account</s></li>
<li class="is-done"><span class="nuda-clist__chk"></span><s>Verify email</s></li>
<li class="is-current"><span class="nuda-clist__chk"></span>Invite team</li>
<li><span class="nuda-clist__chk"></span>Connect repo</li>
</ul>
</div>CSS
/* Checklist Card
Persistent onboarding checklist: progress bar, items with is-done / is-current.
Customize: --clist-accent, --clist-target (bar fill %). */
.nuda-clist {
--clist-accent: #e4ff54;
--clist-target: 50%;
width: 100%;
max-width: 280px;
padding: 12px 14px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
display: flex;
flex-direction: column;
gap: 8px;
}
.nuda-clist__head {
display: flex;
justify-content: space-between;
align-items: center;
font: 700 0.875rem ui-sans-serif, system-ui, sans-serif;
color: #fafafa;
}
.nuda-clist__pct {
font: 700 0.7rem ui-monospace, monospace;
color: var(--clist-accent);
background: rgba(228, 255, 84, 0.1);
padding: 2px 6px;
border-radius: 4px;
font-variant-numeric: tabular-nums;
}
.nuda-clist__bar {
height: 4px;
background: rgba(255, 255, 255, 0.06);
border-radius: 2px;
overflow: hidden;
}
.nuda-clist__bar span {
display: block;
height: 100%;
width: var(--clist-target);
background: linear-gradient(90deg, var(--clist-accent), rgba(228, 255, 84, 0.6));
border-radius: 2px;
transform: scaleX(0);
transform-origin: left;
animation: nuda-clist-fill 1.4s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
.nuda-clist ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
.nuda-clist li {
display: flex;
align-items: center;
gap: 8px;
font: 500 0.875rem ui-sans-serif, system-ui, sans-serif;
color: #a1a1aa;
padding: 2px 0;
}
.nuda-clist li.is-done { color: #63636e; }
.nuda-clist li.is-done s { text-decoration: line-through; text-decoration-color: rgba(255, 255, 255, 0.2); }
.nuda-clist li.is-current { color: #fafafa; }
.nuda-clist__chk {
width: 14px;
height: 14px;
border: 1.5px solid rgba(255, 255, 255, 0.15);
border-radius: 50%;
flex-shrink: 0;
transition: all 0.25s;
}
.nuda-clist .is-done .nuda-clist__chk {
background: var(--clist-accent);
border-color: var(--clist-accent);
box-shadow: 0 0 4px rgba(228, 255, 84, 0.4);
}
.nuda-clist .is-current .nuda-clist__chk {
border-color: var(--clist-accent);
animation: nuda-clist-pulse 1.6s ease-in-out infinite;
}
@keyframes nuda-clist-fill { to { transform: scaleX(1); } }
@keyframes nuda-clist-pulse {
0%, 100% { box-shadow: 0 0 0 rgba(228, 255, 84, 0); }
50% { box-shadow: 0 0 0 4px rgba(228, 255, 84, 0.15); }
}
@media (prefers-reduced-motion: reduce) {
.nuda-clist__bar span,
.nuda-clist .is-current .nuda-clist__chk { animation: none; transform: scaleX(1); }
}How to use Checklist Card
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.