﻿.badge {
  --badge-gap: 0.25rem;

  display: inline-flex;
  align-items: center;
  gap: var(--badge-gap);

  max-width: var(--badge-max-width, 100%);
  border: 1px solid var(--badge-border-color, transparent);
  border-radius: $border-radius-base;
  font-weight: $font-weight-medium;
  line-height: 1;
  white-space: nowrap;

  @include e(icon) {
    color: inherit;
    flex: none;

    width: var(--badge-icon-size);
    height: var(--badge-icon-size);
    font-size: var(--badge-icon-size);
    line-height: var(--badge-icon-size);

    @include m(slot) {
      display: inline-flex;
      align-items: center;
      justify-content: center;

      &:empty {
        display: none;
      }

      > * {
        width: var(--badge-icon-size);
        height: var(--badge-icon-size);
        font-size: var(--badge-icon-size);
        line-height: var(--badge-icon-size);
        color: inherit;
      }
    }
  }

  @include e(label) {
    display: block;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;

    line-height: calc(4 / 3);
  }

  /* #Sizes */
  @include m(small) {
    @include badge-size(1px, 6px, $font-size-xs, 12px);
  }

  @include m(medium) {
    @include badge-size(3px, 8px, $font-size-xs, 12px);
  }

  @include m(large) {
    @include badge-size(6px, 12px, $font-size-md, 16px);
  }

  /* #Variants */
  @include m(default) {
    background-color: var(--color-gray-100);
    color: var(--color-gray-600);
  }

  @include m(success) {
    background-color: var(--color-success--opacity);
    color: var(--color-success);
  }

  @include m(warning) {
    background-color: var(--color-warning-opacity);
    color: var(--color-warning);
  }

  @include m(danger) {
    background-color: var(--color-error-opacity);
    color: var(--color-error);
  }

  @include m(info) {
    background-color: rgba(var(--color-info-rgb), 0.06);
    color: var(--color-info);
  }

  @include m(bordered) {
    &.badge--default {
      --badge-border-color: var(--color-default-border);
    }

    &.badge--success {
      --badge-border-color: var(--color-success-border);
    }

    &.badge--warning {
      --badge-border-color: var(--color-warning-border);
    }

    &.badge--danger {
      --badge-border-color: var(--color-error-border);
    }

    &.badge--info {
      --badge-border-color: var(--color-info-border);
    }
  }

  /* #Interactive */
  // A badge that can be clicked: a status label that opens a menu
  @include m(interactive) {
    cursor: pointer;

    // Inset, so the ring is drawn inside the badge's own border box. An outset
    // ring needs 4px of clear space on every side and gets shaved by any
    // ancestor that clips, which in a table cell is routine: the badge sits
    // flush against the cell's padding edge. Negative offset makes it immune to
    // that everywhere instead of per container.
    &:focus-visible {
      outline: 2px solid var(--color-info);
      outline-offset: -2px;
    }
  }
}
