@mixin generate-hover-utility($utility) {
  $values: map-get($utility, values);

  @if type-of($values) == "string" or type-of(nth($values, 1)) != "list" {
    $values: zip($values, $values);
  }

  @each $key, $value in $values {
    $properties: map-get($utility, property);

    @if type-of($properties) == "string" {
      $properties: append((), $properties);
    }

    $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));
    $property-class: if($property-class == null, "", $property-class);
    $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));
    $property-class-modifier: if($key, if($property-class == "", "", "-") + $key, "");

    $is-css-var: map-get($utility, css-var);
    $is-local-vars: map-get($utility, local-vars);

    @if $value != null {
      $escaped-prefix: "hover\\:";
      $selector: ".#{$escaped-prefix}#{$property-class}#{$property-class-modifier}:hover";

      @if $is-css-var {
        #{$selector} {
          --#{$prefix}#{$css-variable-name}: #{$value};
        }
      } @else {
        #{$selector} {
          @each $property in $properties {
            @if $is-local-vars {
              @each $local-var, $variable in $is-local-vars {
                --#{$prefix}#{$local-var}: #{$variable};
              }
            }
            #{$property}: $value if($enable-important-utilities, !important, null);
          }
        }
      }
    }
  }
}

@mixin generate-hover-utilities($utilities-map) {
  @each $name, $utility in $utilities-map {
    @if map-has-key($utility, values) and map-has-key($utility, property) {
      @include generate-hover-utility($utility);
    }
  }
}

@include generate-hover-utilities($utilities);
