module Sass::Extras::Contrast::Functions

Constants

MIN_BRIGHT_DIFF

www.w3.org/WAI/ER/WD-AERT/#color-contrast

MIN_COLOR_DIFF
MIN_CONTRAST_RATE_AA

www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast

MIN_CONTRAST_RATE_AAA
MIN_CONTRAST_RATE_AAA_LARGE_TEXT
MIN_CONTRAST_RATE_AA_LARGE_TEXT

Public Class Methods

included(base) click to toggle source
# File lib/sass/extras/contrast.rb, line 37
def self.included(base)
  base.declare :contrast_color, [:color]
  base.declare :contrast_color, [:color, :seed_color]
  base.declare :contrast_color, [:color, :seed_color, :wcag20_level]
end

Public Instance Methods

contrast_color(color, seed_color = nil, wcag20_level = Sass::Script::String.new("aa")) click to toggle source
# File lib/sass/extras/contrast.rb, line 43
def contrast_color(color, seed_color = nil, wcag20_level = Sass::Script::String.new("aa"))
  seed_color ||= color
  assert_type color, :Color, :color
  assert_type seed_color, :Color, :seed_color
  assert_type wcag20_level, :String, :wcag20_level
  direction = color.brightness > 127 ? darken_method : lighten_method
  new_color = seed_color
  percentage = 0.0
  until conform(new_color, color, wcag20_level.value) || percentage > 100.0
    amount = Sass::Script::Number.new percentage, ['%']
    new_color = send(direction, seed_color, amount)
    percentage += 0.1
  end
  new_color
end

Protected Instance Methods

conform(color1, color2, wcag20_level = "aa") click to toggle source
# File lib/sass/extras/contrast.rb, line 65
def conform(color1, color2, wcag20_level = "aa")
  bright_diff = (color1.brightness - color2.brightness).abs
  color_diff = color1.diff(color2)
  bright_diff >= MIN_BRIGHT_DIFF && color_diff >= MIN_COLOR_DIFF && wcag20_conform(color1, color2, wcag20_level)
end
contrast_ratio(color1, color2) click to toggle source
# File lib/sass/extras/contrast.rb, line 94
def contrast_ratio(color1, color2)
  assert_type color1, :Color
  assert_type color2, :Color
  l1, l2 = color1.luminance, color2.luminance
  l2, l1 = l1, l2 if l2 > l1
  (l1 + 0.05) / (l2 + 0.05)
end
min_contrast_rate(wcag20_level) click to toggle source
# File lib/sass/extras/contrast.rb, line 77
def min_contrast_rate(wcag20_level)
  case wcag20_level.to_s.downcase
  when "aaa_large"
    MIN_CONTRAST_RATE_AAA_LARGE_TEXT
  when "aaa"
    MIN_CONTRAST_RATE_AAA
  when "aa_large"
    MIN_CONTRAST_RATE_AA_LARGE_TEXT
  else
    MIN_CONTRAST_RATE_AA
  end
end
wcag20_conform(color1, color2, wcag20_level = "aa") click to toggle source
# File lib/sass/extras/contrast.rb, line 90
def wcag20_conform(color1, color2, wcag20_level = "aa")
  contrast_ratio(color1, color2) >= min_contrast_rate(wcag20_level)
end

Private Instance Methods

darken_method() click to toggle source
# File lib/sass/extras/contrast.rb, line 108
def darken_method
  respond_to?(:detract_brightness) ? :detract_brightness : :darken
end
lighten_method() click to toggle source
# File lib/sass/extras/contrast.rb, line 104
def lighten_method
  respond_to?(:add_brightness) ? :add_brightness : :lighten
end