@use "../utilities/css-variables" as cv;
@use "../utilities/derived-variables" as dv;
@use "../utilities/extends";
@use "../utilities/initial-variables" as iv;
@use "../utilities/mixins" as mx;

$hero-body-padding: 3rem 1.5rem !default;
$hero-body-padding-tablet: 3rem 3rem !default;
$hero-body-padding-small: 1.5rem !default;
$hero-body-padding-medium: 9rem 4.5rem !default;
$hero-body-padding-large: 18rem 6rem !default;

$hero-gradient-h-offset: 5deg !default;
$hero-gradient-s-offset: 10% !default;
$hero-gradient-l-offset: 5% !default;

$hero-colors: dv.$colors !default;

// Main container
.#{iv.$class-prefix}hero {
  @include cv.register-vars(
    (
      "hero-body-padding": #{$hero-body-padding},
      "hero-body-padding-tablet": #{$hero-body-padding-tablet},
      "hero-body-padding-small": #{$hero-body-padding-small},
      "hero-body-padding-medium": #{$hero-body-padding-medium},
      "hero-body-padding-large": #{$hero-body-padding-large},
      "hero-gradient-h-offset": #{$hero-gradient-h-offset},
      "hero-gradient-s-offset": #{$hero-gradient-s-offset},
      "hero-gradient-l-offset": #{$hero-gradient-l-offset},
    )
  );
}

.#{iv.$class-prefix}hero {
  align-items: stretch;
  display: flex;
  flex-direction: column;
  justify-content: space-between;

  .#{iv.$class-prefix}navbar {
    background: none;
  }

  .#{iv.$class-prefix}tabs {
    ul {
      border-bottom: none;
    }
  }

  // Colors
  @each $name, $pair in $hero-colors {
    &.#{iv.$class-prefix}is-#{$name} {
      @include cv.register-vars(
        (
          "hero-h": #{cv.getVar($name, "", "-h")},
          "hero-s": #{cv.getVar($name, "", "-s")},
          "hero-background-l": #{cv.getVar($name, "", "-l")},
          "hero-color-l": #{cv.getVar($name, "", "-invert-l")},
        )
      );

      $background-color: hsl(
        #{cv.getVar("hero-h")},
        #{cv.getVar("hero-s")},
        #{cv.getVar("hero-background-l")}
      );
      $color: hsl(
        #{cv.getVar("hero-h")},
        #{cv.getVar("hero-s")},
        #{cv.getVar("hero-color-l")}
      );

      background-color: hsl(
        #{cv.getVar("hero-h")},
        #{cv.getVar("hero-s")},
        #{cv.getVar("hero-background-l")}
      );
      color: $color;

      .#{iv.$class-prefix}navbar {
        @include cv.register-vars(
          (
            "navbar-item-color": $color,
            "navbar-item-hover-background-color": $color,
            "navbar-item-hover-color": $background-color,
            "navbar-item-active-background-color": $color,
            "navbar-item-active-color": $background-color,
          )
        );
      }

      .#{iv.$class-prefix}tabs {
        @include cv.register-vars(
          (
            "tabs-link-color": $color,
            "tabs-boxed-link-active-background-color": $color,
            "tabs-boxed-link-active-border-color": $background-color,
            "tabs-link-active-color": $background-color,
          )
        );
      }

      .#{iv.$class-prefix}subtitle {
        @include cv.register-vars(
          (
            "subtitle-color": $color,
            "subtitle-strong-color": $color,
          )
        );
      }

      .#{iv.$class-prefix}title {
        @include cv.register-vars(
          (
            "title-color": $color,
            "title-strong-color": $color,
          )
        );
      }

      // Modifiers
      &.#{iv.$class-prefix}is-bold {
        $gradient-top-left: hsl(
          calc(#{cv.getVar("hero-h")} - $hero-gradient-h-offset),
          calc(#{cv.getVar("hero-s")} + $hero-gradient-s-offset),
          calc(#{cv.getVar("hero-background-l")} + $hero-gradient-l-offset)
        );
        $gradient-middle: hsl(
          #{cv.getVar("hero-h")},
          #{cv.getVar("hero-s")},
          #{cv.getVar("hero-background-l")}
        );
        $gradient-bottom-right: hsl(
          calc(#{cv.getVar("hero-h")} + $hero-gradient-h-offset),
          calc(#{cv.getVar("hero-s")} - $hero-gradient-s-offset),
          calc(#{cv.getVar("hero-background-l")} - $hero-gradient-l-offset)
        );

        background-image: linear-gradient(
          141deg,
          $gradient-top-left 0%,
          $gradient-middle 71%,
          $gradient-bottom-right 100%
        );

        @include mx.mobile {
          .#{iv.$class-prefix}navbar-menu {
            background-image: linear-gradient(
              141deg,
              $gradient-top-left 0%,
              $color 71%,
              $gradient-bottom-right 100%
            );
          }
        }
      }
    }
  }

  // Sizes
  &.#{iv.$class-prefix}is-small {
    .#{iv.$class-prefix}hero-body {
      padding: cv.getVar("hero-body-padding-small");
    }
  }

  &.#{iv.$class-prefix}is-medium {
    @include mx.tablet {
      .#{iv.$class-prefix}hero-body {
        padding: cv.getVar("hero-body-padding-medium");
      }
    }
  }

  &.#{iv.$class-prefix}is-large {
    @include mx.tablet {
      .#{iv.$class-prefix}hero-body {
        padding: cv.getVar("hero-body-padding-large");
      }
    }
  }

  &.#{iv.$class-prefix}is-halfheight,
  &.#{iv.$class-prefix}is-fullheight,
  &.#{iv.$class-prefix}is-fullheight-with-navbar {
    .#{iv.$class-prefix}hero-body {
      align-items: center;
      display: flex;

      & > .#{iv.$class-prefix}container {
        flex-grow: 1;
        flex-shrink: 1;
      }
    }
  }

  &.#{iv.$class-prefix}is-halfheight {
    min-height: 50vh;
  }

  &.#{iv.$class-prefix}is-fullheight {
    min-height: 100vh;
  }
}

// Components

.#{iv.$class-prefix}hero-video {
  @extend %overlay;
  overflow: hidden;

  video {
    left: 50%;
    min-height: 100%;
    min-width: 100%;
    position: absolute;
    top: 50%;
    transform: translate3d(-50%, -50%, 0);
  }

  // Modifiers
  &.#{iv.$class-prefix}is-transparent {
    opacity: 0.3;
  }

  // Responsiveness
  @include mx.mobile {
    display: none;
  }
}

.#{iv.$class-prefix}hero-buttons {
  margin-top: 1.5rem;

  // Responsiveness
  @include mx.mobile {
    .#{iv.$class-prefix}button {
      display: flex;

      &:not(:last-child) {
        margin-bottom: 0.75rem;
      }
    }
  }

  @include mx.tablet {
    display: flex;
    justify-content: center;

    .#{iv.$class-prefix}button:not(:last-child) {
      margin-inline-end: 1.5rem;
    }
  }
}

// Containers

.#{iv.$class-prefix}hero-head,
.#{iv.$class-prefix}hero-foot {
  flex-grow: 0;
  flex-shrink: 0;
}

.#{iv.$class-prefix}hero-body {
  flex-grow: 1;
  flex-shrink: 0;
  padding: cv.getVar("hero-body-padding");

  @include mx.tablet {
    padding: cv.getVar("hero-body-padding-tablet");
  }
}