@use "sass:map";
@use "vuetify/lib/styles/settings/_index.sass" as vuetify_settings;
@use "@styles/variables/_vuetify.scss" as vuetify;

@mixin themed($property, $light-value, $dark-value) {
  @at-root {
    .v-theme {
      &--light {
        #{$property}: $light-value;
      }

      &--dark {
        #{$property}: $dark-value;
      }
    }
  }
}

// ℹ️ This mixin is inspired from vuetify for adding hover styles via before pseudo element
@mixin before-pseudo() {
  position: relative;

  &::before {
    position: absolute;
    border-radius: inherit;
    background: currentcolor;
    block-size: 100%;
    content: "";
    inline-size: 100%;
    inset: 0;
    opacity: 0;
    pointer-events: none;
  }
}

// ——— Light background generator ——————— //
// ℹ️ With this you have to give text color to the component you want light bg
// e.g. class="avatar-initial text-primary" for primary light bg
@mixin light-bg-provider($component, $inner-selector: "", $opacity: 0.12) {
  .#{$component}.#{$component}-light-bg #{$inner-selector} {
    background-color: transparent !important;

    &.bg-static-white {
      background-color: white !important;
    }

    &::before {
      position: absolute;
      border-radius: inherit;
      background-color: currentcolor;
      content: "";
      inset: 0;
      opacity: $opacity;
      pointer-events: none;
    }
  }
}

@mixin avatar-font-sizes($map: $avatar-sizes) {
  @each $sizeName, $multiplier in vuetify_settings.$size-scales {
    /* stylelint-disable-next-line scss/no-global-function-names */
    $size: map.get($map, $sizeName);

    &.v-avatar--size-#{$sizeName} {
      font-size: #{$size}px;
    }
  }
}

@mixin elevation($z, $important: false) {
  box-shadow: map.get(vuetify.$shadow-key-umbra, $z), map.get(vuetify.$shadow-key-penumbra, $z), map.get(vuetify.$shadow-key-ambient, $z) if($important, !important, null);
}

@mixin bordered-skin($component, $border-property: "border", $important: false) {
  #{$component} {
    box-shadow: none !important;
    #{$border-property}: 1px solid rgba(var(--v-border-color), var(--v-border-opacity)) if($important, !important, null);
  }
}

@mixin selected-states($selector) {
  #{$selector} {
    opacity: calc(var(--v-selected-opacity) * var(--v-theme-overlay-multiplier));
  }

  &:hover
  #{$selector} {
    opacity: calc(var(--v-selected-opacity) + var(--v-hover-opacity) * var(--v-theme-overlay-multiplier));
  }

  &:focus-visible
  #{$selector} {
    opacity: calc(var(--v-selected-opacity) + var(--v-focus-opacity) * var(--v-theme-overlay-multiplier));
  }

  @supports not selector(:focus-visible) {
    &:focus {
      #{$selector} {
        opacity: calc(var(--v-selected-opacity) + var(--v-focus-opacity) * var(--v-theme-overlay-multiplier));
      }
    }
  }
}

@mixin push-anchors() {
  :target {
    scroll-margin-block-start: 90px;
  }
}

@mixin xs {
  @media (width >= 0) and (width <= 599.98px) {
    @content;
  }
}

@mixin sm {
  @media (width >= 600px) and (width <= 959.98px) {
    @content;
  }
}

@mixin md {
  @media (width >= 960px) and (width <= 1279.98px) {
    @content;
  }
}

@mixin lg {
  @media (width >= 1280px) and (width <= 1919.98px) {
    @content;
  }
}

@mixin xl {
  @media (width >= 1920px) {
    @content;
  }
}
