Files
once-campfire/app/assets/stylesheets/buttons.css
Kevin McConnell df76a227dc Hello world
First open source release of Campfire 🎉
2025-08-21 09:31:59 +01:00

201 lines
3.7 KiB
CSS

:root {
--btn-size: 2.65em;
}
.btn {
align-items: center;
background-color: var(--btn-background, var(--color-text-reversed));
border-radius: var(--btn-border-radius, 2em);
border: var(--btn-border-size, 1px) solid var(--btn-border-color, var(--color-border-darker));
color: var(--btn-color, var(--color-text));
cursor: pointer;
display: inline-flex;
font-weight: 600;
gap: 0.5em;
justify-content: center;
padding: var(--btn-padding, 0.5em 1.1em);
pointer-events: auto;
text-align: center;
img {
-webkit-touch-callout: none;
user-select: none;
}
/* Default icon styles */
&:where(:has(img):not(.avatar)) {
text-align: start;
img {
inline-size: 1.3em;
max-inline-size: unset;
}
img:not([class]) {
filter: invert(0);
@media (prefers-color-scheme: dark) {
filter: invert(100%);
}
}
}
/* Circle buttons */
&:where(:has(.for-screen-reader):has(img, figure)) {
--btn-border-radius: 50%;
--btn-padding: 0;
aspect-ratio: 1;
block-size: var(--btn-size);
display: grid;
inline-size: var(--btn-size);
place-items: center;
> * {
grid-area: 1/1;
}
}
&:where(.avatar) {
--btn-border-radius: var(--avatar-border-radius);
--btn-padding: 0;
--btn-border-size: 0;
--hover-size: 0;
justify-content: unset;
img {
inline-size: 100%;
}
@media (any-hover: hover) {
&:where(:not(:active):hover) {
filter: brightness(0.7);
}
}
}
&:where(summary) {
list-style: none;
&::marker,
&::-webkit-details-marker { display: none; }
}
img {
user-select: none;
-webkit-touch-callout: none;
}
[aria-busy] &:disabled {
position: relative;
> * {
visibility: hidden;
}
&::after {
--mask: no-repeat radial-gradient(#000 68%,#0000 71%);
--size: 1.25em;
-webkit-mask: var(--mask), var(--mask), var(--mask);
-webkit-mask-size: 28% 45%;
animation: submitting 1s infinite linear;
aspect-ratio: 8/5;
background: currentColor;
content: "";
inline-size: var(--size);
inset: 50%;
margin-block: calc((var(--size) / 3) * -1);
margin-inline: calc((var(--size) / 2) * -1);
position: absolute;
}
}
&:has(input:checked) {
--btn-background: var(--color-text);
--btn-color: var(--color-text-reversed);
img {
filter: invert(100%);
}
@media (prefers-color-scheme: dark) {
img {
filter: invert(0);
}
}
}
[disabled] &[type=submit],
&[type=submit]:disabled {
cursor: not-allowed;
filter: grayscale(100%) contrast(0.5);
opacity: 0.5;
pointer-events: none;
}
}
/* Variants */
.btn--reversed {
--btn-background: var(--color-text);
--btn-color: var(--color-text-reversed);
}
.btn--negative {
--btn-background: var(--color-negative);
--btn-color: var(--color-text-reversed);
}
.btn--reversed,
.btn--negative {
--btn-border-color: transparent;
--hover-size: 0;
--hover-filter: brightness(0.7);
img:not(.avatar) {
filter: invert(100%);
@media (prefers-color-scheme: dark) {
filter: invert(0%);
}
}
}
.btn--success {
animation: success 1s ease-out;
img {
animation: zoom-fade 300ms ease-out;
}
}
.btn--faux {
--hover-filter: none;
box-shadow: none;
cursor: initial;
outline: 0;
}
.btn--borderless {
--btn-border-color: transparent;
}
.btn--plain {
--btn-background: transparent;
--btn-border-color: transparent;
--btn-padding: 0;
}
.btn--pulsing {
animation: pulsing-outline 2s infinite both;
outline: 0 solid var(--color-alert);
}
button {
@media (any-hover: hover) {
cursor: pointer;
}
}