Expand-on-Hover FAB
A copy-paste social share component in pure HTML & CSS. Zero dependencies, framework-agnostic, MIT-licensed.
Social ShareHTMLCSSany framework
Copy into your project
HTML
<div class="nuda-shr-fab">
<div class="nuda-shr-fab__orbit">
<button class="nuda-shr-fab__orb nuda-shr-fab__orb--tw">
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.737-8.835L1.254 2.25H8.08l4.26 5.632zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
</button>
<button class="nuda-shr-fab__orb nuda-shr-fab__orb--fb">
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>
</button>
<button class="nuda-shr-fab__orb nuda-shr-fab__orb--wa">
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413z"/></svg>
</button>
</div>
<button class="nuda-shr-fab__main">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><path d="m8.59 13.51 6.83 3.98M15.41 6.51l-6.82 3.98"/></svg>
</button>
</div>CSS
.nuda-shr-fab {
position: relative;
width: 120px;
height: 90px;
display: flex;
align-items: flex-end;
justify-content: flex-end;
}
.nuda-shr-fab__orbit {
position: absolute;
bottom: 0;
right: 0;
display: flex;
flex-direction: column;
align-items: flex-end;
gap: .3rem;
pointer-events: none;
opacity: 1;
}
.nuda-shr-fab__orb {
width: 32px;
height: 32px;
border: none;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
pointer-events: all;
transition: transform .2s,box-shadow .2s;
animation: _nuda-shrfabIn .25s ease-out both;
}
.nuda-shr-fab__orb:nth-child(1) {
animation-delay: .05s;
transform: translateX(-50px);
}
.nuda-shr-fab__orb:nth-child(2) {
animation-delay: .1s;
transform: translateX(-50px);
}
.nuda-shr-fab__orb:nth-child(3) {
animation-delay: .15s;
transform: translateX(-50px);
}
@keyframes _nuda-shrfabIn {
from {
opacity: 0;
transform: translateX(0) scale(.7);
}
to {
opacity: 1;
transform: translateX(-50px) scale(1);
}
}
@media (prefers-reduced-motion:reduce) {
.nuda-shr-fab__orb {
animation: none;
}
}
.nuda-shr-fab__orb--tw {
background: #000;
color: #fff;
}
.nuda-shr-fab__orb--fb {
background: #1877f2;
color: #fff;
}
.nuda-shr-fab__orb--wa {
background: #25d366;
color: #fff;
}
.nuda-shr-fab__main {
width: 44px;
height: 44px;
border-radius: 50%;
background: #e4ff54;
border: none;
color: #0a0a0a;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
box-shadow: 0 4px 20px rgba(228,255,84,.35);
position: relative;
z-index: 1;
}
How to use Expand-on-Hover FAB
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.