From 152db98f8afec6ee251d1be71152c98f26ed9c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Silva?= Date: Tue, 26 Mar 2019 14:24:58 +0000 Subject: [PATCH] Add script used to generate theme colors Theme colors are originally based on GitHub's theme. This script (slightly) offsets them to match the color pallete of the specified theme automatically, and prints them out. While the adjustments are meant to be minor, color contrast should still be verified. Finally, a few themes should not be automated in this way. For example, the high contrast themes are meant to be purely black & white. --- scripts/color_palette_generator.py | 102 +++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 scripts/color_palette_generator.py diff --git a/scripts/color_palette_generator.py b/scripts/color_palette_generator.py new file mode 100644 index 0000000..5a2f50f --- /dev/null +++ b/scripts/color_palette_generator.py @@ -0,0 +1,102 @@ +#!/usr/bin/python3 +# +# Generates color palettes based on the specified background/foreground colors. +# +# Usage: python color_palette_generator.py #fg_hex #bg_hex light|dark +# +# The light variant is based on GitHub's style, while the dark variant is based on pre-existing UberWriter styles. +# +# Accessibility is not accounted for, so make sure to verify contrast: https://webaim.org/resources/contrastchecker/ + +import operator +import os +import sys + + +def hex_to_tuple(h): + return tuple(int(h.lstrip('#')[i:i + 2], 16) for i in (0, 2, 4)) + + +def tuple_to_hex(t): + (r, g, b) = t + if r < 0 or g < 0 or b < 0 or r > 255 or g > 255 or b > 255: + return '#%02x%02x%02x (clamped)' % tuple(map(lambda x: max(0, min(x, 255)), t)) + else: + return '#%02x%02x%02x' % t + + +def sub_tuples(t1, t2): + return tuple(map(operator.sub, t1, t2)) + + +if __name__ == '__main__': + if len(sys.argv) != 4: + print("Usage: {} foreground_color background_color light|dark\n" + + "Both colors must be in hexadecimal format, eg. #f6f5f4".format(os.path.basename(__file__))) + exit() + + target_foreground_color = hex_to_tuple(sys.argv[1]) + target_background_color = hex_to_tuple(sys.argv[2]) + dark = sys.argv[3] == "dark" + + gh_text_color = hex_to_tuple("#dbdbdb" if dark else "#24292e") + gh_background_color = hex_to_tuple("#353535" if dark else "#ffffff") + gh_alt_background_color = hex_to_tuple("#3a3a3a" if dark else "#f6f8fa") + gh_link_color = hex_to_tuple("#a2c7f8" if dark else "#0366d6") + gh_blockquote_text_color = hex_to_tuple("#959595" if dark else "#6a737d") + gh_blockquote_border_color = hex_to_tuple("#525252" if dark else "#dfe2e5") + gh_header_border_color = hex_to_tuple("#474747" if dark else "#eaecef") + gh_hr_background_color = hex_to_tuple("#505050" if dark else "#e1e4e8") + gh_table_tr_border_color = hex_to_tuple("#696969" if dark else "#c6cbd1") + gh_table_td_border_color = hex_to_tuple("#525252" if dark else "#dfe2e5") + gh_kbd_text_color = hex_to_tuple("#bbbbbb" if dark else "#444d56") + gh_kbd_background_color = hex_to_tuple("#3c3c3c" if dark else "#fafbfc") + gh_kbd_border_color = hex_to_tuple("#696969" if dark else "#c6cbd1") + gh_kbd_shadow_color = hex_to_tuple("#979797" if dark else "#959da5") + + text_color_diff = sub_tuples(gh_text_color, target_foreground_color) + background_color_diff = sub_tuples(gh_background_color, target_background_color) + + text_color = tuple_to_hex(target_foreground_color) + background_color = tuple_to_hex(target_background_color) + alt_background_color = tuple_to_hex(sub_tuples(gh_alt_background_color, background_color_diff)) + link_color = tuple_to_hex(sub_tuples(gh_link_color, text_color_diff)) + blockquote_text_color = tuple_to_hex(sub_tuples(gh_blockquote_text_color, text_color_diff)) + blockquote_border_color = tuple_to_hex(sub_tuples(gh_blockquote_border_color, background_color_diff)) + header_border_color = tuple_to_hex(sub_tuples(gh_header_border_color, background_color_diff)) + hr_background_color = tuple_to_hex(sub_tuples(gh_hr_background_color, background_color_diff)) + table_tr_border_color = tuple_to_hex(sub_tuples(gh_table_tr_border_color, background_color_diff)) + table_td_border_color = tuple_to_hex(sub_tuples(gh_table_td_border_color, background_color_diff)) + kbd_text_color = tuple_to_hex(sub_tuples(gh_kbd_text_color, text_color_diff)) + kbd_background_color = tuple_to_hex(sub_tuples(gh_kbd_background_color, background_color_diff)) + kbd_border_color = tuple_to_hex(sub_tuples(gh_kbd_border_color, background_color_diff)) + kbd_shadow_color = tuple_to_hex(sub_tuples(gh_kbd_shadow_color, background_color_diff)) + + print(("--text-color: {};\n" + + "--background-color: {};\n" + + "--alt-background-color: {};\n" + + "--link-color: {};\n" + + "--blockquote-text-color: {};\n" + + "--blockquote-border-color: {};\n" + + "--header-border-color: {};\n" + + "--hr-background-color: {};\n" + + "--table-tr-border-color: {};\n" + + "--table-td-border-color: {};\n" + + "--kbd-text-color: {};\n" + + "--kbd-background-color: {};\n" + + "--kbd-border-color: {};\n" + + "--kbd-shadow-color: {};\n").format( + text_color, + background_color, + alt_background_color, + link_color, + blockquote_text_color, + blockquote_border_color, + header_border_color, + hr_background_color, + table_tr_border_color, + table_td_border_color, + kbd_text_color, + kbd_background_color, + kbd_border_color, + kbd_shadow_color))