Files
2026-09-08 09:49:27 +02:00

279 lines
5.9 KiB
CSS

:root {
/* Colors */
--btn-bg-primary: var(--color-accent);
--btn-bg-primary-hover: var(--color-accent);
--btn-bg-primary-active: #353030;
--btn-text-light: #fefcfb;
--btn-text-dark: var(--color-accent);
--btn-border-primary: var(--color-accent);
--btn-border-ghost: #e9e9e9;
--btn-border-ghost-hover: #ececec;
--btn-border-ghost-active: #e1e1e1;
--btn-bg-ghost-hover: #ececec;
--btn-bg-ghost-active: #e1e1e1;
/* Disabled */
--btn-bg-disabled: #cccccc;
--btn-text-disabled: #888888;
--btn-border-disabled: #cccccc;
/* Focus */
--btn-focus-ring: 3px solid #a9a9a9;
--btn-focus-offset: 2px;
/* Layout */
--btn-py: 8px;
--btn-px: 12px;
--btn-py-lg: 16px;
--btn-px-lg: 20px;
--btn-radius: 50px;
--btn-gap: 8px;
--btn-max-height: 46px;
--btn-min-height: 38px;
--btn-icon-size: 18px;
--btn-tertiary-px: 4px;
/* Typography */
--btn-font-family: var(--font-body);
--btn-font-size: var(--font-size-xs);
--btn-font-weight: var(--font-weight-medium);
--btn-line-height: 1;
/* Shadow */
--btn-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
--btn-shadow-none: none;
/* Motion */
--btn-transition:
background-color 0.25s ease, border-color 0.25s ease, color 0.25s ease,
transform 0.25s ease, box-shadow 0.25s ease;
}
/* Base */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--btn-gap);
padding: var(--btn-py) var(--btn-px);
max-height: var(--btn-max-height);
border: 2px solid transparent;
border-radius: var(--btn-radius);
font-family: var(--btn-font-family);
font-size: var(--btn-font-size);
font-weight: var(--btn-font-weight);
line-height: var(--btn-line-height);
white-space: nowrap;
text-decoration: none;
vertical-align: middle;
cursor: pointer;
user-select: none;
transition: var(--btn-transition);
-webkit-tap-highlight-color: transparent;
z-index: 999;
}
.btn:focus {
outline: none;
}
.btn:focus-visible {
outline: var(--btn-focus-ring);
outline-offset: var(--btn-focus-offset);
}
.btn .btn-icon {
display: flex;
align-items: center;
flex-shrink: 0;
width: var(--btn-icon-size);
height: var(--btn-icon-size);
transition:
transform 0.25s ease,
color 0.25s ease;
}
.btn:hover .btn-icon.animate {
transform: translateX(4px);
}
/* Filled */
.btn--filled {
background-color: var(--btn-bg-primary);
color: var(--btn-text-light);
border-color: var(--btn-border-primary);
box-shadow: var(--btn-shadow);
}
.btn--filled .btn-icon {
color: currentColor;
}
.btn--filled:hover {
background-color: var(--btn-bg-primary-hover);
border-color: var(--btn-bg-primary-hover);
}
.btn--filled:active {
background-color: var(--btn-bg-primary-active);
border-color: var(--btn-bg-primary-active);
transition: none;
}
/* Filled Inverse */
.btn--filled-inverse {
background-color: #ffffff;
color: var(--color-accent);
border-color: #ffffff;
box-shadow: var(--btn-shadow);
}
.btn--filled-inverse .btn-icon {
color: currentColor;
}
.btn--filled-inverse:hover {
background-color: rgba(255, 255, 255, 0.9);
border-color: rgba(255, 255, 255, 0.9);
color: var(--color-accent);
}
.btn--filled-inverse:active {
background-color: rgba(255, 255, 255, 0.75);
border-color: rgba(255, 255, 255, 0.75);
transition: none;
}
/* Outline */
.btn--outline {
background-color: transparent;
color: var(--btn-text-dark);
border-color: var(--btn-border-primary);
box-shadow: var(--btn-shadow-none);
min-height: var(--btn-min-height);
}
.btn--outline .btn-icon {
color: currentColor;
}
.btn--outline:hover {
background-color: var(--btn-bg-primary);
border-color: var(--btn-bg-primary);
color: var(--btn-text-light);
}
.btn--outline:active {
background-color: var(--btn-bg-primary-active);
border-color: var(--btn-bg-primary-active);
color: var(--btn-text-light);
transition: none;
}
/* Ghost */
.btn--ghost {
background-color: transparent;
color: var(--btn-text-dark);
border-color: var(--btn-border-ghost);
box-shadow: var(--btn-shadow-none);
}
.btn--ghost .btn-icon {
color: currentColor;
}
.btn--ghost:hover {
background-color: var(--btn-bg-ghost-hover);
border-color: var(--btn-border-ghost-hover);
}
.btn--ghost:active {
background-color: var(--btn-bg-ghost-active);
border-color: var(--btn-border-ghost-active);
transition: none;
}
/* Tertiary */
.btn--tertiary {
background-color: transparent;
color: var(--color-text);
border-color: transparent;
box-shadow: var(--btn-shadow-none);
padding-inline: var(--btn-tertiary-px);
font-weight: 600;
}
.btn--tertiary .btn-icon {
color: currentColor;
}
.btn--tertiary:hover {
text-decoration: underline;
text-underline-offset: 3px;
}
.btn--tertiary:active {
opacity: 0.7;
transition: none;
}
/* Disabled */
.btn:disabled,
.btn[aria-disabled="true"] {
background-color: var(--btn-bg-disabled) !important;
border-color: var(--btn-border-disabled) !important;
color: var(--btn-text-disabled) !important;
box-shadow: none !important;
text-decoration: none !important;
cursor: default !important;
pointer-events: none;
transform: none !important;
}
.btn:disabled .btn-icon,
.btn[aria-disabled="true"] .btn-icon {
color: var(--btn-text-disabled) !important;
}
/* Touch */
@media (hover: none) {
.btn--filled:hover {
background-color: var(--btn-bg-primary);
border-color: var(--btn-bg-primary);
}
.btn--filled-inverse:hover {
background-color: #ffffff;
border-color: #ffffff;
color: var(--color-accent);
}
.btn--outline:hover {
background-color: transparent;
border-color: var(--btn-border-primary);
color: var(--btn-text-dark);
}
.btn--ghost:hover {
background-color: transparent;
border-color: var(--btn-border-ghost);
}
.btn--tertiary:hover {
text-decoration: none;
}
.btn:hover .btn-icon.animate {
transform: none;
}
}
@media (min-width: 768px) {
.btn {
padding: var(--btn-py-lg) var(--btn-px-lg);
}
}