@mixin checkbox-configs {
  @include checkbox-tokens;
  @include checkbox-default;
  @include checkbox-label;
  @include checkbox-hidden-label;
  @include checkbox-checked;
  @include checkbox-indeterminate;
  @include checkbox-colors;
  @include checkbox-sizes;
  @include checkbox-states;
  @include checkbox-dark-mode;
}

@mixin checkbox-tokens {
  --checkbox-padding: var(--spacing-scale-base);
  --checkbox-size: 24px;
}

@mixin checkbox-default {
  display: flex;
  position: relative;

  & + & {
    margin-top: var(--spacing-scale-base);
  }

  input {
    margin: 0;
    opacity: 0;
    position: absolute;

    + label {
      cursor: pointer;
      display: inline-block;
      margin-bottom: 0; // zerar margem padrão de labels
      min-height: var(--checkbox-size);
      min-width: var(--checkbox-size);
      padding-left: calc(var(--spacing-scale-base) + var(--checkbox-size));
      position: relative;

      &::before {
        background: var(--background-light);
        border: 1px solid var(--border-color);
        border-radius: 4px;
        content: "";
        height: var(--checkbox-size);
        left: 0;
        position: absolute;
        width: var(--checkbox-size);
      }

      &:empty {
        padding: 0;
      }
    }
  }
}

@mixin checkbox-label {
  label {
    font-weight: var(--font-weight-medium);
  }
}

@mixin checkbox-hidden-label {
  &.hidden-label {
    label {
      padding-left: calc(var(--checkbox-size) + var(--surface-width-md) * 2);
      text-indent: -10000px;
      white-space: nowrap;
      width: 0;
    }
  }
}

@mixin checkbox-checked {
  input {
    &:checked,
    &:indeterminate {
      & + label::after {
        border: solid var(--selected);
        border-width: 0 3px 3px 0;
        content: "";
        height: var(--icon-size-sm);
        left: 8px;
        position: absolute;
        top: 4px;
        transform: rotate(45deg);
        width: 8px;
      }
    }
  }
}

@mixin checkbox-indeterminate {
  input[indeterminate],
  input:indeterminate {
    + label {
      &::before {
        --interactive-rgb: var(--color-rgb);
        background: var(--selected);
        border-color: var(--selected);
      }
    }

    &:hover:not(:disabled) {
      + label::before {
        --interactive-rgb: var(--color-dark-rgb);
      }
    }

    &:checked + label,
    + label {
      &::after {
        border-color: var(--background-light);
        border-width: 0 0 3px;
        top: 2px;
        transform: none;
      }
    }
  }
}

@mixin checkbox-states {
  input {
    // Inválido
    &:invalid {
      + label::before {
        --border-color: var(--danger);
      }
    }
    // Focus
    &:focus-visible,
    &.focus-visible {
      &:checked + label::before,
      + label::before {
        @include focus-soft;
      }
    }
    //hover
    &:hover:not(:disabled) {
      + label::before {
        --interactive-rgb: var(--interactive-light-rgb);
        background-image: linear-gradient(
          rgba(var(--interactive-rgb), var(--hover)),
          rgba(var(--interactive-rgb), var(--hover))
        );
      }
    }
  }

  &:not(.disabled) {
    input {
      &:disabled + label {
        @include disabled;
      }
    }
  }
}

@mixin checkbox-colors {
  @each $state, $color in (invalid, danger), (valid, success) {
    &.is-#{$state},
    &.#{$state},
    &[#{$state}] {
      input {
        + label::before {
          --border-color: var(--#{$color});
        }

        &:focus-visible,
        &.focus-visible {
          &:checked + label::before,
          + label::before {
            --border-color: var(--focus-color);
          }
        }
        // Checado
        &:checked + label::before {
          --border-color: var(--#{$color});
        }
      }
    }
  }
}

// TODO: Remover na próxima versão
@mixin checkbox-sizes {
  // Versão pequena
  &.is-small,
  &.small,
  &[small] {
    input {
      // Texto
      + label {
        line-height: var(--spacing-scale-2xh);
        min-height: var(--spacing-scale-2xh);
      }
      // Caixa
      + label::before {
        height: var(--spacing-scale-2xh);
        width: var(--spacing-scale-2xh);
      }
      // Checado
      &:checked {
        + label::after {
          border-width: 0 2px 2px 0;
          height: var(--icon-size-sm);
          left: 7px;
          top: 4px;
          width: 6px;
        }
      }

      &[indeterminate],
      &:indeterminate {
        + label::after {
          border-color: var(--background-light);
          border-width: 0 0 3px;
          left: 7px;
          top: 1px;
          transform: none;
          width: 6px;
        }
      }
    }
  }
}

@mixin checkbox-dark-mode {
  &.inverted,
  &.dark-mode {
    &,
    label {
      color: var(--color-dark);
    }
  }
}
