: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; } }