.btn {
  --btn-background: var(--color-bg);
  --hover-color: oklch(from var(--btn-background) calc(l * .95) c h);

  align-items: center;
  background-color: var(--btn-background);
  border-radius: var(--btn-radius, var(--rounded-xs));
  box-shadow: var(--btn-box-shadow, var(--shadow-xs));
  color: var(--btn-color, var(--color-text));
  cursor: pointer;
  display: inline-flex;
  font-size: var(--btn-font-size, var(--text-sm));
  font-weight: var(--btn-font-weight, var(--font-medium));
  gap: var(--size-2);
  inline-size: var(--btn-inline-size, auto);
  justify-content: var(--btn-justify-content, center);
  min-block-size: var(--btn-block-size, var(--size-9));
  padding: var(--btn-padding, .375rem 1rem);
  text-align: center;
  white-space: nowrap;

  img:not([class]) {
    filter: var(--btn-icon-color, var(--color-filter-text));
  }

  &:hover {
    background-color: var(--btn-hover-color, var(--hover-color));
  }

  &:focus-visible {
    outline: var(--btn-outline-size, 2px) solid var(--color-selected-dark);
  }

  &:is(:disabled, [aria-disabled]) {
    opacity: var(--opacity-50); pointer-events: none;
  }

  &.btn--fullwidth {
    inline-size: -moz-available
  }

  &.btn--start {
    --btn-justify-content: start;
  }

  &.slim {
    --btn-block-size: var(--size-5);

    block-size: var(--btn-block-size);
    font-size: smaller;
  }
}

.btn--primary {
  --btn-background: var(--color-primary);
  --btn-border-color: transparent;
  --btn-color: var(--color-text-reversed);
  --btn-icon-color: var(--color-filter-text-reversed);
}

.btn--primary:hover {
  --btn-background: var(--color-primary-hover);
  color: var(--color-text-reversed);
}

.btn--secondary {
  --btn-background: var(--color-secondary);
  --btn-border-color: transparent;
}

.btn--borderless {
  --btn-border-color: transparent;
  --btn-box-shadow: none;
  border: none;

  background-color: transparent;
}

.btn--positive {
  --btn-background: var(--color-positive);
  --btn-border-color: transparent;
  --btn-color: white;
  --btn-icon-color: invert(1);
}

.btn--negative {
  --btn-background: var(--color-negative);
  --btn-border-color: transparent;
  --btn-color: white;
  --btn-icon-color: invert(1);
}

.btn--info {
  --btn-background: var(--color-info);
  --btn-border-color: transparent;
  --btn-color: white;
  --btn-icon-color: invert(1);
}

.btn--warning {
  --btn-background: var(--color-warning);
  --btn-border-color: transparent;
  --btn-color: white;
  --btn-icon-color: invert(1);
}

.btn--plain {
  --btn-background: transparent;
  --btn-block-size: auto;
  --btn-border-color: transparent;
  --btn-hover-color: transparent;
  --btn-padding: 0;
  --btn-box-shadow: none;

  border: none;
}

.btn--icon {
  --btn-padding: var(--size-2);
  --btn-radius: var(--rounded-full);
}

.btn--white {
  background-color: #fff;
  border-color: #e7eaf3;
}

.btn i {
  vertical-align: middle;
  font-size: 1rem;
  margin-top: -1em;
  margin-bottom: -1em;
}

.btn-group.form > form > .btn {
  padding: 0;
}

.btn-group.form > .btn > .btn {
  border: none;
  background: none;
}

.btn--loading {
  position: relative;
  
  > * { 
    visibility: hidden; 
  }

  &::after {
    animation: spin 1s linear infinite;
    border: 2px solid rgba(255, 255, 255, 0.3);
    border-radius: 50%;
    border-top: 2px solid white;
    content: "";
    height: 16px;
    left: 50%;
    position: absolute;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 16px;
  }
}

button.btn--loading {
  color: transparent;
}

@keyframes spin {
  0% { transform: translate(-50%, -50%) rotate(0deg); }
  100% { transform: translate(-50%, -50%) rotate(360deg); }
}

.btn--ready {
  position: relative;

  &::before {
    background-color: var(--color-positive, #22c55e);
    border: 2px solid white;
    border-radius: 50%;
    content: "";
    height: 24px;
    position: absolute;
    right: -9px;
    top: -9px;
    width: 24px;
    z-index: 1;
  }

  &::after {
    color: white;
    content: "✓";
    font-size: 8px;
    font-weight: bold;
    line-height: 1;
    position: absolute;
    right: -1px;
    top: -1px;
    z-index: 2;
  }
}
