 .size(@square) {
  @unit: 'px';
  .process(@square) when (ispixel(@square)), (isem(@square)), (ispercentage(@square)), (iskeyword(@square)) {
    width: @square;
    height: @square;
  }

  .process(@square) when not (ispixel(@square)) and not (isem(@square)) and not (ispercentage(@square)) and not (isstring(@square)) and not (iskeyword(@square)) {
    width: ~`@{square} + @{unit}`;
    height: ~`@{square} + @{unit}`;
  }

  .process(@square);

}

.size(@width, @height) {
  @unit: 'px';
  .process(@width, @height) when (ispixel(@width)), (isem(@width)), (ispercentage(@width)), (iskeyword(@width)) {
    .kittens(@height) when (ispixel(@height)), (isem(@height)), (ispercentage(@height)), (iskeyword(@height)) {
      width: @width;
      height: @height;
    }
    .kittens(@height) when not (ispixel(@height)) and not (isem(@height)) and not (ispercentage(@height)) and not (iskeyword(@height)) {
      width: @width;
      height: ~`@{height} + @{unit}`;
    }
    .kittens(@height);
  }

  .process(@width, @height) when (ispixel(@height)), (isem(@height)), (ispercentage(@height)), (iskeyword(@height)) {
    .kittens(@width) when (ispixel(@width)), (isem(@width)), (ispercentage(@width)), (iskeyword(@width)) {}
    .kittens(@width) when not (ispixel(@width)) and not (isem(@width)) and not (ispercentage(@width)) and not (iskeyword(@width)) {
      width: ~`@{width} + @{unit}`;
      height: @height;
    }
    .kittens(@width);
  }

  .process(@width, @height) when not (ispixel(@width)) and not (isem(@width)) and not (ispercentage(@width)) and not (iskeyword(@width)) and not (ispixel(@height)) and not (isem(@height)) and not (ispercentage(@height)) and not (iskeyword(@height))  {
    width: ~`@{width} + @{unit}`;
    height: ~`@{height} + @{unit}`;
  }

  .process(@width, @height);

}
