class Swatches::TintCalculator

Constants

BLACK
WHITE

Public Class Methods

new(base_color) click to toggle source
# File lib/swatches/tint_calculator.rb, line 9
def initialize(base_color)
  @base_color = base_color
  @context = Sass::Script::Functions::EvaluationContext.new({})
end

Public Instance Methods

generate_color_for_lightness(target_lightness) click to toggle source
# File lib/swatches/tint_calculator.rb, line 14
def generate_color_for_lightness(target_lightness)
  return @base_color if lightness_equal?(target_lightness, @base_color.lightness)
  return WHITE if lightness_equal?(target_lightness, 100)
  return BLACK if lightness_equal?(target_lightness, 0)
  if target_lightness > @base_color.lightness
    search_for_color(target_lightness, 0, 100, WHITE)
  else
    search_for_color(target_lightness, 0, 100, BLACK)
  end
end

Private Instance Methods

lightness_equal?(l1, l2) click to toggle source
# File lib/swatches/tint_calculator.rb, line 48
def lightness_equal?(l1, l2)
  l1.round(1) == l2.round(1)
end
search_for_color(target_lightness, low_mix_percentage, high_mix_percentage, mix_color) click to toggle source
# File lib/swatches/tint_calculator.rb, line 30
def search_for_color(target_lightness, low_mix_percentage, high_mix_percentage, mix_color)
  low_color = @context.mix(mix_color, @base_color, Sass::Script::Number.new(low_mix_percentage))
  high_color = @context.mix(mix_color, @base_color, Sass::Script::Number.new(high_mix_percentage))
  return low_color if lightness_equal?(low_color.lightness, target_lightness)
  return high_color if lightness_equal?(high_color.lightness, target_lightness)
  if (low_color.lightness - high_color.lightness).abs < 0.1
    return low_color
  end
  low_distance = (target_lightness - low_color.lightness).abs
  high_distance = (target_lightness - high_color.lightness).abs
  halfway_mix_percentage = (low_mix_percentage + high_mix_percentage) / 2.0
  if low_distance < high_distance
    search_for_color(target_lightness, low_mix_percentage, halfway_mix_percentage, mix_color)
  else
    search_for_color(target_lightness, halfway_mix_percentage, high_mix_percentage, mix_color)
  end
end