Module: TableTennis::Util::Colors
- Includes:
- MemoWise
- Defined in:
- lib/table_tennis/util/colors.rb
Overview
Named color names and misc color helpers.
Constant Summary collapse
- NAMED =
{ # # css colors # https://htmlcolorcodes.com/color-names/ # # red "indianred" => "#cd5c5c", "lightcoral" => "#f08080", "salmon" => "#fa8072", "darksalmon" => "#e9967a", "lightsalmon" => "#ffa07a", "crimson" => "#dc143c", "red" => "#ff0000", "firebrick" => "#b22222", "darkred" => "#8b0000", # pink "pink" => "#ffc0cb", "lightpink" => "#ffb6c1", "hotpink" => "#ff69b4", "deeppink" => "#ff1493", "mediumvioletred" => "#c71585", "palevioletred" => "#db7093", # orange # "lightsalmon" => "#ffa07a", "coral" => "#ff7f50", "tomato" => "#ff6347", "orangered" => "#ff4500", "darkorange" => "#ff8c00", "orange" => "#ffa500", # gold "gold" => "#ffd700", "yellow" => "#ffff00", "lightyellow" => "#ffffe0", "lemonchiffon" => "#fffacd", "lightgoldenrodyellow" => "#fafad2", "papayawhip" => "#ffefd5", "moccasin" => "#ffe4b5", "peachpuff" => "#ffdab9", "palegoldenrod" => "#eee8aa", "khaki" => "#f0e68c", "darkkhaki" => "#bdb76b", # purple "lavender" => "#e6e6fa", "thistle" => "#d8bfd8", "plum" => "#dda0dd", "violet" => "#ee82ee", "orchid" => "#da70d6", "fuchsia" => "#ff00ff", "magenta" => "#ff00ff", "mediumorchid" => "#ba55d3", "mediumpurple" => "#9370db", "rebeccapurple" => "#663399", "blueviolet" => "#8a2be2", "darkviolet" => "#9400d3", "darkorchid" => "#9932cc", "darkmagenta" => "#8b008b", "purple" => "#800080", "indigo" => "#4b0082", "slateblue" => "#6a5acd", "darkslateblue" => "#483d8b", # "mediumslateblue" => "#7b68ee", # green "greenyellow" => "#adff2f", "chartreuse" => "#7fff00", "lawngreen" => "#7cfc00", "lime" => "#00ff00", "limegreen" => "#32cd32", "palegreen" => "#98fb98", "lightgreen" => "#90ee90", "mediumspringgreen" => "#00fa9a", "springgreen" => "#00ff7f", "mediumseagreen" => "#3cb371", "seagreen" => "#2e8b57", "forestgreen" => "#228b22", "green" => "#008000", "darkgreen" => "#006400", "yellowgreen" => "#9acd32", "olivedrab" => "#6b8e23", "olive" => "#808000", "darkolivegreen" => "#556b2f", "mediumaquamarine" => "#66cdaa", "darkseagreen" => "#8fbc8b", "lightseagreen" => "#20b2aa", "darkcyan" => "#008b8b", "teal" => "#008080", # blue "aqua" => "#00ffff", "cyan" => "#00ffff", "lightcyan" => "#e0ffff", "paleturquoise" => "#afeeee", "aquamarine" => "#7fffd4", "turquoise" => "#40e0d0", "mediumturquoise" => "#48d1cc", "darkturquoise" => "#00ced1", "cadetblue" => "#5f9ea0", "steelblue" => "#4682b4", "lightsteelblue" => "#b0c4de", "powderblue" => "#b0e0e6", "lightblue" => "#add8e6", "skyblue" => "#87ceeb", "lightskyblue" => "#87cefa", "deepskyblue" => "#00bfff", "dodgerblue" => "#1e90ff", "cornflowerblue" => "#6495ed", "mediumslateblue" => "#7b68ee", "royalblue" => "#4169e1", "blue" => "#0000ff", "mediumblue" => "#0000cd", "darkblue" => "#00008b", "navy" => "#000080", "midnightblue" => "#191970", # brown "cornsilk" => "#fff8dc", "blanchedalmond" => "#ffebcd", "bisque" => "#ffe4c4", "navajowhite" => "#ffdead", "wheat" => "#f5deb3", "burlywood" => "#deb887", "tan" => "#d2b48c", "rosybrown" => "#bc8f8f", "sandybrown" => "#f4a460", "goldenrod" => "#daa520", "darkgoldenrod" => "#b8860b", "peru" => "#cd853f", "chocolate" => "#d2691e", "saddlebrown" => "#8b4513", "sienna" => "#a0522d", "brown" => "#a52a2a", "maroon" => "#800000", # white "white" => "#ffffff", "snow" => "#fffafa", "honeydew" => "#f0fff0", "mintcream" => "#f5fffa", "azure" => "#f0ffff", "aliceblue" => "#f0f8ff", "ghostwhite" => "#f8f8ff", "whitesmoke" => "#f5f5f5", "seashell" => "#fff5ee", "beige" => "#f5f5dc", "oldlace" => "#fdf5e6", "floralwhite" => "#fffaf0", "ivory" => "#fffff0", "antiquewhite" => "#faebd7", "linen" => "#faf0e6", "lavenderblush" => "#fff0f5", "mistyrose" => "#ffe4e1", # gray "gainsboro" => "#dcdcdc", "lightgray" => "#d3d3d3", "silver" => "#c0c0c0", "darkgray" => "#a9a9a9", "gray" => "#808080", "dimgray" => "#696969", "lightslategray" => "#778899", "slategray" => "#708090", "darkslategray" => "#2f4f4f", "black" => "#000000", # # tailwind # "slate-50" => "#f8fafc", "slate-100" => "#f1f5f9", "slate-200" => "#e2e8f0", "slate-300" => "#cbd5e1", "slate-400" => "#94a3b8", "slate-500" => "#64748b", "slate-600" => "#475569", "slate-700" => "#334155", "slate-800" => "#1e293b", "slate-900" => "#0f172a", "gray-50" => "#f9fafb", "gray-100" => "#f3f4f6", "gray-200" => "#e5e7eb", "gray-300" => "#d1d5db", "gray-400" => "#9ca3af", "gray-500" => "#6b7280", "gray-600" => "#4b5563", "gray-700" => "#374151", "gray-800" => "#1f2937", "gray-900" => "#111827", "zinc-50" => "#fafafa", "zinc-100" => "#f4f4f5", "zinc-200" => "#e4e4e7", "zinc-300" => "#d4d4d8", "zinc-400" => "#a1a1aa", "zinc-500" => "#71717a", "zinc-600" => "#52525b", "zinc-700" => "#3f3f46", "zinc-800" => "#27272a", "zinc-900" => "#18181b", "neutral-50" => "#fafafa", "neutral-100" => "#f5f5f5", "neutral-200" => "#e5e5e5", "neutral-300" => "#d4d4d4", "neutral-400" => "#a3a3a3", "neutral-500" => "#737373", "neutral-600" => "#525252", "neutral-700" => "#404040", "neutral-800" => "#262626", "neutral-900" => "#171717", "stone-50" => "#fafaf9", "stone-100" => "#f5f5f4", "stone-200" => "#e7e5e4", "stone-300" => "#d6d3d1", "stone-400" => "#a8a29e", "stone-500" => "#78716c", "stone-600" => "#57534e", "stone-700" => "#44403c", "stone-800" => "#292524", "stone-900" => "#1c1917", "red-50" => "#fef2f2", "red-100" => "#fee2e2", "red-200" => "#fecaca", "red-300" => "#fca5a5", "red-400" => "#f87171", "red-500" => "#ef4444", "red-600" => "#dc2626", "red-700" => "#b91c1c", "red-800" => "#991b1b", "red-900" => "#7f1d1d", "orange-50" => "#fff7ed", "orange-100" => "#ffedd5", "orange-200" => "#fed7aa", "orange-300" => "#fdba74", "orange-400" => "#fb923c", "orange-500" => "#f97316", "orange-600" => "#ea580c", "orange-700" => "#c2410c", "orange-800" => "#9a3412", "orange-900" => "#7c2d12", "amber-50" => "#fffbeb", "amber-100" => "#fef3c7", "amber-200" => "#fde68a", "amber-300" => "#fcd34d", "amber-400" => "#fbbf24", "amber-500" => "#f59e0b", "amber-600" => "#d97706", "amber-700" => "#b45309", "amber-800" => "#92400e", "amber-900" => "#78350f", "yellow-50" => "#fefce8", "yellow-100" => "#fef9c3", "yellow-200" => "#fef08a", "yellow-300" => "#fde047", "yellow-400" => "#facc15", "yellow-500" => "#eab308", "yellow-600" => "#ca8a04", "yellow-700" => "#a16207", "yellow-800" => "#854d0e", "yellow-900" => "#713f12", "lime-50" => "#f7fee7", "lime-100" => "#ecfccb", "lime-200" => "#d9f99d", "lime-300" => "#bef264", "lime-400" => "#a3e635", "lime-500" => "#84cc16", "lime-600" => "#65a30d", "lime-700" => "#4d7c0f", "lime-800" => "#3f6212", "lime-900" => "#365314", "green-50" => "#f0fdf4", "green-100" => "#dcfce7", "green-200" => "#bbf7d0", "green-300" => "#86efac", "green-400" => "#4ade80", "green-500" => "#22c55e", "green-600" => "#16a34a", "green-700" => "#15803d", "green-800" => "#166534", "green-900" => "#14532d", "emerald-50" => "#ecfdf5", "emerald-100" => "#d1fae5", "emerald-200" => "#a7f3d0", "emerald-300" => "#6ee7b7", "emerald-400" => "#34d399", "emerald-500" => "#10b981", "emerald-600" => "#059669", "emerald-700" => "#047857", "emerald-800" => "#065f46", "emerald-900" => "#064e3b", "teal-50" => "#f0fdfa", "teal-100" => "#ccfbf1", "teal-200" => "#99f6e4", "teal-300" => "#5eead4", "teal-400" => "#2dd4bf", "teal-500" => "#14b8a6", "teal-600" => "#0d9488", "teal-700" => "#0f766e", "teal-800" => "#115e59", "teal-900" => "#134e4a", "cyan-50" => "#ecfeff", "cyan-100" => "#cffafe", "cyan-200" => "#a5f3fc", "cyan-300" => "#67e8f9", "cyan-400" => "#22d3ee", "cyan-500" => "#06b6d4", "cyan-600" => "#0891b2", "cyan-700" => "#0e7490", "cyan-800" => "#155e75", "cyan-900" => "#164e63", "sky-50" => "#f0f9ff", "sky-100" => "#e0f2fe", "sky-200" => "#bae6fd", "sky-300" => "#7dd3fc", "sky-400" => "#38bdf8", "sky-500" => "#0ea5e9", "sky-600" => "#0284c7", "sky-700" => "#0369a1", "sky-800" => "#075985", "sky-900" => "#0c4a6e", "blue-50" => "#eff6ff", "blue-100" => "#dbeafe", "blue-200" => "#bfdbfe", "blue-300" => "#93c5fd", "blue-400" => "#60a5fa", "blue-500" => "#3b82f6", "blue-600" => "#2563eb", "blue-700" => "#1d4ed8", "blue-800" => "#1e40af", "blue-900" => "#1e3a8a", "indigo-50" => "#eef2ff", "indigo-100" => "#e0e7ff", "indigo-200" => "#c7d2fe", "indigo-300" => "#a5b4fc", "indigo-400" => "#818cf8", "indigo-500" => "#6366f1", "indigo-600" => "#4f46e5", "indigo-700" => "#4338ca", "indigo-800" => "#3730a3", "indigo-900" => "#312e81", "violet-50" => "#f5f3ff", "violet-100" => "#ede9fe", "violet-200" => "#ddd6fe", "violet-300" => "#c4b5fd", "violet-400" => "#a78bfa", "violet-500" => "#8b5cf6", "violet-600" => "#7c3aed", "violet-700" => "#6d28d9", "violet-800" => "#5b21b6", "violet-900" => "#4c1d95", "purple-50" => "#faf5ff", "purple-100" => "#f3e8ff", "purple-200" => "#e9d5ff", "purple-300" => "#d8b4fe", "purple-400" => "#c084fc", "purple-500" => "#a855f7", "purple-600" => "#9333ea", "purple-700" => "#7e22ce", "purple-800" => "#6b21a8", "purple-900" => "#581c87", "fuchsia-50" => "#fdf4ff", "fuchsia-100" => "#fae8ff", "fuchsia-200" => "#f5d0fe", "fuchsia-300" => "#f0abfc", "fuchsia-400" => "#e879f9", "fuchsia-500" => "#d946ef", "fuchsia-600" => "#c026d3", "fuchsia-700" => "#a21caf", "fuchsia-800" => "#86198f", "fuchsia-900" => "#701a75", "pink-50" => "#fdf2f8", "pink-100" => "#fce7f3", "pink-200" => "#fbcfe8", "pink-300" => "#f9a8d4", "pink-400" => "#f472b6", "pink-500" => "#ec4899", "pink-600" => "#db2777", "pink-700" => "#be185d", "pink-800" => "#9d174d", "pink-900" => "#831843", "rose-50" => "#fff1f2", "rose-100" => "#ffe4e6", "rose-200" => "#fecdd3", "rose-300" => "#fda4af", "rose-400" => "#fb7185", "rose-500" => "#f43f5e", "rose-600" => "#e11d48", "rose-700" => "#be123c", "rose-800" => "#9f1239", "rose-900" => "#881337", }
- SYMBOLS =
(Paint::ANSI_COLORS.keys + Paint::ANSI_EFFECTS.keys).to_set
- DARK_LUMA =
0.36
Class Method Summary collapse
-
.ansi_color_to_hex(num) ⇒ Object
lookup RGB for an ansi fg or bg color.
- .contrast(bg) ⇒ Object
-
.dark?(color) ⇒ Boolean
is this color dark?.
-
.get(color) ⇒ Object
we support a few different kinds of colors.
-
.luma(hex) ⇒ Object
sRGB to Y (relative luminance).
-
.spectrum ⇒ Object
print all colors to $stdout, helps with creating themes.
-
.to_hex(rgb) ⇒ Object
- r,g,b
-
> “#rrggbb”.
-
.to_rgb(hex) ⇒ Object
“#?(rgb|rrggbb|rrrrggggbbbb)” => [r,g,b].
Class Method Details
.ansi_color_to_hex(num) ⇒ Object
lookup RGB for an ansi fg or bg color
480 481 482 483 484 485 486 487 488 |
# File 'lib/table_tennis/util/colors.rb', line 480 def ansi_color_to_hex(num) return if !(0..15).cover?(num) rgb = if num < 8 Paint::RGB_COLORS_ANSI.values[num] else Paint::RGB_COLORS_ANSI_BRIGHT.values[num - 8] end to_hex(rgb) end |
.contrast(bg) ⇒ Object
454 455 456 |
# File 'lib/table_tennis/util/colors.rb', line 454 def contrast(bg) dark?(bg) ? "white" : "black" end |
.dark?(color) ⇒ Boolean
is this color dark?
441 442 443 444 445 446 447 448 449 450 451 452 |
# File 'lib/table_tennis/util/colors.rb', line 441 def dark?(color) color = get(color) return true if !color # take a guess at symbols too if color.is_a?(Symbol) return !%i[white gray].include?(color) end luma = luma(color) !luma || luma < DARK_LUMA end |
.get(color) ⇒ Object
we support a few different kinds of colors
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 |
# File 'lib/table_tennis/util/colors.rb', line 398 def get(color) case color # nil is ok when nil return nil # hex string when /^#?[0-9a-f]{3}([0-9a-f]{3})?$/i return color when Symbol # Paint ansi color or ansi effect if !SYMBOLS.include?(color) puts "warning: TableTennis #{color.inspect} unknown ansi color/effect symbol" return end return color when String if !(hex = NAMED[color.downcase]) puts "warning: TableTennis #{color.inspect} unknown named color string" return end return hex else puts "warning: TableTennis #{color.inspect} unknown color" return end end |
.luma(hex) ⇒ Object
sRGB to Y (relative luminance)
430 431 432 433 434 435 436 |
# File 'lib/table_tennis/util/colors.rb', line 430 def luma(hex) rgb = to_rgb(hex) return if !rgb rgb = rgb.map { _1 / 255.0 } coeff = [0.2126, 0.7152, 0.0722] rgb.zip(coeff).sum { (_1**2.2) * _2 }.round(3) end |
.spectrum ⇒ Object
print all colors to $stdout, helps with creating themes
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 |
# File 'lib/table_tennis/util/colors.rb', line 491 def spectrum max = NAMED.keys.map(&:length).max fmt = " %-#{max}s %s %0.3f " NAMED.each do |name, color| str = sprintf(fmt, name, color, luma(color)) str1 = Paint[str, color, "white"] str2 = Paint[str, color, "black"] str3 = Paint[" white ", "white", color] str4 = Paint[" black ", "black", color] puts "#{str1}#{str2}#{str3}#{str4}" end fmt = " ansi %-6s %-8s " colors = Paint::ANSI_COLORS_FOREGROUND.keys puts colors.each do fg = sprintf(fmt, "normal", _1.inspect) str1 = Paint[fg, _1, :white] str2 = Paint[fg, _1, :black] puts "#{str1}#{str2}" end puts colors.each do str = sprintf(fmt, ":bold", _1.inspect) str1 = Paint[str, _1, :bold, :white] str2 = Paint[str, _1, :bold, :black] puts "#{str1}#{str2}" end puts colors.each do str = sprintf(fmt, ":faint", _1.inspect) str1 = Paint[str, _1, :faint, :white] str2 = Paint[str, _1, :faint, :black] puts "#{str1}#{str2}" end puts colors.each do str1 = Paint[sprintf(" :white on %-8s ", _1.inspect), :white, _1] str2 = Paint[sprintf(" :black on %-8s ", _1.inspect), :black, _1] puts "#{str1}#{str2}" end end |
.to_hex(rgb) ⇒ Object
- r,g,b
-
> “#rrggbb”
460 461 462 |
# File 'lib/table_tennis/util/colors.rb', line 460 def to_hex(rgb) sprintf("#%02x%02x%02x", *rgb) end |
.to_rgb(hex) ⇒ Object
“#?(rgb|rrggbb|rrrrggggbbbb)” => [r,g,b]
465 466 467 468 469 470 471 472 473 474 475 476 477 |
# File 'lib/table_tennis/util/colors.rb', line 465 def to_rgb(hex) if !hex.match(/\A#?([0-9a-f]+)\Z/i) return end hex = $1 case hex.length when 3 then hex.scan(/./).map { "#{_1}#{_1}" } when 6 then hex.scan(/../) when 9 then hex.scan(/.../) when 12 then hex.scan(/..../) else; return end.map { _1[0, 2].to_i(16) } end |