@use '../compiled/tokens/scss/breakpoint';
@use '../compiled/tokens/scss/font-weight';
@use '../compiled/tokens/scss/line-height';
@use '../compiled/tokens/scss/size';
@use 'fluid';
@use 'ms';
@use 'sass:map';
@use 'sass:meta';

$size-tokens: meta.module-variables('size');

/// Mixin for applying heading styles at a particular level. Accepts an argument
/// so it may be easily baked into "for" loops.
/// @param {number} $level
@mixin level($level, $include-weight: true) {
  // Build token name to check for
  $token-name-root: 'font-heading-' + ms.step-class-segment($level);

  // Get minimum size token
  $min-size: map.get($size-tokens, $token-name-root + '-min');

  // Get maximum size token
  $max-size: map.get($size-tokens, $token-name-root + '-max');

  // If tokens were found...
  @if $min-size and $max-size {
    // Output a fluid font size
    font-size: fluid.fluid-clamp(
      $min-size,
      $max-size,
      breakpoint.$xs,
      breakpoint.$l
    );

    // Line heights above standard heading levels should be tighter
    @if $level < 1 {
      line-height: line-height.$tighter;
    } @else {
      line-height: line-height.$tight;
    }
  } @else {
    // Otherwise, assume this is a lower heading level
    font-size: inherit;
    line-height: inherit;
  }

  @if $include-weight {
    // Consistently bold headings to differentiate from normal copy
    font-weight: font-weight.$bold;
  }
}
