@use "../functions" as *;
@use "../mixins/focus-ring" as *;
@use "../mixins/mask-icon" as *;
@use "../mixins/tokens" as *;
@use "../mixins/transition" as *;

// stylelint-disable custom-property-no-missing-var-function
$check-tokens: () !default;

// scss-docs-start check-tokens
// stylelint-disable-next-line scss/dollar-variable-default
$check-tokens: defaults(
  (
    --check-size: 1.25rem,
    --check-margin-block: .125rem,
    --check-bg: var(--bg-body),
    --check-border-color: var(--border-color),
    --check-border-radius: var(--radius-5),
    --check-icon-checked: #{escape-svg(url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5.5 10 3 3 6-6'/></svg>"))},
    --check-icon-indeterminate: #{escape-svg(url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M6 10h8'/></svg>"))},
    --check-checked-bg: var(--control-checked-bg),
    --check-checked-border-color: var(--control-checked-border-color),
    --check-indeterminate-bg: var(--control-checked-bg),
    --check-indeterminate-border-color: var(--control-checked-border-color),
    --check-active-bg: var(--control-active-bg),
    --check-active-border-color: var(--control-active-border-color),
    --check-disabled-bg: var(--control-disabled-bg),
    --check-disabled-opacity: var(--control-disabled-opacity),
  ),
  $check-tokens
);
// scss-docs-end check-tokens
// stylelint-enable custom-property-no-missing-var-function

@layer forms {
  // The class lives on the `<input>` itself; `appearance: none` controls render
  // pseudo-elements, so the mark is drawn directly on the input — no wrapper.
  .check {
    @include tokens($check-tokens);

    position: relative;
    flex-shrink: 0;
    width: var(--check-size);
    height: var(--check-size);
    margin-block: var(--check-margin-block);
    appearance: none;
    // later: maybe set a tertiary bg color?
    background-color: var(--theme-bg, var(--check-bg));
    border: 1px solid var(--theme-bg, var(--check-border-color));
    // stylelint-disable-next-line property-disallowed-list
    border-radius: 33%;
    @include transition(
      background-color var(--control-transition-duration) var(--control-transition-timing),
      border-color var(--control-transition-duration) var(--control-transition-timing)
    );

    // Check/indeterminate mark, overlaid on the input and rendered via a CSS
    // mask so it inherits the contrast color without an inline SVG. Always
    // present but scaled/faded out until checked so it can pop in. `mask-image`
    // cannot be transitioned, so the tick stays masked in every state — drop it
    // and the mark would flash as a solid block while fading out on uncheck.
    &::before {
      position: absolute;
      inset: 0;
      pointer-events: none;
      content: "";
      background-color: var(--theme-contrast, var(--primary-contrast));
      opacity: 0;
      transform: scale(0);
      @include mask-icon(var(--check-icon-checked));
      @include transition(
        opacity var(--control-transition-duration) var(--control-transition-timing),
        transform var(--control-transition-duration) var(--control-transition-timing)
      );
    }

    &:checked,
    &:indeterminate {
      background-color: var(--theme-bg, var(--check-checked-bg));
      border-color: var(--theme-bg, var(--check-checked-border-color));

      &::before {
        opacity: 1;
        transform: scale(1);
      }
    }

    &:indeterminate::before { mask-image: var(--check-icon-indeterminate); }

    &:focus-visible {
      @include focus-ring(true);
      --focus-ring-offset: -1px;
    }

    &:disabled {
      --check-bg: var(--check-disabled-bg);

      ~ label {
        color: var(--fg-3);
        cursor: default;
      }
    }
    &:disabled:checked {
      opacity: var(--check-disabled-opacity);
    }
  }

  .check-sm {
    --check-size: 1rem;

    + label {
      font-size: var(--font-size-sm);
    }
  }
  .check-lg {
    --check-size: 1.5rem;
    --check-margin-block: .375rem;

    + label {
      font-size: var(--font-size-lg);
    }
  }
}
