Prévisualisation
<button class="snd-button">
<div class="snd-outline"></div>
<div class="snd-state snd-state--default">
<div class="snd-icon">
<svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g style="filter: url(#shadow)">
<path d="M14.2199 21.63C13.0399 21.63 11.3699 20.8 10.0499 16.83L9.32988 14.67L7.16988 13.95C3.20988 12.63 2.37988 10.96 2.37988 9.78001C2.37988 8.61001 3.20988 6.93001 7.16988 5.60001L15.6599 2.77001C17.7799 2.06001 19.5499 2.27001 20.6399 3.35001C21.7299 4.43001 21.9399 6.21001 21.2299 8.33001L18.3999 16.82C17.0699 20.8 15.3999 21.63 14.2199 21.63ZM7.63988 7.03001C4.85988 7.96001 3.86988 9.06001 3.86988 9.78001C3.86988 10.5 4.85988 11.6 7.63988 12.52L10.1599 13.36C10.3799 13.43 10.5599 13.61 10.6299 13.83L11.4699 16.35C12.3899 19.13 13.4999 20.12 14.2199 20.12C14.9399 20.12 16.0399 19.13 16.9699 16.35L19.7999 7.86001C20.3099 6.32001 20.2199 5.06001 19.5699 4.41001C18.9199 3.76001 17.6599 3.68001 16.1299 4.19001L7.63988 7.03001Z" fill="currentColor"></path>
<path d="M10.11 14.4C9.92005 14.4 9.73005 14.33 9.58005 14.18C9.29005 13.89 9.29005 13.41 9.58005 13.12L13.16 9.53C13.45 9.24 13.93 9.24 14.22 9.53C14.51 9.82 14.51 10.3 14.22 10.59L10.64 14.18C10.5 14.33 10.3 14.4 10.11 14.4Z" fill="currentColor"></path>
</g>
<defs>
<filter id="shadow">
<fedropshadow dx="0" dy="1" stdDeviation="0.6" flood-opacity="0.5"></fedropshadow>
</filter>
</defs>
</svg>
</div>
<p>
<span style="--i:0">S</span>
<span style="--i:1">e</span>
<span style="--i:2">n</span>
<span style="--i:3">d</span>
<span style="--i:4">M</span>
<span style="--i:5">e</span>
<span style="--i:6">s</span>
<span style="--i:7">s</span>
<span style="--i:8">a</span>
<span style="--i:9">g</span>
<span style="--i:10">e</span>
</p>
</div>
<div class="snd-state snd-state--sent">
<div class="snd-icon">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" height="1em" width="1em" stroke-width="0.5px" stroke="black">
<g style="filter: url(#shadow)">
<path fill="currentColor" d="M12 22.75C6.07 22.75 1.25 17.93 1.25 12C1.25 6.07 6.07 1.25 12 1.25C17.93 1.25 22.75 6.07 22.75 12C22.75 17.93 17.93 22.75 12 22.75ZM12 2.75C6.9 2.75 2.75 6.9 2.75 12C2.75 17.1 6.9 21.25 12 21.25C17.1 21.25 21.25 17.1 21.25 12C21.25 6.9 17.1 2.75 12 2.75Z"></path>
<path fill="currentColor" d="M10.5795 15.5801C10.3795 15.5801 10.1895 15.5001 10.0495 15.3601L7.21945 12.5301C6.92945 12.2401 6.92945 11.7601 7.21945 11.4701C7.50945 11.1801 7.98945 11.1801 8.27945 11.4701L10.5795 13.7701L15.7195 8.6301C16.0095 8.3401 16.4895 8.3401 16.7795 8.6301C17.0695 8.9201 17.0695 9.4001 16.7795 9.6901L11.1095 15.3601C10.9695 15.5001 10.7795 15.5801 10.5795 15.5801Z"></path>
</g>
</svg>
</div>
<p>
<span style="--i:5">S</span>
<span style="--i:6">e</span>
<span style="--i:7">n</span>
<span style="--i:8">t</span>
</p>
</div>
</button>
.snd-button {
--snd-primary: #ff5569;
--snd-neutral-1: #f7f8f7;
--snd-neutral-2: #e7e7e7;
--snd-radius: 14px;
cursor: pointer;
border-radius: var(--snd-radius);
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3);
border: none;
box-shadow: 0 0.5px 0.5px 1px rgba(255, 255, 255, 0.2),
0 10px 20px rgba(0, 0, 0, 0.2), 0 4px 5px 0px rgba(0, 0, 0, 0.05);
display: flex;
align-items: center;
justify-content: center;
position: relative;
transition: all 0.3s ease;
min-width: 200px;
padding: 20px;
height: 68px;
font-family: "Galano Grotesque", Poppins, Montserrat, sans-serif;
font-style: normal;
font-size: 18px;
font-weight: 600;
}
.snd-button:hover {
transform: scale(1.02);
box-shadow: 0 0 1px 2px rgba(255, 255, 255, 0.3),
0 15px 30px rgba(0, 0, 0, 0.3), 0 10px 3px -3px rgba(0, 0, 0, 0.04);
}
.snd-button:active {
transform: scale(1);
box-shadow: 0 0 1px 2px rgba(255, 255, 255, 0.3),
0 10px 3px -3px rgba(0, 0, 0, 0.2);
}
.snd-button:after {
content: "";
position: absolute;
inset: 0;
border-radius: var(--snd-radius);
border: 2.5px solid transparent;
background: linear-gradient(var(--snd-neutral-1), var(--snd-neutral-2)) padding-box,
linear-gradient(to bottom, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.45)) border-box;
z-index: 0;
transition: all 0.4s ease;
}
.snd-button:hover::after {
transform: scale(1.05, 1.1);
box-shadow: inset 0 -1px 3px 0 rgba(255, 255, 255, 1);
}
.snd-button::before {
content: "";
inset: 7px 6px 6px 6px;
position: absolute;
background: linear-gradient(to top, var(--snd-neutral-1), var(--snd-neutral-2));
border-radius: 30px;
filter: blur(0.5px);
z-index: 2;
}
.snd-state p {
display: flex;
align-items: center;
justify-content: center;
}
.snd-state .snd-icon {
position: absolute;
left: 0;
top: 0;
bottom: 0;
margin: auto;
transform: scale(1.25);
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
}
.snd-state .snd-icon svg {
overflow: visible;
}
.snd-outline {
position: absolute;
border-radius: inherit;
overflow: hidden;
z-index: 1;
opacity: 0;
transition: opacity 0.4s ease;
inset: -2px -3.5px;
}
.snd-outline::before {
content: "";
position: absolute;
inset: -100%;
background: conic-gradient(
from 180deg,
transparent 60%,
white 80%,
transparent 100%
);
animation: snd-spin 2s linear infinite;
animation-play-state: paused;
}
@keyframes snd-spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.snd-button:hover .snd-outline {
opacity: 1;
}
.snd-button:hover .snd-outline::before {
animation-play-state: running;
}
.snd-state p span {
display: block;
opacity: 0;
animation: snd-slideDown 0.8s ease forwards calc(var(--i) * 0.03s);
}
.snd-button:hover p span {
opacity: 1;
animation: snd-wave 0.5s ease forwards calc(var(--i) * 0.02s);
}
.snd-button:focus p span {
opacity: 1;
animation: snd-disapear 0.6s ease forwards calc(var(--i) * 0.03s);
}
@keyframes snd-wave {
30% {
opacity: 1;
transform: translateY(4px) translateX(0) rotate(0);
}
50% {
opacity: 1;
transform: translateY(-3px) translateX(0) rotate(0);
color: var(--snd-primary);
}
100% {
opacity: 1;
transform: translateY(0) translateX(0) rotate(0);
}
}
@keyframes snd-slideDown {
0% {
opacity: 0;
transform: translateY(-20px) translateX(5px) rotate(-90deg);
color: var(--snd-primary);
filter: blur(5px);
}
30% {
opacity: 1;
transform: translateY(4px) translateX(0) rotate(0);
filter: blur(0);
}
50% {
opacity: 1;
transform: translateY(-3px) translateX(0) rotate(0);
}
100% {
opacity: 1;
transform: translateY(0) translateX(0) rotate(0);
}
}
@keyframes snd-disapear {
from {
opacity: 1;
}
to {
opacity: 0;
transform: translateX(5px) translateY(20px);
color: var(--snd-primary);
filter: blur(5px);
}
}
.snd-state--default .snd-icon svg {
animation: snd-land 0.6s ease forwards;
}
.snd-button:hover .snd-state--default .snd-icon {
transform: rotate(45deg) scale(1.25);
}
.snd-button:focus .snd-state--default svg {
animation: snd-takeOff 0.8s linear forwards;
}
.snd-button:focus .snd-state--default .snd-icon {
transform: rotate(0) scale(1.25);
}
@keyframes snd-takeOff {
0% {
opacity: 1;
}
60% {
opacity: 1;
transform: translateX(70px) rotate(45deg) scale(2);
}
100% {
opacity: 0;
transform: translateX(160px) rotate(45deg) scale(0);
}
}
@keyframes snd-land {
0% {
transform: translateX(-60px) translateY(30px) rotate(-50deg) scale(2);
opacity: 0;
filter: blur(3px);
}
100% {
transform: translateX(0) translateY(0) rotate(0);
opacity: 1;
filter: blur(0);
}
}
.snd-state--default .snd-icon:before {
content: "";
position: absolute;
top: 50%;
height: 2px;
width: 0;
left: -5px;
background: linear-gradient(to right, transparent, rgba(0, 0, 0, 0.5));
}
.snd-button:focus .snd-state--default .snd-icon:before {
animation: snd-contrail 0.8s linear forwards;
}
@keyframes snd-contrail {
0% {
width: 0;
opacity: 1;
}
8% {
width: 15px;
}
60% {
opacity: 0.7;
width: 80px;
}
100% {
opacity: 0;
width: 160px;
}
}
.snd-state {
padding-left: 29px;
z-index: 2;
display: flex;
position: relative;
}
.snd-state--default span:nth-child(4) {
margin-right: 5px;
}
.snd-state--sent {
display: none;
}
.snd-state--sent svg {
transform: scale(1.25);
margin-right: 8px;
}
.snd-button:focus .snd-state--default {
position: absolute;
}
.snd-button:focus .snd-state--sent {
display: flex;
}
.snd-button:focus .snd-state--sent span {
opacity: 0;
animation: snd-slideDown 0.8s ease forwards calc(var(--i) * 0.2s);
}
.snd-button:focus .snd-state--sent .snd-icon svg {
opacity: 0;
animation: snd-appear 1.2s ease forwards 0.8s;
}
@keyframes snd-appear {
0% {
opacity: 0;
transform: scale(4) rotate(-40deg);
color: var(--snd-primary);
filter: blur(4px);
}
30% {
opacity: 1;
transform: scale(0.6);
filter: blur(1px);
}
50% {
opacity: 1;
transform: scale(1.2);
filter: blur(0);
}
100% {
opacity: 1;
transform: scale(1);
}
}
License MIT
Original author:
marcelodolza
Copyright - 2026 marcelodolza (Marcelo Dolza)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.