.base {
  --bg: transparent;
  --bg-hover: color-mix(in srgb, var(--bg) 90%, var(--fg));
  --fg: var(--color-text-primary);

  background-color: var(--bg);
  border-radius: var(--radius-round);
  color: var(--fg);
  transition:
    background-color 200ms,
    color 200ms,
    opacity 200ms;
  border: 0;
  appearance: none;
  cursor: pointer;
  display: inline-flex;
  justify-content: center;
  align-items: center;
  font-size: var(--fs-sm);
  line-height: 1;
  box-sizing: border-box;

  &:hover:not(
      :active,
      :disabled,
      [aria-pressed='true'],
      [aria-expanded='true']
    ) {
    background-color: var(--bg-hover);
  }

  &:focus-visible,
  &:focus-within {
    outline: 2px solid var(--color-bg-brand-base);
    outline-offset: 2px;
  }

  &:disabled {
    cursor: not-allowed;
    opacity: 0.5;
  }
}

// Override default anchor styles
a.base {
  &:focus {
    border-radius: var(--radius-round);
  }

  &:hover {
    text-decoration: inherit;
  }
}

// Sizes

.xs {
  padding: var(--space-3xs) var(--space-2xs);
  font-size: var(--fs-2xs);
  min-height: 20px;
}

.sm {
  padding: var(--space-xs);
  min-height: 32px;
}

.md {
  padding: var(--space-xs) var(--space-sm);
  min-height: 40px;
}

.lg {
  padding: var(--space-sm) var(--space-md);
  min-height: 48px;
}

// Solid variant

.solid {
  --bg: var(--color-bg-inverted);
  --fg: var(--color-text-inverted);

  &.accent {
    --bg: var(--color-bg-brand-base);
    --bg-hover: var(--color-bg-brand-base-hover);
  }

  .neutral {
    // This technically is a duplicate, but it's added so TS realizes this class is an option.
    --bg: var(--color-bg-inverted);
    --fg: var(--color-text-inverted);
  }

  &.tonal:not(:active, [aria-pressed='true'], [aria-expanded='true']) {
    --bg: var(--color-bg-highlight);
    --fg: var(--color-text-primary);
  }

  &.destructive {
    --bg: var(--color-bg-error-base);
    --bg-hover: var(--color-bg-error-base-hover);
  }
}

// Ghost

.ghost {
  &:active,
  &[aria-pressed='true'],
  &[aria-expanded='true'] {
    --bg: var(--color-bg-inverted);
    --fg: var(--color-text-inverted);
  }

  &.accent {
    --fg: var(--color-text-brand);

    &:active,
    &[aria-pressed='true'],
    &[aria-expanded='true'] {
      --bg: var(--color-bg-brand-base);
      --fg: var(--color-text-on-brand-base);
    }
  }

  &.destructive {
    --fg: var(--color-text-error);

    &:active,
    &[aria-pressed='true'],
    &[aria-expanded='true'] {
      --fg: var(--color-text-on-error-base);
      --bg: var(--color-bg-error-base);
    }
  }
}

// Helper classes

.icon,
.loading {
  width: var(--fs-xl);
  height: var(--fs-xl);
}

// Adds padding to the text label. This is supposed to be there even if there is no icon.
.content {
  display: inline-block;
  margin: 0 var(--space-2xs);

  .xs & {
    margin: 0 var(--space-3xs);
  }
}

.iconOnly {
  aspect-ratio: 1;
  padding: 0;
}

.loading {
  color: inherit;
}
