Invite Team Step
A copy-paste onboarding & coachmarks component in pure HTML & CSS. Zero dependencies, framework-agnostic, MIT-licensed.
Onboarding & CoachmarksHTMLCSSany framework
Invite your team
Work is better together. Add teammates to get the most out of your workspace.
I'll do this later
Copy into your project
HTML
<!-- Invite Team Step — first-run step to bring teammates into a fresh workspace -->
<div class="nuda-ob2-invite-team">
<h4>Invite your team</h4>
<p>Work is better together. Add teammates to get the most out of your workspace.</p>
<div class="nuda-ob2-invite-team__avatars" aria-hidden="true">
<span class="nuda-ob2-invite-team__avatar" style="--i:0">JD</span>
<span class="nuda-ob2-invite-team__avatar" style="--i:1">AK</span>
<span class="nuda-ob2-invite-team__avatar" style="--i:2">MR</span>
<span class="nuda-ob2-invite-team__avatar nuda-ob2-invite-team__avatar--more" style="--i:3">+3</span>
</div>
<div class="nuda-ob2-invite-team__field">
<label for="ob2-invite-email">Email address</label>
<div class="nuda-ob2-invite-team__row">
<input id="ob2-invite-email" type="email" placeholder="teammate@company.com" />
<button class="nuda-ob2-invite-team__send" type="button">Send</button>
</div>
</div>
<a class="nuda-ob2-invite-team__skip" href="#">I'll do this later</a>
</div>CSS
.nuda-ob2-invite-team {
width: 100%;
max-width: 290px;
padding: 16px 18px;
background: rgba(20,20,24,.96);
border: 1px solid rgba(255,255,255,.08);
border-radius: 14px;
display: flex;
flex-direction: column;
gap: 8px;
animation: nuda-ob2-invite-team-in .5s cubic-bezier(.16,1,.3,1) both;
}
.nuda-ob2-invite-team h4 {
margin: 0;
font: 700 14px ui-sans-serif,system-ui;
color: #fafafa;
}
.nuda-ob2-invite-team p {
margin: 0;
font: 500 11px/1.5 ui-sans-serif,system-ui;
color: #a1a1aa;
}
.nuda-ob2-invite-team__avatars {
display: flex;
margin: 4px 0 2px;
}
.nuda-ob2-invite-team__avatar {
width: 26px;
height: 26px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background: linear-gradient(135deg,#3a3a42,#232328);
border: 2px solid rgba(20,20,24,1);
color: #fafafa;
font: 700 9px ui-sans-serif,system-ui;
margin-left: -8px;
opacity: 0;
animation: nuda-ob2-invite-team-pop .4s cubic-bezier(.34,1.56,.64,1) forwards;
animation-delay: calc(var(--i) * .08s);
}
.nuda-ob2-invite-team__avatar:first-child {
margin-left: 0;
}
.nuda-ob2-invite-team__avatar--more {
background: rgba(228,255,84,.15);
color: #e4ff54;
border-color: rgba(20,20,24,1);
}
.nuda-ob2-invite-team__field label {
display: block;
margin-bottom: 4px;
font: 700 9px ui-sans-serif,system-ui;
color: #777;
text-transform: uppercase;
letter-spacing: .06em;
}
.nuda-ob2-invite-team__row {
display: flex;
gap: 6px;
}
.nuda-ob2-invite-team__row input {
flex: 1;
min-width: 0;
min-height: 36px;
padding: 0 10px;
background: rgba(255,255,255,.04);
border: 1px solid rgba(255,255,255,.12);
border-radius: 7px;
color: #cfcfcf;
font: 500 11px ui-sans-serif,system-ui;
}
.nuda-ob2-invite-team__row input::placeholder {
color: #63636e;
}
.nuda-ob2-invite-team__row input:focus-visible {
outline: 2px solid #e4ff54;
outline-offset: 1px;
}
.nuda-ob2-invite-team__send {
min-height: 36px;
padding: 0 14px;
background: #e4ff54;
color: #0a0a0a;
border: none;
border-radius: 7px;
font: 700 11px ui-sans-serif,system-ui;
cursor: pointer;
transition: transform .2s,box-shadow .25s;
display: inline-flex;
align-items: center;
justify-content: center;
}
.nuda-ob2-invite-team__send:hover {
transform: translateY(-1px);
box-shadow: 0 0 14px rgba(228,255,84,.35);
}
.nuda-ob2-invite-team__send:focus-visible {
outline: 2px solid #e4ff54;
outline-offset: 2px;
}
.nuda-ob2-invite-team__skip {
align-self: center;
margin-top: 2px;
font: 600 10px ui-sans-serif,system-ui;
color: #777;
text-decoration: none;
}
.nuda-ob2-invite-team__skip:hover {
color: #a1a1aa;
text-decoration: underline;
}
@keyframes nuda-ob2-invite-team-in {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes nuda-ob2-invite-team-pop {
from {
opacity: 0;
transform: scale(.5);
}
to {
opacity: 1;
transform: scale(1);
}
}
@media (prefers-reduced-motion:reduce) {
.nuda-ob2-invite-team {
animation: none;
}
.nuda-ob2-invite-team__avatar {
animation: none;
opacity: 1;
}
}
How to use Invite Team Step
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.