/**
 * Ouput selectors and properties to vertically center elements inside their parent.
 * 
 * @param {string} $to-align (()) - The selector to match the elements which you wish to align vertically. The targeted elements should be inline or inline-block elements.
 * @param {string} $align (middle) - The vertical-align value, e.g. top, middle, bottom
 * @param {string} $pseudo-element (after) - Which pseudo element to use for the vertical align guide
 * 
 * @group util
 */
@mixin valo-vertical-align-guide ($to-align: (), $align: middle, $pseudo-element: after) {
  &:#{$pseudo-element} {
    content: "";
    display: inline-block;
    width: 0;
    height: 100%;
    vertical-align: middle;
  }

  @if length($to-align) > 0 {
    @each $selector in $to-align {
      & > #{$selector} {
        vertical-align: $align;
      }
    }
  }
}


/**
 * Indicate that an element is clickable/tappable
 * 
 * @group util
 */
@mixin valo-tappable {
  -webkit-tap-highlight-color: rgba(0,0,0,0);
  -webkit-touch-callout: none;
  cursor: pointer;
}


/**
 * Output Vaadin Responsive extension specific width-range declaration.
 * 
 * @param {size} $min (0) - The lower bound for the width-range
 * @param {size} $max (null) - The upper bound for the width-range
 * 
 * @group util
 * 
 * @example scss
 * .v-ui {
 *   font-size: 18px;
 *   
 *   // Make the font-size smaller for 481px-768px wide UIs
 *   @include width-range(481px, 768px) {
 *     font-size: 16px;
 *   }
 *   
 *   // Make it even smaller for UIs narrower than 480px
 *   @include width-range($max: 480px) {
 *     font-size: 14px;
 *   }
 * }
 */
@mixin width-range($min: 0, $max: null) {
  &[width-range~="#{$min}-#{$max}"] {
    @content;
  }
}

/**
 * Output Vaadin Responsive extension specific height-range declaration.
 * 
 * @param {size} $min (0) - The lower bound for the height-range
 * @param {size} $max (null) - The upper bound for the height-range
 * 
 * @group util
 * 
 * @example scss
 * .v-csslayout {
 *   color: red;
 *   
 *   // Make the text color blue when the layout height is between 100px-300px
 *   @include height-range(100px, 300px) {
 *     color: blue;
 *   }
 * }
 */
@mixin height-range($min: 0, $max: null) {
  &[height-range~="#{$min}-#{$max}"] {
    @content;
  }
}
