adding a disco button

This commit is contained in:
Brian 2022-09-15 10:46:26 -06:00
parent e39547e77e
commit 1c85d0b3cd
Signed by: brian
GPG Key ID: DE1A5390A3B84CD8

View File

@ -200,3 +200,144 @@
border-color: hsl(358, 84%, 85.7%);
box-shadow: 0 6px 16px 0 hsla(358, 84%, 85.7%, 0.33), inset 0 6px 16px 0 hsla(358, 84%, 85.7%, 0.33);
}
/** +----------------------------------------------------------------+ **/
/** | "Disco" animated buttons | **/
/** +----------------------------------------------------------------+ **/
/* https://github.com/joe-bell/loading-disco */
.disco-button {
/* Customizable */
--button-color-bg: rgb(24 24 27);
--button-color-border: rgb(63 63 70);
--button-color-disco: rgb(59 130 246);
--button-color-text: rgb(161 161 170);
--button-color-text-busy: rgb(113 113 122);
--button-border-width: 1px;
--button-bg-gradient-start: rgb(24 24 27);
--button-bg-gradient-end: rgb(39 39 42);
--button-disco-animation: disco 1.5s linear infinite;
--button-disco-gradient-stops: transparent 135deg,
var(--button-color-disco) 180deg, transparent 225deg;
--button-disco-opacity: 1;
--button-radius: 0.5rem;
--button-transition-duration: 200ms;
--button-transition-easing: cubic-bezier(0.4, 0, 0.2, 1);
--button-transition: var(--button-transition-duration)
var(--button-transition-easing);
/**
* Using an advance mathematic technique often referred to as
* "winging it", we'll offset the aspect ratio by a figure
* that brings the shape of the "disco" element as close to
* the edge of the button as possible to reduce the effect
* of "easing".
*/
--button-aspect-ratio-multiplier: 0.65;
/* Styles */
appearance: none;
position: relative;
border: 0;
font: inherit;
width: max-content;
overflow: hidden;
margin: calc(var(--button-border-width) * -1);
padding: var(--button-border-width);
color: var(--button-color-text);
border-radius: var(--button-radius);
transform: none;
user-select: none;
will-change: transform;
background-color: var(--button-color-border);
/**
* This one's optional, it just stops the button from jumping around when the
* content width changes
*/
min-width: 8rem;
}
.disco-button:hover {
filter: brightness(0.95);
}
.disco-button:active {
transform: scale(0.95);
}
@media (prefers-reduced-motion: no-preference) {
.disco-button {
transition: var(--button-transition);
transition-property: color, filter, transform;
}
}
.button__content {
display: inline-flex;
position: relative;
border-radius: calc(var(--button-radius) - var(--button-border-width));
background-image: linear-gradient(
to top right,
var(--button-bg-gradient-start),
var(--button-bg-gradient-end)
);
background-color: var(--button-bg-gradient-end);
width: 100%;
justify-content: center;
padding: 0.625rem 1rem;
text-align: center;
z-index: 10;
}
.button__disco,
.button__disco::before {
position: absolute;
width: 100%;
}
.button__disco {
inset: 0;
height: 100%;
top: 50%;
transform: translateY(-50%)
scaleX(
calc(var(--button-aspect-ratio) * var(--button-aspect-ratio-multiplier))
);
will-change: transform;
}
.button__disco::before {
content: "";
position: absolute;
left: 0;
min-height: 100%;
top: 50%;
aspect-ratio: 1/1;
transform-origin: center;
background-image: conic-gradient(var(--button-disco-gradient-stops));
opacity: var(--button-disco-opacity-enabled, 0);
/**
* This one's not strictly necessary, but I think it helps soften the gradient
* and reduces animation "easing".
*/
filter: blur(8px);
}
@media (prefers-reduced-motion: reduce) {
.button__disco::before {
transform: translateY(-50%) rotate(0deg);
}
}
@media (prefers-reduced-motion: no-preference) {
.button__disco::before {
animation: var(--button-disco-animation);
animation-play-state: var(--button-disco-animation-state, paused);
transition: var(--button-transition);
transition-property: opacity;
}
}
.disco-button.is-busy {
--button-color-text: var(--button-color-text-busy);
--button-disco-animation-state: running;
--button-disco-opacity-enabled: var(--button-disco-opacity);
cursor: progress;
}